summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/mpl/example/fsm/player.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/mpl/example/fsm/player.cpp')
-rw-r--r--src/boost/libs/mpl/example/fsm/player.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/boost/libs/mpl/example/fsm/player.cpp b/src/boost/libs/mpl/example/fsm/player.cpp
new file mode 100644
index 00000000..c3a5a124
--- /dev/null
+++ b/src/boost/libs/mpl/example/fsm/player.cpp
@@ -0,0 +1,76 @@
+
+// Copyright Aleksey Gurtovoy 2002-2004
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id$
+// $Date$
+// $Revision$
+
+#include "state_machine.hpp"
+#include <boost/mpl/list.hpp>
+
+#include <iostream>
+
+namespace mpl = boost::mpl;
+
+class player
+ : public fsm::state_machine<player>
+{
+ public:
+ player() {}
+
+ // events
+ struct play_event : event<play_event> {};
+ struct stop_event : event<stop_event> {};
+ struct pause_event : event<pause_event> {};
+
+// MWCW 8.1 is too eager in inforcing access for non-type template parameters
+// private:
+ typedef player self_t;
+
+ // state invariants
+ void stopped_state_invariant() const {}
+ void playing_state_invariant() const {}
+ void paused_state_invariant() const {}
+
+ // states (invariants are passed as non-type template arguments)
+ typedef state<0, &self_t::stopped_state_invariant> stopped;
+ typedef state<1, &self_t::playing_state_invariant> playing;
+ typedef state<2, &self_t::paused_state_invariant> paused;
+
+// private:
+
+ // transition functions
+ bool do_play(play_event const&) { std::cout << "player::do_play\n"; return true; }
+ bool do_stop(stop_event const&) { std::cout << "player::do_stop\n"; return true; }
+ bool do_pause(pause_event const&) { std::cout << "player::do_pause\n"; return true; }
+ bool do_resume(play_event const&) { std::cout << "player::do_resume\n"; return true; }
+
+ // transitions, in the following format:
+ // | current state | event | next state | transition function |
+ friend class fsm::state_machine<player>;
+ typedef mpl::list<
+ transition<stopped, play_event, playing, &player::do_play>
+ , transition<playing, stop_event, stopped, &player::do_stop>
+ , transition<playing, pause_event, paused, &player::do_pause>
+ , transition<paused, play_event, playing, &player::do_resume>
+ , transition<paused, stop_event, stopped, &player::do_stop>
+ >::type transition_table;
+
+ typedef stopped initial_state;
+};
+
+int main()
+{
+ player p;
+ p.process_event(player::play_event());
+ p.process_event(player::pause_event());
+ p.process_event(player::play_event());
+ p.process_event(player::stop_event());
+ return 0;
+}