22 #include <type_traits> 24 #include "../base/type_traits.h" 71 template <
typename Target,
typename =
void>
79 template <
typename Target>
81 std::void_t<decltype(std::declval<Target>().onEnter())>>
100 template <
typename Target,
typename Event,
typename =
void>
111 template <
typename Target,
typename Event>
113 std::void_t<decltype(std::declval<Target>().onEnter(
114 std::declval<Event>()))>> : std::true_type {};
123 template <
class T,
class E>
124 inline constexpr
bool has_onEnterWithEvent_v =
127 template <
typename Target,
typename =
void>
130 template <
typename Target>
132 std::void_t<decltype(std::declval<Target>().onExit())>>
146 template <
typename Target,
typename Event,
typename =
void>
157 template <
typename Target,
typename Event>
160 std::void_t<decltype(std::declval<Target>().transitionTo(
161 std::declval<Event>()))>> : std::true_type {};
170 template <
class T,
class E>
173 template <
typename Target,
typename =
void>
176 template <
typename Target>
179 std::void_t<decltype(std::declval<Target>().transitionInternalTo())>>
183 inline constexpr
bool has_transitionInternalTo_v =
193 static constexpr
auto count = type_list::size;
202 template <
class Derived,
class Context = detail::NoContext>
struct state {
216 template <
class Target = Derived,
class Event>
218 if constexpr (detail::has_onEnterWithEvent_v<Target, Event>) {
219 static_cast<Target *
>(
this)->onEnter(event);
233 template <
class Target = Derived>
bool enter() {
234 if constexpr (detail::has_onEnter_v<Target>) {
235 static_cast<Target *
>(
this)->onEnter();
241 template <
class Target = Derived>
bool exit() {
242 if constexpr (detail::has_onExit_v<Target>) {
243 static_cast<Target *
>(
this)->doRun();
257 template <
class Target = Derived,
class Event>
259 -> decltype(std::declval<Target>().transitionTo(
event)) {
260 if constexpr (detail::has_transitionTo_v<Target, Event>) {
261 return static_cast<Target *
>(
this)->transitionTo(
event);
272 template <
class Target = Derived>
283 template <
class Target = Derived>
285 -> decltype(std::declval<Target>().transitionInternalTo()) {
286 if constexpr (detail::has_transitionInternalTo_v<Target>) {
287 return static_cast<Target *
>(
this)->transitionInternalTo();
297 template <
class Event>
bool dispatch(
const Event &) {
return false; }
299 const Context &context() {
return context_; }
Defines the transitions class and related helper functions.
Definition: testJsonContexts.cpp:18
auto transition(...) -> transitions< detail::none >
For non-existing transitionTo() methods.
Definition: state.h:273
Tag type indicating no transition.
Definition: transition.h:24
auto transition(const Event &event) -> decltype(std::declval< Target >().transitionTo(event))
Calls transitionTo(const Event &event) of Derived if it exists.
Definition: state.h:258
Definition: compressed_pair.h:255
Class representing a collection of transitions.
Definition: transition.h:50
bool enter(const Event &event)
Calls onEnter(const Event &event) of Derived if it exists.
Definition: state.h:217
Base class for an event.
Definition: states.h:31
Default case of helper for detecting if type Target has a onEnter(const Event &) method.
Definition: state.h:101
auto transitionInternal() -> decltype(std::declval< Target >().transitionInternalTo())
Calls transitionInternalTo() of Derived if it exists.
Definition: state.h:284
Default case of helper for detecting if type Target has a onEnter() method.
Definition: state.h:72
state is a CRTP base class for states.
Definition: state.h:202
bool enter()
Calls onEnter() of Derived if it exists.
Definition: state.h:233
Defines a set of states.
Definition: state.h:191
Definition: compressed_pair.h:10
Alias template to facilitate the creation of named values.
Definition: type_traits.h:142
Context & context_
Reference to the Context.
Definition: state.h:305
Default case of helper for detecting if type Target has a transitionTo(const Event &) method...
Definition: state.h:147