blob: 0d3e1fd5c79d50946f613e48fc3e901ff3913461 [file] [log] [blame]
// 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: player.cpp 49268 2008-10-11 06:26:17Z agurtovoy $
// $Date: 2008-10-11 02:26:17 -0400 (Sat, 11 Oct 2008) $
// $Revision: 49268 $
#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;
}