STADLS
playback_generator.h
Go to the documentation of this file.
1 #pragma once
2 #include "hate/nil.h"
3 #include "hate/type_traits.h"
4 #include "hate/visibility.h"
5 #include "stadls/vx/genpybind.h"
6 
7 #if defined(__GENPYBIND__) or defined(__GENPYBIND_GENERATED__)
8 #include <pybind11/pybind11.h>
9 #endif
10 
12 
18 template <typename Builder, typename Result>
20 {
22  Result result;
23 };
24 
25 
32 template <typename Seq>
33 auto generate(Seq const& seq)
34 {
35  static_assert(
36  std::is_same<
37  decltype(std::declval<Seq>().generate()),
39  "Derived class lacks generate() function returning "
40  "PlaybackGeneratorReturn<Seq::Builder, Seq::Result>");
41 
42  return seq.generate();
43 }
44 
45 
46 #if defined(__GENPYBIND__) or defined(__GENPYBIND_GENERATED__)
50 struct SYMBOL_VISIBLE PlaybackGenerator
51 {
52  virtual pybind11::tuple generate() const = 0;
53  virtual ~PlaybackGenerator() = 0;
54 };
55 
56 namespace detail {
57 
58 template <typename T>
59 pybind11::tuple py_generate_impl(T const& seq)
60 {
61  using namespace pybind11::literals;
62  auto const [pbp, res] = ::stadls::vx::generate<T>(seq);
63  if constexpr (std::is_same<hate::remove_all_qualifiers_t<decltype(res)>, hate::Nil>::value) {
64  auto tuple = pybind11::make_tuple<pybind11::return_value_policy::move>(
65  std::move(pbp), pybind11::cast<pybind11::none>(Py_None));
66  return tuple;
67  } else {
68  auto tuple = pybind11::make_tuple<pybind11::return_value_policy::move>(std::move(pbp), res);
69  return tuple;
70  }
71 }
72 
73 } // namespace detail
74 
75 #endif // defined(__GENPYBIND__) or defined(__GENPYBIND_GENERATED__)
76 
77 } // namespace stadls::vx
#define GENPYBIND_TAG_STADLS_VX
Definition: genpybind.h:4
auto generate(Seq const &seq)
Generate function to be called on an object implementing the PlaybackGenerator concept.
BuilderStorage Builder
Return type of generate() call on playback sequence.