1 #ifndef STATE_MACHINE_HPP
2 #define STATE_MACHINE_HPP
7 #include <unordered_map>
8 #include <unordered_set>
46 template <
typename TState>
51 std::unordered_set<TState> _states;
52 std::unordered_map<TState, std::function<void()>> _actions;
53 std::map<std::pair<TState, TState>, std::function<void()>> _transitions;
62 _states.insert(state);
66 const TState& finalState,
67 const std::function<
void()>& lambda)
69 if (_states.find(startState) == _states.end() || _states.find(startState) == _states.end())
71 throw std::invalid_argument(
"Invalid State");
73 _transitions[std::make_pair(startState, finalState)] = lambda;
76 void addAction(
const TState& state,
const std::function<
void()>& lambda)
78 _actions[state] = lambda;
83 auto it = _transitions.find(std::make_pair(_currentS, state));
85 (it == _transitions.end()) ?
throw std::invalid_argument(
"No transition found")
92 auto it = _actions.find(_currentS);
93 (it == _actions.end()) ?
throw std::invalid_argument(
"No action found") : it->second();
State Machine Design Pattern.
void transitionTo(const TState &state)
void addTransition(const TState &startState, const TState &finalState, const std::function< void()> &lambda)
void addState(const TState &state)
void addAction(const TState &state, const std::function< void()> &lambda)