// Copyright 2004 Alexander Nasonov. 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) #include "fsm.hpp" #include #include // TODO: dd #include #include using namespace overloads; struct Passive {}; // Demonstrates discarding of transitions. struct Active {}; // Demonstrates convertion of states. struct Stopped : Active {}; struct Running : Active {}; struct EvActivate {}; struct EvStartStop {}; struct EvReset {}; struct Fsm : state_machine { Fsm(Passive initial = Passive()) : state_machine(initial) {} Running operator()( overload_id<1>, Passive, EvActivate ) const { std::cout << "Passive --> (EvActivate) --> Running\n"; return Running(); } Stopped operator()( overload_id<2>, Running, EvStartStop ) const { std::cout << "Running --> (EvStartStop) --> Stopped\n"; return Stopped(); } Running operator()( overload_id<3>, Stopped, EvStartStop ) const { std::cout << "Stopped --> (EvStartStop) --> Running\n"; return Running(); } Stopped operator()( overload_id<4>, Active, EvReset ) const { std::cout << "Active --> (EvReset) --> Stopped\n"; return Stopped(); } typedef boost::mpl::range_c transitions; }; int main() { try { EvReset evReset; EvActivate evActivate; EvStartStop evStartStop; Fsm fsm; fsm.process_event(evActivate); fsm.process_event(evActivate); // discarded fsm.process_event(evStartStop); fsm.process_event(evReset); fsm.process_event(evStartStop); fsm.process_event(evStartStop); fsm.process_event(evReset); } catch(std::exception const& ex) { std::cerr << ex.what() << '\n'; } }