Ticket #6951: fig1.cpp

File fig1.cpp, 2.4 KB (added by Takatoshi Kondo <redboltz@…>, 10 years ago)

Source code corresponds to fig1.

Line 
1#include <iostream>
2#include <boost/msm/back/state_machine.hpp>
3
4#include <boost/msm/front/state_machine_def.hpp>
5#include <boost/msm/front/functor_row.hpp>
6
7
8namespace {
9 namespace msm = boost::msm;
10 namespace msmf = boost::msm::front;
11 namespace mpl = boost::mpl;
12
13 // ----- Events
14 struct Event1 {};
15
16 // ----- State machine
17 struct Sm1_:msmf::state_machine_def<Sm1_>
18 {
19 struct State1_:msmf::state<> {};
20 struct State2_:msmf::state_machine_def<State2_>
21 {
22 struct State2_1:msmf::state<> {
23 template <class Event,class Fsm>
24 void on_entry(Event const&, Fsm&) const {
25 std::cout << "State2_1::on_entry()" << std::endl;
26 }
27 };
28 struct Entry1:msmf::entry_pseudo_state<> {};
29 // Actions
30 struct Action1 {
31 template <class Event, class Fsm, class SourceState, class TargetState>
32 void operator()(Event const&, Fsm&, SourceState&, TargetState&)
33 {
34 std::cout << "Action1()" << std::endl;
35 }
36 };
37 // Set initial state
38 typedef mpl::vector<State2_1> initial_state;
39 // Transition table
40 struct transition_table:mpl::vector<
41 // Start Event Next Action Guard
42 msmf::Row < Entry1, msmf::none, State2_1, msmf::none, msmf::none >,
43 msmf::Row < State2_1, Event1, msmf::none, Action1, msmf::none >
44 > {};
45 };
46 typedef msm::back::state_machine<State2_> State2;
47
48 // Set initial state
49 typedef State1_ initial_state;
50 // Transition table
51 struct transition_table:mpl::vector<
52 // Start Event Next Action Guard
53 msmf::Row < State1_, Event1, State2::entry_pt
54 <State2_::Entry1>, msmf::none, msmf::none >
55 > {};
56 };
57
58 // Pick a back-end
59 typedef msm::back::state_machine<Sm1_> Sm1;
60
61 void test()
62 {
63 Sm1 sm1;
64 sm1.start();
65 std::cout << "> Send Event1" << std::endl;
66 sm1.process_event(Event1());
67 }
68}
69
70int main()
71{
72 test();
73 return 0;
74}
75
76// Output:
77//
78// > Send Event1
79// State2_1::on_entry()
80// Action1()