13 #if __has_include(<meta>)
17 "TSM_ENABLE_REFLECTION requires a compiler and standard library with <meta>"
22 #include <string_view>
24 #include <type_traits>
28 #if !defined(TSM_ENABLE_REFLECTION) || TSM_ENABLE_REFLECTION != 1
29 #error "This branch requires TSM_ENABLE_REFLECTION=1; no fallback reflection path is available"
45 template<
typename Transition>
47 return { type_name<typename Transition::from>(),
48 type_name<typename Transition::event>(),
49 type_name<typename Transition::to>() };
52 template<
typename TransitionList>
55 template<
typename... TransitionEntries>
57 : std::integral_constant<std::size_t, sizeof...(TransitionEntries)> {};
59 template<
typename... TransitionEntries>
61 : std::integral_constant<std::size_t, sizeof...(TransitionEntries)> {};
63 template<
typename TransitionList>
67 template<
typename TransitionList>
70 template<
typename... TransitionEntries>
72 static constexpr
auto make() {
74 describe_transition<TransitionEntries>()...
79 template<
typename... TransitionEntries>
80 struct transition_table_builder<
tsm::detail::type_list<TransitionEntries...>> {
81 static constexpr
auto make() {
83 describe_transition<TransitionEntries>()...
88 template<
typename A,
typename B>
90 : std::bool_constant<std::is_same_v<typename A::from, typename B::from> &&
91 std::is_same_v<typename A::event, typename B::event>> {
94 template<
typename Transition,
typename... RemainingEntries>
96 : std::bool_constant<(same_trigger<Transition, RemainingEntries>::value || ...)> {};
98 template<
typename... TransitionEntries>
104 template<
typename Transition,
typename... RemainingEntries>
106 : std::bool_constant<transition_conflicts_with_any<
108 RemainingEntries...>::value ||
109 has_duplicate_trigger_impl<RemainingEntries...>::value> {};
111 template<
typename TransitionList>
114 template<
typename... TransitionEntries>
118 template<
typename... TransitionEntries>
126 return std::meta::display_string_of(^^T);
129 template<
typename Context>
134 template<
typename Context>
136 static_assert(tsm::detail::has_transitions_v<Context>,
137 "tsm: Context must define using transitions = ...");
139 detail::transition_count_v<typename Context::transitions> > 0,
140 "tsm: Context transition table must not be empty");
143 "tsm: duplicate transition trigger; a State + Event pair must resolve to one transition");
146 template<
typename Context>
148 static constexpr
auto name = type_name<Context>();
156 template<
typename Context>
162 reflection::validate_context<Context>();
constexpr std::size_t transition_count_v
Definition: reflection.h:64
constexpr transition_descriptor describe_transition()
Definition: reflection.h:46
Definition: reflection.h:32
constexpr std::string_view type_name()
Definition: reflection.h:125
consteval void validate_context()
Definition: reflection.h:135
constexpr auto transition_table()
Definition: reflection.h:130
Definition: bare_metal.h:20
detail::type_list< TransitionEntries... > transition_table
Definition: tsm.h:2442
Definition: reflection.h:157
hsm< Context > base
Definition: reflection.h:158
static constexpr auto graph
Definition: reflection.h:168
static consteval bool validate_reflection_context()
Definition: reflection.h:161
Definition: reflection.h:99
Definition: reflection.h:112
Definition: reflection.h:91
Definition: reflection.h:96
Definition: reflection.h:53
static constexpr auto make()
Definition: reflection.h:72
Definition: reflection.h:68
Definition: reflection.h:147
static constexpr auto transitions
Definition: reflection.h:149
static constexpr auto name
Definition: reflection.h:148
Definition: reflection.h:34
std::string_view to
Definition: reflection.h:37
std::string_view event
Definition: reflection.h:36
std::string_view from
Definition: reflection.h:35