4#ifndef MALENA_MULTICUSTOMSTATEMANAGER_H
5#define MALENA_MULTICUSTOMSTATEMANAGER_H
33 template<
typename StateEnum>
36 StateEnum _currentState{};
37 std::function<void(StateEnum)> _onEnter;
38 std::function<void(StateEnum)> _onExit;
52 if (_onExit) _onExit(_currentState);
53 _currentState = newState;
54 if (_onEnter) _onEnter(_currentState);
61 StateEnum
getState()
const {
return _currentState; }
68 bool isState(StateEnum state)
const {
return _currentState == state; }
79 void onStateEnter(std::function<
void(StateEnum)> cb) { _onEnter = std::move(cb); }
90 void onStateExit(std::function<
void(StateEnum)> cb) { _onExit = std::move(cb); }
131 template<
typename... StateEnums>
168 template<
typename M,
typename =
void>
169 struct extract_ManifestState {
using type = void; };
172 struct extract_ManifestState<M, std::void_t<typename M::State>>
173 {
using type =
typename M::State; };
177 template<
typename T,
typename Acc>
178 struct AppendStateIfNotVoid {
using type = Acc; };
180 template<
typename T,
typename... Acc>
181 struct AppendStateIfNotVoid<T, std::tuple<Acc...>>
183 using type = std::conditional_t<
186 std::tuple<Acc..., T>
190 template<
typename... Ts>
191 struct FilterVoidStates;
194 struct FilterVoidStates<> {
using type = std::tuple<>; };
196 template<
typename T,
typename... Rest>
197 struct FilterVoidStates<T, Rest...>
199 using type =
typename AppendStateIfNotVoid<
201 typename FilterVoidStates<Rest...>::type
205 template<
typename Tuple>
206 struct TupleToMultiStateManager;
208 template<
typename... StateEnums>
209 struct TupleToMultiStateManager<std::tuple<StateEnums...>>
210 {
using type = MultiCustomStateManager<StateEnums...>; };
236 template<
typename ComponentManifest,
typename... Traits>
240 typename extract_ManifestState<ComponentManifest>::type,
241 typename extract_ManifestState<
242 typename extract_TraitManifest<Traits>::type
246 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