Loading...
Searching...
No Matches
MultiCustomStateManager.h
Go to the documentation of this file.
1// Copyright (c) 2025 Dave R. Smith. All rights reserved.
2// Malena Framework — Proprietary Software. See LICENSE for terms.
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 };
92
93 // =========================================================================
94 // MultiCustomStateManager
95 // =========================================================================
96
131 template<typename... StateEnums>
132 class MultiCustomStateManager : public SingleStateManager<StateEnums>...
133 {
134 public:
135 using SingleStateManager<StateEnums>::setState...;
136 using SingleStateManager<StateEnums>::getState...;
137 using SingleStateManager<StateEnums>::isState...;
138 using SingleStateManager<StateEnums>::onStateEnter...;
139 using SingleStateManager<StateEnums>::onStateExit...;
140 };
141
148 template<>
150 {
151 public:
152 void setState(...) {}
153 void onStateEnter(...) {}
154 void onStateExit(...) {}
155 };
156
157 // =========================================================================
158 // State extraction and gather helpers
159 // =========================================================================
160
162
168 template<typename M, typename = void>
169 struct extract_ManifestState { using type = void; };
170
171 template<typename M>
172 struct extract_ManifestState<M, std::void_t<typename M::State>>
173 { using type = typename M::State; };
174
175 // ── Void filtering (mirrors the pattern in MultiCustomFlaggable) ──────────
176
177 template<typename T, typename Acc>
178 struct AppendStateIfNotVoid { using type = Acc; };
179
180 template<typename T, typename... Acc>
181 struct AppendStateIfNotVoid<T, std::tuple<Acc...>>
182 {
183 using type = std::conditional_t<
184 std::is_void_v<T>,
185 std::tuple<Acc...>,
186 std::tuple<Acc..., T>
187 >;
188 };
189
190 template<typename... Ts>
191 struct FilterVoidStates;
192
193 template<>
194 struct FilterVoidStates<> { using type = std::tuple<>; };
195
196 template<typename T, typename... Rest>
197 struct FilterVoidStates<T, Rest...>
198 {
199 using type = typename AppendStateIfNotVoid<
200 T,
201 typename FilterVoidStates<Rest...>::type
202 >::type;
203 };
204
205 template<typename Tuple>
206 struct TupleToMultiStateManager;
207
208 template<typename... StateEnums>
209 struct TupleToMultiStateManager<std::tuple<StateEnums...>>
210 { using type = MultiCustomStateManager<StateEnums...>; };
211
213
214 // =========================================================================
215 // GatherStates
216 // =========================================================================
217
236 template<typename ComponentManifest, typename... Traits>
238 {
239 using AllStatesTuple = typename FilterVoidStates<
240 typename extract_ManifestState<ComponentManifest>::type,
241 typename extract_ManifestState<
242 typename extract_TraitManifest<Traits>::type
243 >::type...
244 >::type;
245
246 using type = typename TupleToMultiStateManager<AllStatesTuple>::type;
247 };
248
249} // namespace ml
250
251#endif // MALENA_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: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