fsm
substate_manager_container.h
Go to the documentation of this file.
1 
12 #pragma once
13 
14 #include "../../base/type_traits.h"
15 #include <variant>
16 
17 namespace escad::detail
18 {
19 
24 template<class States, template<typename> typename Manager>
26 public:
32  template<class State, class... Args>
33  void create(Args&... args) {
34  constexpr auto Index = mpl::type_list_index_v<State, type_list>;
35  managers_.template emplace<1 + Index>(args...);
36  }
37 
41  template<class Fun>
42  void visit(Fun&& fun) {
43  std::visit(std::forward<Fun>(fun), managers_);
44  }
45 
46 private:
47  // a list of states: type_list<A, B, C...>;
48  using type_list = typename States::type_list;
49 
50  // meta-function extracting substate_type from a state
51  // substate_type is a states<SubA1, SubA2, SubA3...> specialization
52  template<class T> struct get_substate_manager_type {
53  using type = Manager<typename T::substates_type>;
54  };
55 
56  // use this meta-function to transform a list of states to a list of its substate managers in form of:
57  // type_list<state_manager<states<SubA1, SubA2, SubA3...>>, state_manager<states<SubB1, SubB2, SubB3...>>...>
58  using substates_manager_list = mpl::type_list_transform_t<type_list, get_substate_manager_type>;
59 
60  // prepend with monostate for default construction
61  using substates_manager_list_fin = typename mpl::type_list_push_front<substates_manager_list, std::monostate>::result;
62 
63  // rename type_list<...> to std::variant<...> which will be the final storage type
64  using substates_manager_variant = typename mpl::type_list_rename<
65  substates_manager_list_fin,
66  std::variant>::result;
67 
68  substates_manager_variant managers_;
69 };
70 
71 } // namespace fsm::detail
void visit(Fun &&fun)
Visit current state_manager with a given visitor.
Definition: substate_manager_container.h:42
void create(Args &... args)
Create a new substate manager for a given state.
Definition: substate_manager_container.h:33
Append a type at the begining of the type_list.
Definition: type_traits.h:405
Definition: handle_result.h:14
Similarly to state_container this class is abstracting out the real storage mechanism for substates s...
Definition: substate_manager_container.h:25
reanme typelist
Definition: type_traits.h:393