16 #include <type_traits>
36 struct wrapped_event :
Event {
40 template<
typename Parent>
42 using final_parent = Parent;
47 typename T::final_parent;
50 template<
typename Parent>
51 struct history_state {
52 using history_parent = Parent;
57 typename T::history_parent;
60 template<
typename Parent>
61 struct deep_history_state {
62 using history_parent = Parent;
67 typename T::history_parent;
68 } && std::same_as<T, deep_history_state<typename T::history_parent>>;
70 struct automatic_event {};
71 struct completion_event {};
85 template<
typename State,
typename Event>
115 template<
typename Fork,
typename... Targets>
118 using targets = type_list<Targets...>;
121 template<
typename ForkMarker,
typename... Targets>
122 using Fork = fork_to<ForkMarker, Targets...>;
124 template<
typename Join,
typename... Sources>
127 using sources = type_list<Sources...>;
130 template<
typename Join,
typename Target>
133 using target = Target;
136 template<
typename JoinMarker,
typename... Sources>
137 using Join = join_from<JoinMarker, Sources...>;
139 template<
typename JoinMarker,
typename Target>
140 using JoinTo = join_to<JoinMarker, Target>;
146 } && fork_like<typename T::fork> && type_list_like<typename T::targets>;
152 } && join_like<typename T::join> && type_list_like<typename T::sources>;
158 } && join_like<typename T::join>;
162 fork_rule_like<T> || join_from_rule_like<T> || join_to_rule_like<T>;
165 struct is_synchronization_rule
166 : std::bool_constant<synchronization_rule_like<T>> {};
180 struct synchronization_of {
181 using type = type_list<>;
185 requires has_synchronization_type_c<T>
186 struct synchronization_of<T> {
188 static_assert(type_list_like<type>,
189 "tsm: synchronization must be tsm::synchronization<...>");
190 static_assert(type_list_traits::all_satisfy<is_synchronization_rule, type>::value,
191 "tsm: synchronization entries must be fork_to, join_from, "
216 template<
typename From,
typename Event,
typename To>
224 template<transition_kind Kind,
typename From,
typename Event,
typename To>
225 struct basic_transition {
232 template<transition_kind Kind,
typename From,
typename Event,
typename To, auto Action>
233 struct transition_with_action : basic_transition<Kind, From, Event, To> {
234 using action_t = decltype(Action);
235 static constexpr action_t action =
Action;
238 template<transition_kind Kind,
typename From,
typename Event,
typename To, auto Guard>
239 struct transition_with_guard : basic_transition<Kind, From, Event, To> {
240 using guard_t = decltype(Guard);
241 static constexpr guard_t guard = Guard;
250 struct transition_with_guard_action : basic_transition<Kind, From, Event, To> {
251 using guard_t = decltype(Guard);
252 using action_t = decltype(Action);
253 static constexpr guard_t guard = Guard;
254 static constexpr action_t action =
Action;
257 template<
typename From,
typename Event,
typename To, auto Action>
259 transition_with_action<transition_kind::external, From, Event, To, Action>;
261 template<
typename From,
typename Event,
typename To, auto Guard>
263 transition_with_guard<transition_kind::external, From, Event, To, Guard>;
265 template<
typename From,
typename Event,
typename To, auto Guard, auto Action>
274 template<
transition_kind Kind,
typename From,
typename Event,
typename To,
auto... Behavior>
280 static constexpr
auto value = Guard;
283 template<auto Action>
286 static constexpr
auto value = Action;
289 template<
typename From,
typename Event,
typename To,
typename... Behavior>
292 template<
typename From,
typename Event,
typename To>
293 struct edge<From, Event, To>
294 : transition<transition_kind::external, From, Event, To>
298 template<
typename From,
typename Event,
typename To, auto Guard>
299 struct edge<From,
Event, To, guard<Guard>>
300 : transition_with_guard<transition_kind::external, From, Event, To, Guard>
304 template<
typename From,
typename Event,
typename To, auto Action>
306 : transition_with_action<transition_kind::external, From, Event, To, Action>
310 template<
typename From,
typename Event,
typename To, auto Guard, auto Action>
311 struct edge<From,
Event, To, guard<Guard>, action<
Action>>
312 : transition_with_guard_action<transition_kind::external,
321 template<
typename From,
typename Event,
typename To, auto Action, auto Guard>
322 struct edge<From,
Event, To, action<
Action>, guard<Guard>>
323 : transition_with_guard_action<transition_kind::external,
332 template<transition_kind Kind,
typename From,
typename Event,
typename To>
333 struct transition<
Kind, From,
Event, To> : basic_transition<Kind, From, Event, To> {};
335 template<transition_kind Kind,
typename From,
typename Event,
typename To, auto Action>
337 : transition_with_action<Kind, From, Event, To, Action> {};
346 : transition_with_guard_action<Kind, From, Event, To, Guard, Action> {};
348 template<
typename From,
typename Event,
typename To,
auto... Behavior>
356 template<
typename From,
typename Event,
typename To>
357 struct T<From,
Event, To>
358 : transition<transition_kind::external, From, Event, To> {};
360 template<
typename From,
typename Event,
typename To, auto Action>
362 : transition<transition_kind::external, From, Event, To, Action> {};
364 template<
typename From,
typename Event,
typename To, auto Action, auto Guard>
366 : transition<transition_kind::external, From, Event, To, Action, Guard> {};
368 template<
typename From,
typename Event,
typename To,
auto... Behavior>
369 struct local : transition<transition_kind::local, From, Event, To, Behavior...> {};
371 template<
typename From,
typename Event,
auto... Behavior>
372 struct internal : transition<transition_kind::internal, From, Event, From, Behavior...> {};
384 template<
typename From,
typename Event,
typename To,
auto... Behavior>
385 struct Internal : transition<transition_kind::local, From, Event, To, Behavior...> {};
387 template<
typename From,
typename Event,
typename To,
auto... Behavior>
389 : transition<transition_kind::reentering_external,
395 struct ClockTickEvent {
402 template<
typename From,
typename To,
auto... Behavior>
403 struct ClockedTransition : T<From, ClockTickEvent, To, Behavior...> {};
410 template<
typename Transition>
412 typename Transition::from;
413 typename Transition::to;
416 template<
typename Transition>
418 typename Transition::event;
421 template<
typename Transition>
422 struct is_transition : std::bool_constant<transition_like<Transition>> {};
424 template<
typename Transition>
429 template<
typename Transition>
434 template<
typename Transition>
436 if constexpr (
requires { Transition::kind; }) {
437 return Transition::kind;
443 template<
typename Transition>
445 get_transition_kind<Transition>();
447 template<
typename Transition,
typename From,
typename Event>
449 transition_like<Transition> &&
450 std::same_as<typename Transition::from, From> &&
451 std::same_as<typename Transition::event, Event>;
460 context.transitions();
469 template<
typename T,
typename =
void>
470 struct transitions_of;
474 struct transitions_of<T> {
479 requires(!has_transition_type_c<T> && has_transition_member_c<T>)
480 struct transitions_of<T> {
482 std::remove_cvref_t<decltype(std::declval<T&>().transitions())>;
490 has_transition_type_c<T> || has_transition_member_c<T>;
498 template<transition_like Transition>
499 struct transition_traits {
500 using from =
typename Transition::from;
501 using event =
typename Transition::event;
502 using to =
typename Transition::to;
504 static constexpr
bool has_guard = transition_has_guard<Transition>;
505 static constexpr
bool has_action = transition_has_action<Transition>;
506 static constexpr
auto kind = transition_kind_v<Transition>;
508 template<
typename From,
typename Event,
typename To>
509 static consteval
auto with_endpoints_type() {
510 if constexpr (has_guard && has_action) {
511 return std::type_identity<
512 transition_with_guard_action<kind,
517 Transition::action>>{};
518 }
else if constexpr (has_guard) {
519 return std::type_identity<
520 transition_with_guard<kind, From, Event, To, Transition::guard>>{};
521 }
else if constexpr (has_action) {
522 return std::type_identity<
523 transition_with_action<kind, From, Event, To, Transition::action>>{};
525 return std::type_identity<transition<kind, From, Event, To>>{};
529 template<
typename From,
typename Event,
typename To>
530 using with_endpoints =
531 typename decltype(with_endpoints_type<From, Event, To>())::type;
concept transition_matches
Definition: transition.h:448
concept defer_like
Definition: transition.h:110
concept has_transition_member_c
Definition: transition.h:459
constexpr transition_kind transition_kind_v
Definition: transition.h:444
concept synchronization_rule_like
Definition: transition.h:161
fork_to< ForkMarker, Targets... > Fork
Definition: transition.h:122
concept history_state_like
Definition: transition.h:56
concept transition_edge_like
Definition: transition.h:411
transition_kind
Definition: transition.h:195
concept choice_like
Definition: transition.h:92
requires(!has_transition_type_c< T > &&has_transition_member_c< T >) struct transitions_of< T >
Definition: transition.h:479
concept join_to_rule_like
Definition: transition.h:155
concept transition_has_guard
Definition: transition.h:425
concept final_state_like
Definition: transition.h:46
concept fork_rule_like
Definition: transition.h:143
concept deep_history_state_like
Definition: transition.h:66
concept decision_pseudostate_like
Definition: transition.h:98
transition_with_guard< transition_kind::external, From, Event, To, Guard > with_guard
Definition: transition.h:263
concept join_from_rule_like
Definition: transition.h:149
concept join_like
Definition: transition.h:107
concept has_transition_type_c
Definition: transition.h:454
join_to< JoinMarker, Target > JoinTo
Definition: transition.h:140
concept transition_like
Definition: transition.h:417
concept junction_like
Definition: transition.h:95
transition_with_action< transition_kind::external, From, Event, To, Action > with_action
Definition: transition.h:259
concept region_like
Definition: transition.h:101
concept has_transitions_c
Definition: transition.h:489
concept transition_has_action
Definition: transition.h:430
typename transitions_of< T >::type transitions_of_t
Definition: transition.h:486
consteval transition_kind get_transition_kind()
Definition: transition.h:435
join_from< JoinMarker, Sources... > Join
Definition: transition.h:137
concept has_synchronization_type_c
Definition: transition.h:175
concept fork_like
Definition: transition.h:104
transition_with_guard_action< transition_kind::external, From, Event, To, Guard, Action > with_guard_action
Definition: transition.h:272
Kind
Definition: logging.h:25
consteval auto transitions(TransitionEntries...)
Definition: tsm.h:2448
detail::type_list< Rules... > synchronization
Definition: tsm.h:2439
Small compile-time list and set utilities for C++ type tokens.