fsm
state_machine.h
1 
12 #pragma once
13 
14 #include "detail/state_manager.h"
15 #include "contexts.h"
16 
17 namespace escad
18 {
19 
20 template<class States, class Events, class Context, class Tracer = detail::NullTracer>
22 public:
23  using context_type = Context;
24  using states_type = States;
25  using events_type = Events;
26  using tracer_type = Tracer;
27 
34  template<
35  class T = Context,
36  std::enable_if_t<std::is_constructible_v<T>, bool> = true>
38  : context_ {}
39  , manager_ {context_, tracer_}
40  {
41  }
42 
49  template<
50  class T = Context,
51  // enable this constructor only if Context is an lvalue ref
52  std::enable_if_t<std::is_lvalue_reference_v<T>, bool> = true>
54  : context_ {ctx}
55  , manager_ {context_, tracer_}
56  {
57  }
58 
59  template<
60  class T = Context,
61  // enable this constructor only if Context is an rvalue ref
62  std::enable_if_t<!std::is_lvalue_reference_v<T>, bool> = true>
63  state_machine(Context&& ctx)
64  : context_ {std::move(ctx)}
65  , manager_ {context_, tracer_}
66  {
67  }
68 
75  template<class S, class E, class C>
76  state_machine(S, E, C&& ctx)
77  : context_ {std::forward<C>(ctx)}
78  , manager_ {context_, tracer_}
79  {
80  }
81 
85  state_machine(States, Events, Context& ctx, Tracer&& tracer)
86  : context_ {ctx}
87  , tracer_ {std::move(tracer)}
88  , manager_ {context_, tracer}
89  {
90  }
91 
96  template<class E>
97  auto dispatch(E const& e) {
98  return manager_.dispatch(e);
99  }
100 
104  template<class E>
105  auto dispatch(E const& e) const {
106  return manager_.dispatch(e);
107  }
108 
112  auto& tracer() {
113  return tracer_;
114  }
115 
119  auto const& tracer() const {
120  return tracer_;
121  }
122 
126  auto& context() {
127  return context_;
128  }
129 
133  auto const& context() const {
134  return context_;
135  }
136 
137 private:
138  Context context_;
139  Tracer tracer_;
141  States,
142  std::remove_reference_t<Context>,
143  Tracer> manager_;
144 };
145 
146 template<class S, class E, class C> state_machine(S, E, C&) -> state_machine<S, E, C&>;
147 template<class S, class E, class C> state_machine(S, E, C&&) -> state_machine<S, E, C>;
148 
149 } // namespace fsm
auto & tracer()
Gets a reference to a tracer object.
Definition: state_machine.h:112
auto const & context() const
Gets a reference to a context.
Definition: state_machine.h:133
Definition: testJsonContexts.cpp:18
Manages a set of state, creates, destroys and pass events to a proper state.
Definition: state_manager.h:42
Definition: state_machine.h:21
auto & context()
Gets a reference to a context.
Definition: state_machine.h:126
state_machine(Context &ctx)
Creates a state machine with a reference to a context.
Definition: state_machine.h:53
auto const & tracer() const
Gets a reference to a tracer object.
Definition: state_machine.h:119
Definition: compressed_pair.h:10
auto dispatch(E const &e)
Dispatch an event to a current state.
Definition: state_machine.h:97
state_machine()
Creates a state machine.
Definition: state_machine.h:37
state_machine(States, Events, Context &ctx, Tracer &&tracer)
Creates a state machine with a context and a tracer.
Definition: state_machine.h:85
state_machine(S, E, C &&ctx)
Creates a state machine with a context.
Definition: state_machine.h:76
auto dispatch(E const &e) const
Dispatch an event to a current state.
Definition: state_machine.h:105