Loading...
Searching...
No Matches
MultiCustomStateManager.h
Go to the documentation of this file.
1// Copyright (c) 2025 Dave R. Smith.
2// Malena Framework — Licensed under PolyForm Noncommercial 1.0.0; commercial use requires a paid license. See LICENSE.
3
4#ifndef MALENA_MULTICUSTOMSTATEMANAGER_H
5#define MALENA_MULTICUSTOMSTATEMANAGER_H
6
8#include <type_traits>
9#include <tuple>
10#include <functional>
12
13namespace ml
14{
15 // =========================================================================
16 // SingleStateManager
17 // =========================================================================
18
33 template<typename StateEnum>
35 {
36 StateEnum _currentState{};
37 std::function<void(StateEnum)> _onEnter;
38 std::function<void(StateEnum)> _onExit;
39
40 public:
50 void setState(StateEnum newState)
51 {
52 if (_onExit) _onExit(_currentState);
53 _currentState = newState;
54 if (_onEnter) _onEnter(_currentState);
55 }
56
61 StateEnum getState() const { return _currentState; }
62
68 bool isState(StateEnum state) const { return _currentState == state; }
69
79 void onStateEnter(std::function<void(StateEnum)> cb) { _onEnter = std::move(cb); }
80
90 void onStateExit(std::function<void(StateEnum)> cb) { _onExit = std::move(cb); }
91
100 void syncState(StateEnum state) { _currentState = state; }
101 };
102
103 // =========================================================================
104 // MultiCustomStateManager
105 // =========================================================================
106
141 template<typename... StateEnums>
142 class MultiCustomStateManager : public SingleStateManager<StateEnums>...
143 {
144 public:
145 using SingleStateManager<StateEnums>::setState...;
146 using SingleStateManager<StateEnums>::getState...;
147 using SingleStateManager<StateEnums>::isState...;
148 using SingleStateManager<StateEnums>::onStateEnter...;
149 using SingleStateManager<StateEnums>::onStateExit...;
150 using SingleStateManager<StateEnums>::syncState...;
151 };
152
159 template<>
161 {
162 public:
163 void setState(...) {}
164 void getState(...) {}
165 void isState(...) {}
166 void onStateEnter(...) {}
167 void onStateExit(...) {}
168 void syncState(...) {}
169 };
170
171 // =========================================================================
172 // State extraction and gather helpers
173 // =========================================================================
174
176
182 template<typename M, typename = void>
183 struct extract_ManifestState { using type = void; };
184
185 template<typename M>
186 struct extract_ManifestState<M, std::void_t<typename M::State>>
187 { using type = typename M::State; };
188
189 // ── Void filtering (mirrors the pattern in MultiCustomFlaggable) ──────────
190
191 template<typename T, typename Acc>
192 struct AppendStateIfNotVoid { using type = Acc; };
193
194 template<typename T, typename... Acc>
195 struct AppendStateIfNotVoid<T, std::tuple<Acc...>>
196 {
197 using type = std::conditional_t<
198 std::is_void_v<T>,
199 std::tuple<Acc...>,
200 std::tuple<Acc..., T>
201 >;
202 };
203
204 template<typename... Ts>
205 struct FilterVoidStates;
206
207 template<>
208 struct FilterVoidStates<> { using type = std::tuple<>; };
209
210 template<typename T, typename... Rest>
211 struct FilterVoidStates<T, Rest...>
212 {
213 using type = typename AppendStateIfNotVoid<
214 T,
215 typename FilterVoidStates<Rest...>::type
216 >::type;
217 };
218
219 template<typename Tuple>
220 struct TupleToMultiStateManager;
221
222 template<typename... StateEnums>
223 struct TupleToMultiStateManager<std::tuple<StateEnums...>>
224 { using type = MultiCustomStateManager<StateEnums...>; };
225
227
228 // =========================================================================
229 // GatherStates
230 // =========================================================================
231
250 template<typename ComponentManifest, typename... Traits>
252 {
253 using AllStatesTuple = typename FilterVoidStates<
254 typename extract_ManifestState<ComponentManifest>::type,
255 typename extract_ManifestState<
256 typename extract_TraitManifest<Traits>::type
257 >::type...
258 >::type;
259
260 using type = typename TupleToMultiStateManager<AllStatesTuple>::type;
261 };
262
263} // namespace ml
264
265#endif // MALENA_MULTICUSTOMSTATEMANAGER_H
Aggregates state machines for multiple enum types into one class.
State machine for a single enum type.
void syncState(StateEnum state)
Set the current state silently, without firing any callbacks.
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:22
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