1 // Copyright 2010 Christophe Henry
2 // henry UNDERSCORE christophe AT hotmail DOT com
3 // This is an extended version of the state machine available in the boost::mpl library
4 // Distributed under the same license as the original.
5 // Copyright for the original version:
6 // Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed
7 // under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 
11 #ifndef LOGGING_FUNCTORS
12 #define LOGGING_FUNCTORS
13 
BOOST_MSM_EUML_ACTION(Empty_Entry)14 BOOST_MSM_EUML_ACTION(Empty_Entry)
15 {
16     template <class Event,class FSM,class STATE>
17     void operator()(Event const&,FSM&,STATE& )
18     {
19         std::cout << "entering: Empty" << std::endl;
20     }
21 };
BOOST_MSM_EUML_ACTION(Empty_Exit)22 BOOST_MSM_EUML_ACTION(Empty_Exit)
23 {
24     template <class Event,class FSM,class STATE>
25     void operator()(Event const&,FSM&,STATE& )
26     {
27         std::cout << "leaving: Empty" << std::endl;
28     }
29 };
30 
BOOST_MSM_EUML_ACTION(Open_Entry)31 BOOST_MSM_EUML_ACTION(Open_Entry)
32 {
33     template <class Event,class FSM,class STATE>
34     void operator()(Event const&,FSM&,STATE& )
35     {
36         std::cout << "entering: Open" << std::endl;
37     }
38 };
BOOST_MSM_EUML_ACTION(Open_Exit)39 BOOST_MSM_EUML_ACTION(Open_Exit)
40 {
41     template <class Event,class FSM,class STATE>
42     void operator()(Event const&,FSM&,STATE& )
43     {
44         std::cout << "leaving: Open" << std::endl;
45     }
46 };
47 
BOOST_MSM_EUML_ACTION(Stopped_Entry)48 BOOST_MSM_EUML_ACTION(Stopped_Entry)
49 {
50     template <class Event,class FSM,class STATE>
51     void operator()(Event const&,FSM&,STATE& )
52     {
53         std::cout << "entering: Stopped" << std::endl;
54     }
55 };
BOOST_MSM_EUML_ACTION(Stopped_Exit)56 BOOST_MSM_EUML_ACTION(Stopped_Exit)
57 {
58     template <class Event,class FSM,class STATE>
59     void operator()(Event const&,FSM&,STATE& )
60     {
61         std::cout << "leaving: Stopped" << std::endl;
62     }
63 };
64 
BOOST_MSM_EUML_ACTION(AllOk_Entry)65 BOOST_MSM_EUML_ACTION(AllOk_Entry)
66 {
67     template <class Event,class FSM,class STATE>
68     void operator()(Event const&,FSM&,STATE& )
69     {
70         std::cout << "starting: AllOk" << std::endl;
71     }
72 };
BOOST_MSM_EUML_ACTION(AllOk_Exit)73 BOOST_MSM_EUML_ACTION(AllOk_Exit)
74 {
75     template <class Event,class FSM,class STATE>
76     void operator()(Event const&,FSM&,STATE& )
77     {
78         std::cout << "finishing: AllOk" << std::endl;
79     }
80 };
81 
BOOST_MSM_EUML_ACTION(ErrorMode_Entry)82 BOOST_MSM_EUML_ACTION(ErrorMode_Entry)
83 {
84     template <class Event,class FSM,class STATE>
85     void operator()(Event const&,FSM&,STATE& )
86     {
87         std::cout << "starting: ErrorMode" << std::endl;
88     }
89 };
BOOST_MSM_EUML_ACTION(ErrorMode_Exit)90 BOOST_MSM_EUML_ACTION(ErrorMode_Exit)
91 {
92     template <class Event,class FSM,class STATE>
93     void operator()(Event const&,FSM&,STATE& )
94     {
95         std::cout << "finishing: ErrorMode" << std::endl;
96     }
97 };
98 
BOOST_MSM_EUML_ACTION(Playing_Entry)99 BOOST_MSM_EUML_ACTION(Playing_Entry)
100 {
101     template <class Event,class FSM,class STATE>
102     void operator()(Event const&,FSM&,STATE& )
103     {
104         std::cout << "entering: Playing" << std::endl;
105     }
106 };
BOOST_MSM_EUML_ACTION(Playing_Exit)107 BOOST_MSM_EUML_ACTION(Playing_Exit)
108 {
109     template <class Event,class FSM,class STATE>
110     void operator()(Event const&,FSM&,STATE& )
111     {
112         std::cout << "leaving: Playing" << std::endl;
113     }
114 };
115 
BOOST_MSM_EUML_ACTION(Song1_Entry)116 BOOST_MSM_EUML_ACTION(Song1_Entry)
117 {
118     template <class Event,class FSM,class STATE>
119     void operator()(Event const&,FSM&,STATE& )
120     {
121         std::cout << "starting: First song" << std::endl;
122     }
123 };
BOOST_MSM_EUML_ACTION(Song1_Exit)124 BOOST_MSM_EUML_ACTION(Song1_Exit)
125 {
126     template <class Event,class FSM,class STATE>
127     void operator()(Event const&,FSM&,STATE& )
128     {
129         std::cout << "finishing: First Song" << std::endl;
130     }
131 };
132 
BOOST_MSM_EUML_ACTION(Song2_Entry)133 BOOST_MSM_EUML_ACTION(Song2_Entry)
134 {
135     template <class Event,class FSM,class STATE>
136     void operator()(Event const&,FSM&,STATE& )
137     {
138         std::cout << "starting: Second song" << std::endl;
139     }
140 };
BOOST_MSM_EUML_ACTION(Song2_Exit)141 BOOST_MSM_EUML_ACTION(Song2_Exit)
142 {
143     template <class Event,class FSM,class STATE>
144     void operator()(Event const&,FSM&,STATE& )
145     {
146         std::cout << "finishing: Second Song" << std::endl;
147     }
148 };
149 
BOOST_MSM_EUML_ACTION(Song3_Entry)150 BOOST_MSM_EUML_ACTION(Song3_Entry)
151 {
152     template <class Event,class FSM,class STATE>
153     void operator()(Event const&,FSM&,STATE& )
154     {
155         std::cout << "starting: Third song" << std::endl;
156     }
157 };
BOOST_MSM_EUML_ACTION(Song3_Exit)158 BOOST_MSM_EUML_ACTION(Song3_Exit)
159 {
160     template <class Event,class FSM,class STATE>
161     void operator()(Event const&,FSM&,STATE& )
162     {
163         std::cout << "finishing: Third Song" << std::endl;
164     }
165 };
166 
BOOST_MSM_EUML_ACTION(Region2State1_Entry)167 BOOST_MSM_EUML_ACTION(Region2State1_Entry)
168 {
169     template <class Event,class FSM,class STATE>
170     void operator()(Event const&,FSM&,STATE& )
171     {
172         std::cout << "starting: Region2State1" << std::endl;
173     }
174 };
BOOST_MSM_EUML_ACTION(Region2State1_Exit)175 BOOST_MSM_EUML_ACTION(Region2State1_Exit)
176 {
177     template <class Event,class FSM,class STATE>
178     void operator()(Event const&,FSM&,STATE& )
179     {
180         std::cout << "finishing: Region2State1" << std::endl;
181     }
182 };
BOOST_MSM_EUML_ACTION(Region2State2_Entry)183 BOOST_MSM_EUML_ACTION(Region2State2_Entry)
184 {
185     template <class Event,class FSM,class STATE>
186     void operator()(Event const&,FSM&,STATE& )
187     {
188         std::cout << "starting: Region2State2" << std::endl;
189     }
190 };
BOOST_MSM_EUML_ACTION(Region2State2_Exit)191 BOOST_MSM_EUML_ACTION(Region2State2_Exit)
192 {
193     template <class Event,class FSM,class STATE>
194     void operator()(Event const&,FSM&,STATE& )
195     {
196         std::cout << "finishing: Region2State2" << std::endl;
197     }
198 };
199 // transition actions for Playing
BOOST_MSM_EUML_ACTION(start_next_song)200 BOOST_MSM_EUML_ACTION(start_next_song)
201 {
202     template <class FSM,class EVT,class SourceState,class TargetState>
203     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
204     {
205         std::cout << "Playing::start_next_song" << endl;
206     }
207 };
BOOST_MSM_EUML_ACTION(start_prev_song)208 BOOST_MSM_EUML_ACTION(start_prev_song)
209 {
210     template <class FSM,class EVT,class SourceState,class TargetState>
211     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
212     {
213         std::cout << "Playing::start_prev_song" << endl;
214     }
215 };
216 
217 // transition actions
BOOST_MSM_EUML_ACTION(start_playback)218 BOOST_MSM_EUML_ACTION(start_playback)
219 {
220     template <class FSM,class EVT,class SourceState,class TargetState>
221     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
222     {
223         cout << "player::start_playback" << endl;
224     }
225 };
BOOST_MSM_EUML_ACTION(open_drawer)226 BOOST_MSM_EUML_ACTION(open_drawer)
227 {
228     template <class FSM,class EVT,class SourceState,class TargetState>
229     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
230     {
231         cout << "player::open_drawer" << endl;
232     }
233 };
BOOST_MSM_EUML_ACTION(close_drawer)234 BOOST_MSM_EUML_ACTION(close_drawer)
235 {
236     template <class FSM,class EVT,class SourceState,class TargetState>
237     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
238     {
239         cout << "player::close_drawer" << endl;
240     }
241 };
BOOST_MSM_EUML_ACTION(store_cd_info)242 BOOST_MSM_EUML_ACTION(store_cd_info)
243 {
244     template <class FSM,class EVT,class SourceState,class TargetState>
245     void operator()(EVT const&, FSM& ,SourceState& ,TargetState& )
246     {
247         cout << "player::store_cd_info" << endl;
248         // it is now easy to use the message queue.
249         // alternatively to the proces_ in the transition table, we could write:
250         // fsm.process_event(play());
251     }
252 };
BOOST_MSM_EUML_ACTION(stop_playback)253 BOOST_MSM_EUML_ACTION(stop_playback)
254 {
255     template <class FSM,class EVT,class SourceState,class TargetState>
256     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
257     {
258         cout << "player::stop_playback" << endl;
259     }
260 };
BOOST_MSM_EUML_ACTION(pause_playback)261 BOOST_MSM_EUML_ACTION(pause_playback)
262 {
263     template <class FSM,class EVT,class SourceState,class TargetState>
264     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
265     {
266         cout << "player::pause_playback" << endl;
267     }
268 };
BOOST_MSM_EUML_ACTION(resume_playback)269 BOOST_MSM_EUML_ACTION(resume_playback)
270 {
271     template <class FSM,class EVT,class SourceState,class TargetState>
272     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
273     {
274         cout << "player::resume_playback" << endl;
275     }
276 };
BOOST_MSM_EUML_ACTION(stop_and_open)277 BOOST_MSM_EUML_ACTION(stop_and_open)
278 {
279     template <class FSM,class EVT,class SourceState,class TargetState>
280     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
281     {
282         cout << "player::stop_and_open" << endl;
283     }
284 };
BOOST_MSM_EUML_ACTION(stopped_again)285 BOOST_MSM_EUML_ACTION(stopped_again)
286 {
287     template <class FSM,class EVT,class SourceState,class TargetState>
288     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
289     {
290         cout << "player::stopped_again" << endl;
291     }
292 };
293 
BOOST_MSM_EUML_ACTION(report_error)294 BOOST_MSM_EUML_ACTION(report_error)
295 {
296     template <class FSM,class EVT,class SourceState,class TargetState>
297     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
298     {
299         cout << "player::report_error" << endl;
300     }
301 };
302 
BOOST_MSM_EUML_ACTION(report_end_error)303 BOOST_MSM_EUML_ACTION(report_end_error)
304 {
305     template <class FSM,class EVT,class SourceState,class TargetState>
306     void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
307     {
308         cout << "player::report_end_error" << endl;
309     }
310 };
BOOST_MSM_EUML_ACTION(internal_action1)311 BOOST_MSM_EUML_ACTION(internal_action1)
312 {
313     template <class FSM,class EVT,class SourceState,class TargetState>
314     void operator()(EVT const&, FSM& ,SourceState& ,TargetState& )
315     {
316         cout << "Open::internal action1" << endl;
317     }
318 };
BOOST_MSM_EUML_ACTION(internal_action2)319 BOOST_MSM_EUML_ACTION(internal_action2)
320 {
321     template <class FSM,class EVT,class SourceState,class TargetState>
322     void operator()(EVT const&, FSM& ,SourceState& ,TargetState& )
323     {
324         cout << "Open::internal action2" << endl;
325     }
326 };
BOOST_MSM_EUML_ACTION(internal_action)327 BOOST_MSM_EUML_ACTION(internal_action)
328 {
329     template <class FSM,class EVT,class SourceState,class TargetState>
330     void operator()(EVT const&, FSM& ,SourceState& ,TargetState& )
331     {
332         cout << "Open::internal action" << endl;
333     }
334 };
335 enum DiskTypeEnum
336 {
337     DISK_CD=0,
338     DISK_DVD=1
339 };
340 
341 // Handler called when no_transition detected
BOOST_MSM_EUML_ACTION(Log_No_Transition)342 BOOST_MSM_EUML_ACTION(Log_No_Transition)
343 {
344     template <class FSM,class Event>
345     void operator()(Event const& e,FSM&,int state)
346     {
347         std::cout << "no transition from state " << state
348             << " on event " << typeid(e).name() << std::endl;
349     }
350 };
351 
BOOST_MSM_EUML_ACTION(internal_guard1)352 BOOST_MSM_EUML_ACTION(internal_guard1)
353 {
354     template <class FSM,class EVT,class SourceState,class TargetState>
355     bool operator()(EVT const&, FSM& ,SourceState& ,TargetState& )
356     {
357         cout << "Open::internal guard1" << endl;
358         return false;
359     }
360 };
BOOST_MSM_EUML_ACTION(internal_guard2)361 BOOST_MSM_EUML_ACTION(internal_guard2)
362 {
363     template <class FSM,class EVT,class SourceState,class TargetState>
364     bool operator()(EVT const&, FSM& ,SourceState& ,TargetState& )
365     {
366         cout << "Open::internal guard2" << endl;
367         return false;
368     }
369 };
370 #endif // LOGGING_FUNCTORS
371