player.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright Aleksey Gurtovoy 2002-2004
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // See http://www.boost.org/libs/mpl for documentation.
  8. // $Id$
  9. // $Date$
  10. // $Revision$
  11. #include "state_machine.hpp"
  12. #include <boost/mpl/list.hpp>
  13. #include <iostream>
  14. namespace mpl = boost::mpl;
  15. class player
  16. : public fsm::state_machine<player>
  17. {
  18. public:
  19. player() {}
  20. // events
  21. struct play_event : event<play_event> {};
  22. struct stop_event : event<stop_event> {};
  23. struct pause_event : event<pause_event> {};
  24. // MWCW 8.1 is too eager in inforcing access for non-type template parameters
  25. // private:
  26. typedef player self_t;
  27. // state invariants
  28. void stopped_state_invariant() const {}
  29. void playing_state_invariant() const {}
  30. void paused_state_invariant() const {}
  31. // states (invariants are passed as non-type template arguments)
  32. typedef state<0, &self_t::stopped_state_invariant> stopped;
  33. typedef state<1, &self_t::playing_state_invariant> playing;
  34. typedef state<2, &self_t::paused_state_invariant> paused;
  35. // private:
  36. // transition functions
  37. bool do_play(play_event const&) { std::cout << "player::do_play\n"; return true; }
  38. bool do_stop(stop_event const&) { std::cout << "player::do_stop\n"; return true; }
  39. bool do_pause(pause_event const&) { std::cout << "player::do_pause\n"; return true; }
  40. bool do_resume(play_event const&) { std::cout << "player::do_resume\n"; return true; }
  41. // transitions, in the following format:
  42. // | current state | event | next state | transition function |
  43. friend class fsm::state_machine<player>;
  44. typedef mpl::list<
  45. transition<stopped, play_event, playing, &player::do_play>
  46. , transition<playing, stop_event, stopped, &player::do_stop>
  47. , transition<playing, pause_event, paused, &player::do_pause>
  48. , transition<paused, play_event, playing, &player::do_resume>
  49. , transition<paused, stop_event, stopped, &player::do_stop>
  50. >::type transition_table;
  51. typedef stopped initial_state;
  52. };
  53. int main()
  54. {
  55. player p;
  56. p.process_event(player::play_event());
  57. p.process_event(player::pause_event());
  58. p.process_event(player::play_event());
  59. p.process_event(player::stop_event());
  60. return 0;
  61. }