Loading...
Searching...
No Matches
MultiCustomStateManager.h
Go to the documentation of this file.
1#ifndef MULTICUSTOMSTATEMANAGER_H
2#define MULTICUSTOMSTATEMANAGER_H
3
4#include <type_traits>
5#include <tuple>
6#include <functional>
8
9namespace ml
10{
11 // =========================================================================
12 // SingleStateManager
13 // =========================================================================
14
29 template<typename StateEnum>
31 {
32 StateEnum _currentState{};
33 std::function<void(StateEnum)> _onEnter;
34 std::function<void(StateEnum)> _onExit;
35
36 public:
46 void setState(StateEnum newState)
47 {
48 if (_onExit) _onExit(_currentState);
49 _currentState = newState;
50 if (_onEnter) _onEnter(_currentState);
51 }
52
57 StateEnum getState() const { return _currentState; }
58
64 bool isState(StateEnum state) const { return _currentState == state; }
65
75 void onStateEnter(std::function<void(StateEnum)> cb) { _onEnter = std::move(cb); }
76
86 void onStateExit(std::function<void(StateEnum)> cb) { _onExit = std::move(cb); }
87 };
88
89 // =========================================================================
90 // MultiCustomStateManager
91 // =========================================================================
92
126 template<typename... StateEnums>
131 class MultiCustomStateManager : public SingleStateManager<StateEnums>...
132 {
133 public:
134 using SingleStateManager<StateEnums>::setState...;
135 using SingleStateManager<StateEnums>::getState...;
136 using SingleStateManager<StateEnums>::isState...;
137 using SingleStateManager<StateEnums>::onStateEnter...;
138 using SingleStateManager<StateEnums>::onStateExit...;
139 };
140
147 template<>
149 {
150 public:
151 void setState(...) {}
152 void onStateEnter(...) {}
153 void onStateExit(...) {}
154 };
155
156 // =========================================================================
157 // State extraction and gather helpers
158 // =========================================================================
159
161
167 template<typename M, typename = void>
168 struct extract_ManifestState { using type = void; };
169
170 template<typename M>
171 struct extract_ManifestState<M, std::void_t<typename M::State>>
172 { using type = typename M::State; };
173
174 // ── Void filtering (mirrors the pattern in MultiCustomFlaggable) ──────────
175
176 template<typename T, typename Acc>
177 struct AppendStateIfNotVoid { using type = Acc; };
178
179 template<typename T, typename... Acc>
180 struct AppendStateIfNotVoid<T, std::tuple<Acc...>>
181 {
182 using type = std::conditional_t<
183 std::is_void_v<T>,
184 std::tuple<Acc...>,
185 std::tuple<Acc..., T>
186 >;
187 };
188
189 template<typename... Ts>
190 struct FilterVoidStates;
191
192 template<>
193 struct FilterVoidStates<> { using type = std::tuple<>; };
194
195 template<typename T, typename... Rest>
196 struct FilterVoidStates<T, Rest...>
197 {
198 using type = typename AppendStateIfNotVoid<
199 T,
200 typename FilterVoidStates<Rest...>::type
201 >::type;
202 };
203
204 template<typename Tuple>
205 struct TupleToMultiStateManager;
206
207 template<typename... StateEnums>
208 struct TupleToMultiStateManager<std::tuple<StateEnums...>>
209 { using type = MultiCustomStateManager<StateEnums...>; };
210
212
213 // =========================================================================
214 // GatherStates
215 // =========================================================================
216
235 template<typename ComponentManifest, typename... Traits>
237 {
238 using AllStatesTuple = typename FilterVoidStates<
239 typename extract_ManifestState<ComponentManifest>::type,
240 typename extract_ManifestState<
241 typename extract_TraitManifest<Traits>::type
242 >::type...
243 >::type;
244
245 using type = typename TupleToMultiStateManager<AllStatesTuple>::type;
246 };
247
248} // namespace ml
249
250#endif // MULTICUSTOMSTATEMANAGER_H
Aggregates state machines for multiple enum types into one class.
State machine for a single enum type.
StateEnum getState() const
Return the current state value.
void onStateEnter(std::function< void(StateEnum)> cb)
Register a callback invoked when any state is entered.
void setState(StateEnum newState)
Transition to a new state.
void onStateExit(std::function< void(StateEnum)> cb)
Register a callback invoked when any state is exited.
bool isState(StateEnum state) const
Return true if the current state equals state.
Definition Component.h:18
Collects all State enums from a component manifest and its traits.
typename TupleToMultiStateManager< AllStatesTuple >::type type
typename FilterVoidStates< typename extract_ManifestState< ComponentManifest >::type, typename extract_ManifestState< typename extract_TraitManifest< Traits >::type >::type... >::type AllStatesTuple