Chris@16
|
1 // Copyright 2008 Christophe Henry
|
Chris@16
|
2 // henry UNDERSCORE christophe AT hotmail DOT com
|
Chris@16
|
3 // This is an extended version of the state machine available in the boost::mpl library
|
Chris@16
|
4 // Distributed under the same license as the original.
|
Chris@16
|
5 // Copyright for the original version:
|
Chris@16
|
6 // Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed
|
Chris@16
|
7 // under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
8 // file LICENSE_1_0.txt or copy at
|
Chris@16
|
9 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_MSM_FRONT_EUML_GUARD_GRAMMAR_H
|
Chris@16
|
12 #define BOOST_MSM_FRONT_EUML_GUARD_GRAMMAR_H
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/msm/front/euml/common.hpp>
|
Chris@16
|
15 #include <boost/msm/front/euml/operator.hpp>
|
Chris@16
|
16 #include <boost/msm/front/euml/state_grammar.hpp>
|
Chris@16
|
17
|
Chris@16
|
18 namespace boost { namespace msm { namespace front { namespace euml
|
Chris@16
|
19 {
|
Chris@16
|
20 struct BuildGuards;
|
Chris@16
|
21 struct BuildActions;
|
Chris@16
|
22
|
Chris@16
|
23 struct BuildGuardsCases
|
Chris@16
|
24 {
|
Chris@16
|
25 // The primary template matches nothing:
|
Chris@16
|
26 template<typename Tag>
|
Chris@16
|
27 struct case_
|
Chris@16
|
28 : proto::not_<proto::_>
|
Chris@16
|
29 {};
|
Chris@16
|
30 };
|
Chris@16
|
31 template<>
|
Chris@16
|
32 struct BuildGuardsCases::case_<proto::tag::logical_or>
|
Chris@16
|
33 : proto::when<
|
Chris@16
|
34 proto::logical_or<BuildGuards,BuildGuards >,
|
Chris@16
|
35 Or_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
36 >
|
Chris@16
|
37 {};
|
Chris@16
|
38 template<>
|
Chris@16
|
39 struct BuildGuardsCases::case_<proto::tag::logical_and>
|
Chris@16
|
40 : proto::when<
|
Chris@16
|
41 proto::logical_and<BuildGuards,BuildGuards >,
|
Chris@16
|
42 And_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
43 >
|
Chris@16
|
44 {};
|
Chris@16
|
45 template<>
|
Chris@16
|
46 struct BuildGuardsCases::case_<proto::tag::logical_not>
|
Chris@16
|
47 : proto::when<
|
Chris@16
|
48 proto::logical_not<BuildGuards >,
|
Chris@16
|
49 Not_<BuildGuards(proto::_child)>()
|
Chris@16
|
50 >
|
Chris@16
|
51 {};
|
Chris@16
|
52 template<>
|
Chris@16
|
53 struct BuildGuardsCases::case_<proto::tag::less>
|
Chris@16
|
54 : proto::when<
|
Chris@16
|
55 proto::less<BuildGuards, BuildGuards >,
|
Chris@16
|
56 Less_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
57 >
|
Chris@16
|
58 {};
|
Chris@16
|
59 template<>
|
Chris@16
|
60 struct BuildGuardsCases::case_<proto::tag::less_equal>
|
Chris@16
|
61 : proto::when<
|
Chris@16
|
62 proto::less_equal<BuildGuards, BuildGuards >,
|
Chris@16
|
63 LessEqual_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
64 >
|
Chris@16
|
65 {};
|
Chris@16
|
66 template<>
|
Chris@16
|
67 struct BuildGuardsCases::case_<proto::tag::greater>
|
Chris@16
|
68 : proto::when<
|
Chris@16
|
69 proto::greater<BuildGuards, BuildGuards >,
|
Chris@16
|
70 Greater_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
71 >
|
Chris@16
|
72 {};
|
Chris@16
|
73 template<>
|
Chris@16
|
74 struct BuildGuardsCases::case_<proto::tag::greater_equal>
|
Chris@16
|
75 : proto::when<
|
Chris@16
|
76 proto::greater_equal<BuildGuards, BuildGuards >,
|
Chris@16
|
77 GreaterEqual_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
78 >
|
Chris@16
|
79 {};
|
Chris@16
|
80 template<>
|
Chris@16
|
81 struct BuildGuardsCases::case_<proto::tag::equal_to>
|
Chris@16
|
82 : proto::when<
|
Chris@16
|
83 proto::equal_to<BuildGuards, BuildGuards >,
|
Chris@16
|
84 EqualTo_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
85 >
|
Chris@16
|
86 {};
|
Chris@16
|
87 template<>
|
Chris@16
|
88 struct BuildGuardsCases::case_<proto::tag::not_equal_to>
|
Chris@16
|
89 : proto::when<
|
Chris@16
|
90 proto::not_equal_to<BuildGuards, BuildGuards >,
|
Chris@16
|
91 NotEqualTo_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
92 >
|
Chris@16
|
93 {};
|
Chris@16
|
94 template<>
|
Chris@16
|
95 struct BuildGuardsCases::case_<proto::tag::pre_inc>
|
Chris@16
|
96 : proto::when<
|
Chris@16
|
97 proto::pre_inc<BuildGuards >,
|
Chris@16
|
98 Pre_inc_<BuildGuards(proto::_child)>()
|
Chris@16
|
99 >
|
Chris@16
|
100 {};
|
Chris@16
|
101 template<>
|
Chris@16
|
102 struct BuildGuardsCases::case_<proto::tag::dereference>
|
Chris@16
|
103 : proto::when<
|
Chris@16
|
104 proto::dereference<BuildGuards >,
|
Chris@16
|
105 Deref_<BuildGuards(proto::_child)>()
|
Chris@16
|
106 >
|
Chris@16
|
107 {};
|
Chris@16
|
108 template<>
|
Chris@16
|
109 struct BuildGuardsCases::case_<proto::tag::pre_dec>
|
Chris@16
|
110 : proto::when<
|
Chris@16
|
111 proto::pre_dec<BuildGuards >,
|
Chris@16
|
112 Pre_dec_<BuildGuards(proto::_child)>()
|
Chris@16
|
113 >
|
Chris@16
|
114 {};
|
Chris@16
|
115 template<>
|
Chris@16
|
116 struct BuildGuardsCases::case_<proto::tag::post_inc>
|
Chris@16
|
117 : proto::when<
|
Chris@16
|
118 proto::post_inc<BuildGuards >,
|
Chris@16
|
119 Post_inc_<BuildGuards(proto::_child)>()
|
Chris@16
|
120 >
|
Chris@16
|
121 {};
|
Chris@16
|
122 template<>
|
Chris@16
|
123 struct BuildGuardsCases::case_<proto::tag::post_dec>
|
Chris@16
|
124 : proto::when<
|
Chris@16
|
125 proto::post_dec<BuildGuards >,
|
Chris@16
|
126 Post_dec_<BuildGuards(proto::_child)>()
|
Chris@16
|
127 >
|
Chris@16
|
128 {};
|
Chris@16
|
129 template<>
|
Chris@16
|
130 struct BuildGuardsCases::case_<proto::tag::plus>
|
Chris@16
|
131 : proto::when<
|
Chris@16
|
132 proto::plus<BuildGuards,BuildGuards >,
|
Chris@16
|
133 Plus_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
134 >
|
Chris@16
|
135 {};
|
Chris@16
|
136 template<>
|
Chris@16
|
137 struct BuildGuardsCases::case_<proto::tag::minus>
|
Chris@16
|
138 : proto::when<
|
Chris@16
|
139 proto::minus<BuildGuards,BuildGuards >,
|
Chris@16
|
140 Minus_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
141 >
|
Chris@16
|
142 {};
|
Chris@16
|
143 template<>
|
Chris@16
|
144 struct BuildGuardsCases::case_<proto::tag::multiplies>
|
Chris@16
|
145 : proto::when<
|
Chris@16
|
146 proto::multiplies<BuildGuards,BuildGuards >,
|
Chris@16
|
147 Multiplies_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
148 >
|
Chris@16
|
149 {};
|
Chris@16
|
150 template<>
|
Chris@16
|
151 struct BuildGuardsCases::case_<proto::tag::divides>
|
Chris@16
|
152 : proto::when<
|
Chris@16
|
153 proto::divides<BuildGuards,BuildGuards >,
|
Chris@16
|
154 Divides_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
155 >
|
Chris@16
|
156 {};
|
Chris@16
|
157 template<>
|
Chris@16
|
158 struct BuildGuardsCases::case_<proto::tag::modulus>
|
Chris@16
|
159 : proto::when<
|
Chris@16
|
160 proto::modulus<BuildGuards,BuildGuards >,
|
Chris@16
|
161 Modulus_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
162 >
|
Chris@16
|
163 {};
|
Chris@16
|
164 template<>
|
Chris@16
|
165 struct BuildGuardsCases::case_<proto::tag::bitwise_and>
|
Chris@16
|
166 : proto::when<
|
Chris@16
|
167 proto::bitwise_and<BuildGuards,BuildGuards >,
|
Chris@16
|
168 Bitwise_And_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
169 >
|
Chris@16
|
170 {};
|
Chris@16
|
171 template<>
|
Chris@16
|
172 struct BuildGuardsCases::case_<proto::tag::bitwise_or>
|
Chris@16
|
173 : proto::when<
|
Chris@16
|
174 proto::bitwise_or<BuildGuards,BuildGuards >,
|
Chris@16
|
175 Bitwise_Or_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
176 >
|
Chris@16
|
177 {};
|
Chris@16
|
178 template<>
|
Chris@16
|
179 struct BuildGuardsCases::case_<proto::tag::subscript>
|
Chris@16
|
180 : proto::when<
|
Chris@16
|
181 proto::subscript<BuildGuards,BuildGuards >,
|
Chris@16
|
182 Subscript_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
183 >
|
Chris@16
|
184 {};
|
Chris@16
|
185 template<>
|
Chris@16
|
186 struct BuildGuardsCases::case_<proto::tag::plus_assign>
|
Chris@16
|
187 : proto::when<
|
Chris@16
|
188 proto::plus_assign<BuildGuards,BuildGuards >,
|
Chris@16
|
189 Plus_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
190 >
|
Chris@16
|
191 {};
|
Chris@16
|
192 template<>
|
Chris@16
|
193 struct BuildGuardsCases::case_<proto::tag::minus_assign>
|
Chris@16
|
194 : proto::when<
|
Chris@16
|
195 proto::minus_assign<BuildGuards,BuildGuards >,
|
Chris@16
|
196 Minus_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
197 >
|
Chris@16
|
198 {};
|
Chris@16
|
199 template<>
|
Chris@16
|
200 struct BuildGuardsCases::case_<proto::tag::multiplies_assign>
|
Chris@16
|
201 : proto::when<
|
Chris@16
|
202 proto::multiplies_assign<BuildGuards,BuildGuards >,
|
Chris@16
|
203 Multiplies_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
204 >
|
Chris@16
|
205 {};
|
Chris@16
|
206 template<>
|
Chris@16
|
207 struct BuildGuardsCases::case_<proto::tag::divides_assign>
|
Chris@16
|
208 : proto::when<
|
Chris@16
|
209 proto::divides_assign<BuildGuards,BuildGuards >,
|
Chris@16
|
210 Divides_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
211 >
|
Chris@16
|
212 {};
|
Chris@16
|
213 template<>
|
Chris@16
|
214 struct BuildGuardsCases::case_<proto::tag::modulus_assign>
|
Chris@16
|
215 : proto::when<
|
Chris@16
|
216 proto::modulus_assign<BuildGuards,BuildGuards >,
|
Chris@16
|
217 Modulus_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
218 >
|
Chris@16
|
219 {};
|
Chris@16
|
220 template<>
|
Chris@16
|
221 struct BuildGuardsCases::case_<proto::tag::shift_left_assign>
|
Chris@16
|
222 : proto::when<
|
Chris@16
|
223 proto::shift_left_assign<BuildGuards,BuildGuards >,
|
Chris@16
|
224 ShiftLeft_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
225 >
|
Chris@16
|
226 {};
|
Chris@16
|
227 template<>
|
Chris@16
|
228 struct BuildGuardsCases::case_<proto::tag::shift_right_assign>
|
Chris@16
|
229 : proto::when<
|
Chris@16
|
230 proto::shift_right_assign<BuildGuards,BuildGuards >,
|
Chris@16
|
231 ShiftRight_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
232 >
|
Chris@16
|
233 {};
|
Chris@16
|
234 template<>
|
Chris@16
|
235 struct BuildGuardsCases::case_<proto::tag::shift_left>
|
Chris@16
|
236 : proto::when<
|
Chris@16
|
237 proto::shift_left<BuildGuards,BuildGuards >,
|
Chris@16
|
238 ShiftLeft_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
239 >
|
Chris@16
|
240 {};
|
Chris@16
|
241 template<>
|
Chris@16
|
242 struct BuildGuardsCases::case_<proto::tag::shift_right>
|
Chris@16
|
243 : proto::when<
|
Chris@16
|
244 proto::shift_right<BuildGuards,BuildGuards >,
|
Chris@16
|
245 ShiftRight_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
246 >
|
Chris@16
|
247 {};
|
Chris@16
|
248 template<>
|
Chris@16
|
249 struct BuildGuardsCases::case_<proto::tag::assign>
|
Chris@16
|
250 : proto::when<
|
Chris@16
|
251 proto::assign<BuildGuards,BuildGuards >,
|
Chris@16
|
252 Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
253 >
|
Chris@16
|
254 {};
|
Chris@16
|
255 template<>
|
Chris@16
|
256 struct BuildGuardsCases::case_<proto::tag::bitwise_xor>
|
Chris@16
|
257 : proto::when<
|
Chris@16
|
258 proto::bitwise_xor<BuildGuards,BuildGuards >,
|
Chris@16
|
259 Bitwise_Xor_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
|
Chris@16
|
260 >
|
Chris@16
|
261 {};
|
Chris@16
|
262 template<>
|
Chris@16
|
263 struct BuildGuardsCases::case_<proto::tag::negate>
|
Chris@16
|
264 : proto::when<
|
Chris@16
|
265 proto::negate<BuildGuards >,
|
Chris@16
|
266 Unary_Minus_<BuildGuards(proto::_child)>()
|
Chris@16
|
267 >
|
Chris@16
|
268 {};
|
Chris@16
|
269
|
Chris@16
|
270 template<>
|
Chris@16
|
271 struct BuildGuardsCases::case_<proto::tag::function>
|
Chris@16
|
272 : proto::or_<
|
Chris@16
|
273 proto::when<
|
Chris@16
|
274 proto::function<proto::terminal<if_tag>,BuildGuards,BuildGuards,BuildGuards >,
|
Chris@16
|
275 If_Else_<BuildGuards(proto::_child_c<1>),
|
Chris@16
|
276 BuildGuards(proto::_child_c<2>),
|
Chris@16
|
277 BuildGuards(proto::_child_c<3>) >()
|
Chris@16
|
278 >,
|
Chris@16
|
279 proto::when<
|
Chris@16
|
280 proto::function<proto::terminal<proto::_> >,
|
Chris@16
|
281 get_fct<proto::_child_c<0> >()
|
Chris@16
|
282 >,
|
Chris@16
|
283 proto::when<
|
Chris@16
|
284 proto::function<proto::terminal<proto::_>,BuildActions >,
|
Chris@16
|
285 get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>) >()
|
Chris@16
|
286 >,
|
Chris@16
|
287 proto::when<
|
Chris@16
|
288 proto::function<proto::terminal<proto::_>,BuildActions,BuildActions >,
|
Chris@16
|
289 get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) >()
|
Chris@16
|
290 >,
|
Chris@16
|
291 proto::when<
|
Chris@16
|
292 proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions >,
|
Chris@16
|
293 get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>)
|
Chris@16
|
294 ,BuildActions(proto::_child_c<2>),BuildActions(proto::_child_c<3>) >()
|
Chris@16
|
295 >,
|
Chris@16
|
296 proto::when<
|
Chris@16
|
297 proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions >,
|
Chris@16
|
298 get_fct<proto::_child_c<0>
|
Chris@16
|
299 ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
|
Chris@16
|
300 ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>) >()
|
Chris@16
|
301 >,
|
Chris@16
|
302 proto::when<
|
Chris@16
|
303 proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >,
|
Chris@16
|
304 get_fct<proto::_child_c<0>
|
Chris@16
|
305 ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
|
Chris@16
|
306 ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>),BuildActions(proto::_child_c<5>) >()
|
Chris@16
|
307 >
|
Chris@16
|
308 #ifdef BOOST_MSVC
|
Chris@16
|
309 ,proto::when<
|
Chris@16
|
310 proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >,
|
Chris@16
|
311 get_fct<proto::_child_c<0>
|
Chris@16
|
312 ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
|
Chris@16
|
313 ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>)
|
Chris@16
|
314 ,BuildActions(proto::_child_c<5>),BuildActions(proto::_child_c<6>) >()
|
Chris@16
|
315 >
|
Chris@16
|
316 #endif
|
Chris@16
|
317 >
|
Chris@16
|
318 {};
|
Chris@16
|
319
|
Chris@16
|
320 template<>
|
Chris@16
|
321 struct BuildGuardsCases::case_<proto::tag::terminal>
|
Chris@16
|
322 : proto::or_<
|
Chris@16
|
323 proto::when <
|
Chris@16
|
324 proto::terminal<action_tag>,
|
Chris@16
|
325 get_action_name<proto::_ >()
|
Chris@16
|
326 >,
|
Chris@16
|
327 proto::when<
|
Chris@16
|
328 proto::terminal<state_tag>,
|
Chris@16
|
329 get_state_name<proto::_>()
|
Chris@16
|
330 >,
|
Chris@16
|
331 proto::when<
|
Chris@16
|
332 proto::terminal<flag_tag>,
|
Chris@16
|
333 proto::_
|
Chris@16
|
334 >,
|
Chris@16
|
335 proto::when<
|
Chris@16
|
336 proto::terminal<event_tag>,
|
Chris@16
|
337 proto::_
|
Chris@16
|
338 >,
|
Chris@16
|
339 proto::when<
|
Chris@16
|
340 proto::terminal<fsm_artefact_tag>,
|
Chris@16
|
341 get_fct<proto::_ >()
|
Chris@16
|
342 >,
|
Chris@16
|
343 proto::when<
|
Chris@16
|
344 proto::terminal<proto::_>,
|
Chris@16
|
345 proto::_value
|
Chris@16
|
346 >
|
Chris@16
|
347 >
|
Chris@16
|
348 {};
|
Chris@16
|
349
|
Chris@16
|
350 struct BuildGuards
|
Chris@16
|
351 : proto::switch_<BuildGuardsCases>
|
Chris@16
|
352 {};
|
Chris@16
|
353
|
Chris@16
|
354 }}}}
|
Chris@16
|
355
|
Chris@16
|
356 #endif //BOOST_MSM_FRONT_EUML_GUARD_GRAMMAR_H
|