1#ifndef MULTICUSTOMSTATEMANAGER_H
2#define MULTICUSTOMSTATEMANAGER_H
29 template<
typename StateEnum>
32 StateEnum _currentState{};
33 std::function<void(StateEnum)> _onEnter;
34 std::function<void(StateEnum)> _onExit;
48 if (_onExit) _onExit(_currentState);
49 _currentState = newState;
50 if (_onEnter) _onEnter(_currentState);
57 StateEnum
getState()
const {
return _currentState; }
64 bool isState(StateEnum state)
const {
return _currentState == state; }
75 void onStateEnter(std::function<
void(StateEnum)> cb) { _onEnter = std::move(cb); }
86 void onStateExit(std::function<
void(StateEnum)> cb) { _onExit = std::move(cb); }
126 template<
typename... StateEnums>
167 template<
typename M,
typename =
void>
168 struct extract_ManifestState {
using type = void; };
171 struct extract_ManifestState<M, std::void_t<typename M::State>>
172 {
using type =
typename M::State; };
176 template<
typename T,
typename Acc>
177 struct AppendStateIfNotVoid {
using type = Acc; };
179 template<
typename T,
typename... Acc>
180 struct AppendStateIfNotVoid<T, std::tuple<Acc...>>
182 using type = std::conditional_t<
185 std::tuple<Acc..., T>
189 template<
typename... Ts>
190 struct FilterVoidStates;
193 struct FilterVoidStates<> {
using type = std::tuple<>; };
195 template<
typename T,
typename... Rest>
196 struct FilterVoidStates<T, Rest...>
198 using type =
typename AppendStateIfNotVoid<
200 typename FilterVoidStates<Rest...>::type
204 template<
typename Tuple>
205 struct TupleToMultiStateManager;
207 template<
typename... StateEnums>
208 struct TupleToMultiStateManager<std::tuple<StateEnums...>>
209 {
using type = MultiCustomStateManager<StateEnums...>; };
235 template<
typename ComponentManifest,
typename... Traits>
239 typename extract_ManifestState<ComponentManifest>::type,
240 typename extract_ManifestState<
241 typename extract_TraitManifest<Traits>::type
245 using type =
typename TupleToMultiStateManager<AllStatesTuple>::type;
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.
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