tin  1.5.9
core_algorithms.h
Go to the documentation of this file.
1 // Copyright (c) 2026 Tinverse LLC. All rights reserved.
2 // SPDX-License-Identifier: LicenseRef-Tinverse-Commercial
3 
12 
13 #pragma once
14 
15 #include <array>
16 #include <cstddef>
17 #include <cstdint>
18 #include <type_traits>
19 
20 #include "tsm/transition.h"
21 #include "tsm/type_list.h"
22 
23 namespace tsm::core {
24 
31 inline constexpr std::uint16_t npos = 0xFFFFU;
32 
49 template<std::size_t Capacity>
50 struct static_path {
51  std::array<std::uint16_t, Capacity> values{};
52  std::size_t size{};
53 
54  constexpr void push_back(std::uint16_t value) {
55  if (size < Capacity) {
56  values[size++] = value;
57  }
58  }
59 
60  [[nodiscard]] constexpr std::uint16_t operator[](std::size_t index) const {
61  return values[index];
62  }
63 
64  [[nodiscard]] constexpr bool contains(std::uint16_t value) const {
65  for (std::size_t i = 0; i < size; ++i) {
66  if (values[i] == value) {
67  return true;
68  }
69  }
70  return false;
71  }
72 
73  [[nodiscard]] constexpr static_path reversed() const {
74  static_path result{};
75  for (std::size_t i = 0; i < size; ++i) {
76  result.push_back(values[size - 1U - i]);
77  }
78  return result;
79  }
80 
81  [[nodiscard]] constexpr bool operator==(static_path const& other) const {
82  if (size != other.size) {
83  return false;
84  }
85  for (std::size_t i = 0; i < size; ++i) {
86  if (values[i] != other.values[i]) {
87  return false;
88  }
89  }
90  return true;
91  }
92 };
93 
119 template<typename T, typename... Ts>
120 consteval std::size_t index_in_pack() {
121  constexpr std::array<bool, sizeof...(Ts)> matches{
122  std::is_same_v<T, Ts>...
123  };
124  for (std::size_t i = 0; i < matches.size(); ++i) {
125  if (matches[i]) {
126  return i;
127  }
128  }
129  return static_cast<std::size_t>(-1);
130 }
131 
136 template<typename T, typename... Ts>
137 consteval bool contains_type() {
138  return (std::is_same_v<T, Ts> || ...);
139 }
140 
152 template<typename List>
153 struct type_set;
154 
155 template<typename... Ts>
156 struct type_set<tsm::detail::type_list<Ts...>> {
157  static constexpr std::size_t size = sizeof...(Ts);
158 
159  template<typename T>
160  static consteval std::uint16_t index() {
161  constexpr auto value = index_in_pack<T, Ts...>();
162  static_assert(value != static_cast<std::size_t>(-1),
163  "tsm: type is not in this type_set");
164  return static_cast<std::uint16_t>(value);
165  }
166 
167  template<typename T>
168  static consteval bool contains() {
169  return contains_type<T, Ts...>();
170  }
171 };
172 
173 template<typename TransitionList>
175  tsm::detail::type_list_like<TransitionList> &&
176  tsm::detail::type_list_traits::all_satisfy<
177  tsm::detail::is_transition,
178  TransitionList>::value;
179 
180 template<transition_list_like TransitionList>
182 
189 
200 template<typename Transition>
202  using type =
203  tsm::detail::type_list<typename Transition::from, typename Transition::to>;
204 };
205 
206 template<typename TransitionList>
207 struct get_states;
208 
209 template<tsm::detail::transition_edge_like... TransitionEntries>
210 struct get_states<tsm::detail::type_list<TransitionEntries...>> {
211  using type = typename tsm::detail::unique_tuple<
214  tsm::detail::type_list<>>::type;
215 };
216 
217 template<typename TransitionList>
219 
220 template<typename TransitionList>
221 struct get_events;
222 
223 template<tsm::detail::transition_edge_like... TransitionEntries>
224 struct get_events<tsm::detail::type_list<TransitionEntries...>> {
225  using type = typename tsm::detail::unique_tuple<
226  tsm::detail::type_list<typename TransitionEntries::event...>,
227  tsm::detail::type_list<>>::type;
228 };
229 
230 template<typename TransitionList>
232 
233 template<typename From, typename Event, typename Transition>
234 inline constexpr bool same_trigger_v =
235  std::is_same_v<typename Transition::from, From> &&
236  std::is_same_v<typename Transition::event, Event>;
237 
238 template<typename From, typename Event, typename... TransitionEntries>
239 consteval std::size_t trigger_count() {
240  return (std::size_t{ 0 } + ... +
241  (same_trigger_v<From, Event, TransitionEntries>
242  ? std::size_t{ 1 }
243  : std::size_t{ 0 }));
244 }
245 
246 template<typename From, typename Event, typename... TransitionEntries>
247 consteval bool duplicate_group_is_guarded() {
248  return ((same_trigger_v<From, Event, TransitionEntries>
249  ? tsm::detail::transition_has_guard<TransitionEntries>
250  : true) &&
251  ...);
252 }
253 
254 template<typename From, typename Event, typename... TransitionEntries>
255 consteval std::size_t duplicate_group_unguarded_count() {
256  return (std::size_t{ 0 } + ... +
257  (same_trigger_v<From, Event, TransitionEntries> &&
258  !tsm::detail::transition_has_guard<TransitionEntries>
259  ? std::size_t{ 1 }
260  : std::size_t{ 0 }));
261 }
262 
263 template<typename From, typename Event, typename... TransitionEntries>
264 consteval bool trigger_group_is_valid() {
265  constexpr auto count = trigger_count<From, Event, TransitionEntries...>();
266  if constexpr (count <= 1U) {
267  return true;
268  } else if constexpr (tsm::detail::decision_pseudostate_like<From> &&
269  std::is_same_v<Event, tsm::detail::automatic_event>) {
271  Event,
272  TransitionEntries...>() <= 1U;
273  } else {
274  return duplicate_group_is_guarded<From, Event, TransitionEntries...>();
275  }
276 }
277 
288 template<typename... TransitionEntries>
290  return (trigger_group_is_valid<typename TransitionEntries::from,
291  typename TransitionEntries::event,
292  TransitionEntries...>() &&
293  ...);
294 }
295 
323 template<tsm::detail::transition_like... TransitionEntries>
324 struct transition_table<tsm::detail::type_list<TransitionEntries...>> {
325  using list = tsm::detail::type_list<TransitionEntries...>;
326  using states = get_states_t<list>;
327  using events = get_events_t<list>;
328  using state_set = type_set<states>;
329  using event_set = type_set<events>;
330 
331  static constexpr std::size_t transition_count = sizeof...(TransitionEntries);
332  static constexpr std::size_t state_count = state_set::size;
333  static constexpr bool valid_triggers =
334  transition_triggers_are_valid<TransitionEntries...>();
335 
336  template<typename State>
337  static consteval std::uint16_t state_index() {
338  return state_set::template index<State>();
339  }
340 
341  template<typename Event>
342  static consteval std::uint16_t event_index() {
343  if constexpr (event_set::template contains<Event>()) {
344  return event_set::template index<Event>();
345  } else {
346  return npos;
347  }
348  }
349 
350  template<typename Transition>
351  static consteval std::uint16_t transition_type_index() {
352  constexpr std::array<bool, sizeof...(TransitionEntries)> matches{
353  std::is_same_v<Transition, TransitionEntries>...
354  };
355  for (std::size_t i = 0; i < matches.size(); ++i) {
356  if (matches[i]) {
357  return static_cast<std::uint16_t>(i);
358  }
359  }
360  return npos;
361  }
362 
363  template<typename From, typename Event>
364  static consteval bool has_transition() {
365  return ((std::is_same_v<typename TransitionEntries::from, From> &&
366  std::is_same_v<typename TransitionEntries::event, Event>) ||
367  ...);
368  }
369 
370  template<typename From, typename Event>
371  static consteval std::uint16_t transition_index() {
372  constexpr std::array<bool, sizeof...(TransitionEntries)> matches{
373  (std::is_same_v<typename TransitionEntries::from, From> &&
374  std::is_same_v<typename TransitionEntries::event, Event>)...
375  };
376  for (std::size_t i = 0; i < matches.size(); ++i) {
377  if (matches[i]) {
378  return static_cast<std::uint16_t>(i);
379  }
380  }
381  return npos;
382  }
383 };
384 
388 template<typename Child, typename Parent>
389 struct parent {
390  using child = Child;
391  using parent_state = Parent;
392 };
393 
400 template<typename Composite, typename Initial>
402  using composite = Composite;
403  using initial = Initial;
404 };
405 
406 template<typename ParentList>
408 
409 template<typename... Parents>
410 struct parent_map_from_list<tsm::detail::type_list<Parents...>> {
411  using type = tsm::detail::type_map<
412  tsm::detail::type_map_entry<typename Parents::child,
413  typename Parents::parent_state>...>;
414 };
415 
416 template<typename ParentList>
418 
419 template<typename InitialChildList>
421 
422 template<typename... InitialChildren>
423 struct initial_child_map_from_list<tsm::detail::type_list<InitialChildren...>> {
424  using type = tsm::detail::type_map<
425  tsm::detail::type_map_entry<typename InitialChildren::composite,
426  typename InitialChildren::initial>...>;
427 };
428 
429 template<typename InitialChildList>
432 
433 template<typename Root, typename States, typename Parents, typename InitialChildren>
434 struct hierarchy;
435 
436 template<typename Context, typename Root = Context>
437 struct infer_hierarchy;
438 
439 namespace detail {
440 
441 template<typename Context>
442 struct inferred_root {};
443 
444 } // namespace detail
445 
446 template<typename Context, typename Root = detail::inferred_root<Context>>
448 
471 template<typename Root,
472  typename... States,
473  typename... Parents,
474  typename... InitialChildren>
475 struct hierarchy<Root,
476  tsm::detail::type_list<States...>,
477  tsm::detail::type_list<Parents...>,
478  tsm::detail::type_list<InitialChildren...>> {
479  using states = tsm::detail::type_list<States...>;
480  using state_set = type_set<tsm::detail::type_list<States...>>;
481  static constexpr std::size_t state_count = sizeof...(States);
482  static constexpr std::size_t max_depth = state_count;
483 
490  template<typename State>
491  static consteval std::uint16_t state_index() {
492  return state_set::template index<State>();
493  }
494 
503  template<typename State>
504  static consteval std::uint16_t parent_index() {
505  constexpr std::array<bool, sizeof...(Parents)> matches{
506  std::is_same_v<State, typename Parents::child>...
507  };
508  constexpr std::array<std::uint16_t, sizeof...(Parents)> parent_ids{
509  state_index<typename Parents::parent_state>()...
510  };
511  for (std::size_t i = 0; i < matches.size(); ++i) {
512  if (matches[i]) {
513  return parent_ids[i];
514  }
515  }
516  return npos;
517  }
518 
528  template<typename State>
529  static consteval std::uint16_t initial_child_index() {
530  constexpr std::array<bool, sizeof...(InitialChildren)> matches{
531  std::is_same_v<State, typename InitialChildren::composite>...
532  };
533  constexpr std::array<std::uint16_t, sizeof...(InitialChildren)> child_ids{
534  state_index<typename InitialChildren::initial>()...
535  };
536  for (std::size_t i = 0; i < matches.size(); ++i) {
537  if (matches[i]) {
538  return child_ids[i];
539  }
540  }
541  return npos;
542  }
543 
547  [[nodiscard]] static constexpr std::uint16_t parent_index(
548  std::uint16_t state) {
549  constexpr std::array<std::uint16_t, state_count> parents{
550  parent_index<States>()...
551  };
552  return state < parents.size() ? parents[state] : npos;
553  }
554 
558  [[nodiscard]] static constexpr std::uint16_t initial_child_index(
559  std::uint16_t state) {
560  constexpr std::array<std::uint16_t, state_count> initial_children{
561  initial_child_index<States>()...
562  };
563  return state < initial_children.size() ? initial_children[state] : npos;
564  }
565 
578  [[nodiscard]] static constexpr static_path<max_depth> ancestors(
579  std::uint16_t state) {
580  static_path<max_depth> result{};
581  auto current = parent_index(state);
582  while (current != npos) {
583  result.push_back(current);
584  current = parent_index(current);
585  }
586  return result;
587  }
588 
601  [[nodiscard]] static constexpr static_path<max_depth> path_from_root(
602  std::uint16_t state) {
603  static_path<max_depth> leaf_to_root{};
604  leaf_to_root.push_back(state);
605  auto parent = parent_index(state);
606  while (parent != npos) {
607  leaf_to_root.push_back(parent);
608  parent = parent_index(parent);
609  }
610  return leaf_to_root.reversed();
611  }
612 
630  [[nodiscard]] static constexpr std::uint16_t least_common_ancestor(
631  std::uint16_t a,
632  std::uint16_t b) {
633  static_path<max_depth> a_path{};
634  a_path.push_back(a);
635  auto parent = parent_index(a);
636  while (parent != npos) {
637  a_path.push_back(parent);
638  parent = parent_index(parent);
639  }
640 
641  auto current = b;
642  while (current != npos) {
643  if (a_path.contains(current)) {
644  return current;
645  }
646  current = parent_index(current);
647  }
648  return npos;
649  }
650 
661  [[nodiscard]] static constexpr static_path<max_depth> states_from_leaf_up_to(
662  std::uint16_t source,
663  std::uint16_t stop) {
664  static_path<max_depth> result{};
665  auto current = source;
666  while (current != npos && current != stop) {
667  result.push_back(current);
668  current = parent_index(current);
669  }
670  return result;
671  }
672 
682  [[nodiscard]] static constexpr static_path<max_depth> states_from_lca_down_to(
683  std::uint16_t lca,
684  std::uint16_t destination) {
685  return states_from_leaf_up_to(destination, lca).reversed();
686  }
687 
700  [[nodiscard]] static constexpr static_path<max_depth> enter_initial_children(
701  std::uint16_t state) {
702  static_path<max_depth> result{};
703  auto current = initial_child_index(state);
704  while (current != npos) {
705  result.push_back(current);
706  current = initial_child_index(current);
707  }
708  return result;
709  }
710 };
711 
743 template<std::size_t Capacity>
745  std::uint16_t destination{ npos };
746  std::uint16_t lca{ npos };
750 };
751 
768 template<typename Hierarchy>
769 [[nodiscard]] constexpr auto compute_transition_sequence(
770  std::uint16_t source,
771  std::uint16_t destination) {
773  sequence.destination = destination;
774  sequence.lca = Hierarchy::least_common_ancestor(source, destination);
775  if (sequence.lca == npos) {
776  return sequence;
777  }
778 
779  sequence.exits = Hierarchy::states_from_leaf_up_to(source, sequence.lca);
780  auto direct_entries =
781  Hierarchy::states_from_lca_down_to(sequence.lca, destination);
782  for (std::size_t i = 0; i < direct_entries.size; ++i) {
783  sequence.entries.push_back(direct_entries[i]);
784  }
785 
786  auto initial_entries = Hierarchy::enter_initial_children(destination);
787  for (std::size_t i = 0; i < initial_entries.size; ++i) {
788  sequence.entries.push_back(initial_entries[i]);
789  }
790 
791  auto prefix = Hierarchy::path_from_root(sequence.lca);
792  for (std::size_t i = 0; i < prefix.size; ++i) {
793  sequence.final_path.push_back(prefix[i]);
794  }
795  for (std::size_t i = 0; i < sequence.entries.size; ++i) {
796  sequence.final_path.push_back(sequence.entries[i]);
797  }
798  return sequence;
799 }
800 
801 template<typename Hierarchy>
802 [[nodiscard]] constexpr auto compute_local_transition_sequence(
803  std::uint16_t active_leaf,
804  std::uint16_t selected_source,
805  std::uint16_t destination) {
807  sequence.destination = destination;
808  sequence.lca = selected_source;
809 
810  if (Hierarchy::least_common_ancestor(active_leaf, selected_source) !=
811  selected_source) {
812  sequence.lca = npos;
813  return sequence;
814  }
815  if (Hierarchy::least_common_ancestor(selected_source, destination) !=
816  selected_source) {
817  sequence.lca = npos;
818  return sequence;
819  }
820 
821  sequence.exits =
822  Hierarchy::states_from_leaf_up_to(active_leaf, selected_source);
823 
824  auto direct_entries =
825  Hierarchy::states_from_lca_down_to(selected_source, destination);
826  for (std::size_t i = 0; i < direct_entries.size; ++i) {
827  sequence.entries.push_back(direct_entries[i]);
828  }
829 
830  auto initial_entries = Hierarchy::enter_initial_children(destination);
831  for (std::size_t i = 0; i < initial_entries.size; ++i) {
832  sequence.entries.push_back(initial_entries[i]);
833  }
834 
835  auto prefix = Hierarchy::path_from_root(selected_source);
836  for (std::size_t i = 0; i < prefix.size; ++i) {
837  sequence.final_path.push_back(prefix[i]);
838  }
839  for (std::size_t i = 0; i < sequence.entries.size; ++i) {
840  sequence.final_path.push_back(sequence.entries[i]);
841  }
842  return sequence;
843 }
844 
858 template<typename Hierarchy>
859 [[nodiscard]] constexpr auto compute_reentering_transition_sequence(
860  std::uint16_t active_leaf,
861  std::uint16_t selected_source,
862  std::uint16_t destination) {
864  sequence.destination = destination;
865 
866  if (Hierarchy::least_common_ancestor(active_leaf, selected_source) !=
867  selected_source) {
868  return sequence;
869  }
870 
871  const auto parent = Hierarchy::parent_index(selected_source);
872  sequence.lca = parent == npos ? selected_source : parent;
873 
874  if (Hierarchy::least_common_ancestor(sequence.lca, destination) !=
875  sequence.lca) {
876  sequence.lca = npos;
877  return sequence;
878  }
879 
880  sequence.exits = Hierarchy::states_from_leaf_up_to(active_leaf, sequence.lca);
881 
882  auto direct_entries =
883  Hierarchy::states_from_lca_down_to(sequence.lca, destination);
884  for (std::size_t i = 0; i < direct_entries.size; ++i) {
885  sequence.entries.push_back(direct_entries[i]);
886  }
887 
888  auto initial_entries = Hierarchy::enter_initial_children(destination);
889  for (std::size_t i = 0; i < initial_entries.size; ++i) {
890  sequence.entries.push_back(initial_entries[i]);
891  }
892 
893  auto prefix = Hierarchy::path_from_root(sequence.lca);
894  for (std::size_t i = 0; i < prefix.size; ++i) {
895  sequence.final_path.push_back(prefix[i]);
896  }
897  for (std::size_t i = 0; i < sequence.entries.size; ++i) {
898  sequence.final_path.push_back(sequence.entries[i]);
899  }
900  return sequence;
901 }
902 
903 namespace detail {
904 
918 template<typename Context>
922 };
923 
924 template<typename Context>
927 
928 template<typename Context>
930 
931 template<typename Context>
932 using direct_state_set_t = tsm::detail::type_set<direct_states_t<Context>>;
933 
934 template<typename State, typename Parent, bool IsComposite>
936  using type = tsm::detail::type_list<>;
937 };
938 
939 template<typename State, typename Parent>
940 struct nested_states_for_state<State, Parent, true> {
942 };
943 
944 template<typename DirectStates, typename Parent>
946 
947 template<typename Parent, typename... States>
948 struct nested_states_for_list<tsm::detail::type_list<States...>, Parent> {
950  typename nested_states_for_state<States,
951  Parent,
952  tsm::detail::has_transitions_c<States>>::type...>;
953 };
954 
955 template<typename State, bool IsComposite>
957  using type = tsm::detail::type_list<>;
958 };
959 
960 template<typename State>
961 struct nested_transitions_for_state<State, true> {
963 };
964 
965 template<typename DirectStates>
967 
968 template<typename... States>
969 struct nested_transitions_for_list<tsm::detail::type_list<States...>> {
971  typename nested_transitions_for_state<States,
972  tsm::detail::has_transitions_c<States>>::type...>;
973 };
974 
975 template<typename State, typename Parent, bool IsFinal, bool IsHistory>
977  using type = Parent;
978 };
979 
980 template<typename State, typename Parent>
981 struct inferred_parent_for_state<State, Parent, true, false> {
982  using type = typename State::final_parent;
983 };
984 
985 template<typename State, typename Parent>
986 struct inferred_parent_for_state<State, Parent, false, true> {
987  using type = typename State::history_parent;
988 };
989 
990 template<typename State, typename Parent, bool IsComposite>
993  typename inferred_parent_for_state<
994  State,
995  Parent,
996  tsm::detail::final_state_like<State>,
997  tsm::detail::history_state_like<State>>::type;
998  using type = tsm::detail::type_list<parent<State, inferred_parent>>;
999 };
1000 
1001 template<typename State, typename Parent>
1002 struct parent_edges_for_state<State, Parent, true> {
1004  using type =
1006  nested>;
1007 };
1008 
1009 template<typename DirectStates, typename Parent>
1011 
1012 template<typename Parent, typename... States>
1013 struct parent_edges_for_list<tsm::detail::type_list<States...>, Parent> {
1014  using type = tsm::detail::concat_type_lists_t<
1015  typename parent_edges_for_state<States,
1016  Parent,
1017  tsm::detail::has_transitions_c<States>>::type...>;
1018 };
1019 
1020 template<typename State, bool IsComposite>
1022  using type = tsm::detail::type_list<>;
1023 };
1024 
1025 template<typename State>
1026 struct initial_edges_for_state<State, true> {
1028  using type =
1029  tsm::detail::concat_type_lists_t<tsm::detail::type_list<
1030  initial_child<State,
1031  typename nested::initial>>,
1032  typename nested::initial_children>;
1033 };
1034 
1035 template<typename DirectStates>
1037 
1038 template<typename... States>
1039 struct initial_edges_for_list<tsm::detail::type_list<States...>> {
1040  using type = tsm::detail::concat_type_lists_t<
1041  typename initial_edges_for_state<States,
1042  tsm::detail::has_transitions_c<States>>::type...>;
1043 };
1044 
1045 template<typename State, bool IsComposite>
1047  using type = tsm::detail::type_list<State>;
1048 };
1049 
1050 template<typename State>
1051 struct local_leaf_states_for_state<State, true> {
1053 };
1054 
1055 template<typename DirectStates>
1057 
1058 template<typename... States>
1059 struct local_leaf_states_for_list<tsm::detail::type_list<States...>> {
1060  using type = tsm::detail::concat_type_lists_t<
1061  typename local_leaf_states_for_state<States,
1062  tsm::detail::has_transitions_c<States>>::type...>;
1063 };
1064 
1065 } // namespace detail
1066 
1067 template<typename Context, typename Root>
1073 
1077 
1080  using states =
1081  typename tsm::detail::unique_tuple<
1083  direct_states,
1084  nested_states>,
1085  tsm::detail::type_list<>>::type;
1086 
1088  using parents =
1092 
1099 
1103  using transitions =
1107  struct type : hierarchy<Root, states, parents, initial_children> {
1109  };
1110 };
1111 
1112 } // namespace tsm::core
get_states_t< context_transition_list_t< Context > > direct_states_t
Definition: core_algorithms.h:929
typename context_transition_list< Context >::type context_transition_list_t
Definition: core_algorithms.h:926
tsm::detail::type_set< direct_states_t< Context > > direct_state_set_t
Definition: core_algorithms.h:932
Definition: core_algorithms.h:23
consteval bool trigger_group_is_valid()
Definition: core_algorithms.h:264
consteval std::size_t trigger_count()
Definition: core_algorithms.h:239
consteval bool transition_triggers_are_valid()
Definition: core_algorithms.h:289
typename initial_child_map_from_list< InitialChildList >::type initial_child_map_from_list_t
Definition: core_algorithms.h:431
typename parent_map_from_list< ParentList >::type parent_map_from_list_t
Definition: core_algorithms.h:417
consteval std::size_t index_in_pack()
Definition: core_algorithms.h:120
concept transition_list_like
Definition: core_algorithms.h:174
constexpr bool same_trigger_v
Definition: core_algorithms.h:234
typename get_states< TransitionList >::type get_states_t
Definition: core_algorithms.h:218
typename get_events< TransitionList >::type get_events_t
Definition: core_algorithms.h:231
constexpr auto compute_reentering_transition_sequence(std::uint16_t active_leaf, std::uint16_t selected_source, std::uint16_t destination)
Definition: core_algorithms.h:859
constexpr auto compute_local_transition_sequence(std::uint16_t active_leaf, std::uint16_t selected_source, std::uint16_t destination)
Definition: core_algorithms.h:802
constexpr auto compute_transition_sequence(std::uint16_t source, std::uint16_t destination)
Definition: core_algorithms.h:769
consteval bool contains_type()
Definition: core_algorithms.h:137
typename infer_hierarchy< Context, Root >::type infer_hierarchy_t
Definition: core_algorithms.h:447
consteval bool duplicate_group_is_guarded()
Definition: core_algorithms.h:247
consteval std::size_t duplicate_group_unguarded_count()
Definition: core_algorithms.h:255
constexpr std::uint16_t npos
Definition: core_algorithms.h:31
concept transition_edge_like
Definition: transition.h:411
typename concat_type_lists< Lists... >::type concat_type_lists_t
Definition: type_list.h:202
typename as_type_list< T >::type as_type_list_t
Definition: type_list.h:175
typename front_type< T >::type front_type_t
Definition: type_list.h:72
concept transition_like
Definition: transition.h:417
typename transitions_of< T >::type transitions_of_t
Definition: transition.h:486
Definition: bare_metal.h:20
detail::type_list< TransitionEntries... > transition_table
Definition: tsm.h:2442
transition_table< TransitionEntries... > Ts
Definition: tsm.h:2445
Definition: core_algorithms.h:919
tsm::detail::as_type_list_t< tsm::detail::transitions_of_t< Context > > type
Definition: core_algorithms.h:921
typename State::history_parent type
Definition: core_algorithms.h:987
typename State::final_parent type
Definition: core_algorithms.h:982
Definition: core_algorithms.h:976
Parent type
Definition: core_algorithms.h:977
Definition: core_algorithms.h:442
Definition: core_algorithms.h:1036
tsm::detail::concat_type_lists_t< tsm::detail::type_list< initial_child< State, typename nested::initial > >, typename nested::initial_children > type
Definition: core_algorithms.h:1032
Definition: core_algorithms.h:1021
tsm::detail::type_list<> type
Definition: core_algorithms.h:1022
Definition: core_algorithms.h:1056
typename infer_hierarchy< State, State >::leaf_states type
Definition: core_algorithms.h:1052
Definition: core_algorithms.h:1046
tsm::detail::type_list< State > type
Definition: core_algorithms.h:1047
Definition: core_algorithms.h:945
typename infer_hierarchy< State, State >::states type
Definition: core_algorithms.h:941
Definition: core_algorithms.h:935
tsm::detail::type_list<> type
Definition: core_algorithms.h:936
Definition: core_algorithms.h:966
typename infer_hierarchy< State, State >::transitions type
Definition: core_algorithms.h:962
Definition: core_algorithms.h:956
tsm::detail::type_list<> type
Definition: core_algorithms.h:957
Definition: core_algorithms.h:1010
typename infer_hierarchy< State, State >::parents nested
Definition: core_algorithms.h:1003
tsm::detail::concat_type_lists_t< tsm::detail::type_list< parent< State, Parent > >, nested > type
Definition: core_algorithms.h:1006
Definition: core_algorithms.h:991
tsm::detail::type_list< parent< State, inferred_parent > > type
Definition: core_algorithms.h:998
typename inferred_parent_for_state< State, Parent, tsm::detail::final_state_like< State >, tsm::detail::history_state_like< State > >::type inferred_parent
Definition: core_algorithms.h:997
Definition: core_algorithms.h:221
Definition: core_algorithms.h:207
Definition: core_algorithms.h:434
Definition: core_algorithms.h:1107
infer_hierarchy::transitions transitions
Definition: core_algorithms.h:1108
Definition: core_algorithms.h:1068
local_leaf_states leaf_states
Definition: core_algorithms.h:1097
tsm::detail::concat_type_lists_t< direct_transitions, typename detail::nested_transitions_for_list< direct_states >::type > transitions
Definition: core_algorithms.h:1106
tsm::detail::front_type_t< direct_states > initial
Definition: core_algorithms.h:1098
typename detail::initial_edges_for_list< direct_states >::type initial_children
Definition: core_algorithms.h:1091
typename detail::local_leaf_states_for_list< direct_states >::type local_leaf_states
Definition: core_algorithms.h:1096
detail::direct_states_t< Context > direct_states
Definition: core_algorithms.h:1071
detail::context_transition_list_t< Context > direct_transitions
Direct machine surface authored by Context.
Definition: core_algorithms.h:1070
typename detail::nested_states_for_list< direct_states, Root >::type nested_states
Recursively imported structure from nested composite states.
Definition: core_algorithms.h:1076
typename tsm::detail::unique_tuple< tsm::detail::concat_type_lists_t< tsm::detail::type_list< Root >, direct_states, nested_states >, tsm::detail::type_list<> >::type states
Definition: core_algorithms.h:1085
detail::direct_state_set_t< Context > direct_state_set
Definition: core_algorithms.h:1072
typename detail::parent_edges_for_list< direct_states, Root >::type parents
Parent and initial-child maps inferred from nesting.
Definition: core_algorithms.h:1089
Definition: core_algorithms.h:420
Definition: core_algorithms.h:401
Composite composite
Definition: core_algorithms.h:402
Initial initial
Definition: core_algorithms.h:403
Definition: core_algorithms.h:407
Definition: core_algorithms.h:389
Child child
Definition: core_algorithms.h:390
Parent parent_state
Definition: core_algorithms.h:391
Definition: core_algorithms.h:50
std::size_t size
Definition: core_algorithms.h:52
std::array< std::uint16_t, Capacity > values
Definition: core_algorithms.h:51
constexpr static_path reversed() const
Definition: core_algorithms.h:73
constexpr bool contains(std::uint16_t value) const
Definition: core_algorithms.h:64
constexpr bool operator==(static_path const &other) const
Definition: core_algorithms.h:81
constexpr std::uint16_t operator[](std::size_t index) const
Definition: core_algorithms.h:60
constexpr void push_back(std::uint16_t value)
Definition: core_algorithms.h:54
Definition: core_algorithms.h:744
static_path< Capacity > entries
Definition: core_algorithms.h:748
static_path< Capacity > exits
Definition: core_algorithms.h:747
std::uint16_t destination
Definition: core_algorithms.h:745
std::uint16_t lca
Definition: core_algorithms.h:746
static_path< Capacity > final_path
Definition: core_algorithms.h:749
Definition: core_algorithms.h:201
tsm::detail::type_list< typename Transition::from, typename Transition::to > type
Definition: core_algorithms.h:203
Definition: core_algorithms.h:181
Definition: core_algorithms.h:153
Authoring vocabulary for transitions, pseudostates, and synchronization.
Small compile-time list and set utilities for C++ type tokens.