Libftpp
A modern C++ library
state_machine.hpp
Go to the documentation of this file.
1 #ifndef STATE_MACHINE_HPP
2 #define STATE_MACHINE_HPP
3 
4 #include <functional>
5 #include <map>
6 #include <stdexcept>
7 #include <unordered_map>
8 #include <unordered_set>
9 
46 template <typename TState>
48 {
49 private:
50  TState _currentS;
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;
54 
55 public:
56  void addState(const TState& state)
57  {
58  if (_states.empty())
59  {
60  _currentS = state;
61  }
62  _states.insert(state);
63  }
64 
65  void addTransition(const TState& startState,
66  const TState& finalState,
67  const std::function<void()>& lambda)
68  {
69  if (_states.find(startState) == _states.end() || _states.find(startState) == _states.end())
70  {
71  throw std::invalid_argument("Invalid State");
72  }
73  _transitions[std::make_pair(startState, finalState)] = lambda;
74  }
75 
76  void addAction(const TState& state, const std::function<void()>& lambda)
77  {
78  _actions[state] = lambda;
79  }
80 
81  void transitionTo(const TState& state)
82  {
83  auto it = _transitions.find(std::make_pair(_currentS, state));
84 
85  (it == _transitions.end()) ? throw std::invalid_argument("No transition found")
86  : it->second();
87  _currentS = state;
88  }
89 
90  void update()
91  {
92  auto it = _actions.find(_currentS);
93  (it == _actions.end()) ? throw std::invalid_argument("No action found") : it->second();
94  }
95 };
96 #endif
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)