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_STATE_GRAMMAR_H
|
Chris@16
|
12 #define BOOST_MSM_FRONT_EUML_STATE_GRAMMAR_H
|
Chris@16
|
13
|
Chris@16
|
14 #ifdef BOOST_MSM_EUML_PHOENIX_SUPPORT
|
Chris@16
|
15 #include <boost/phoenix/core/meta_grammar.hpp>
|
Chris@16
|
16 #endif
|
Chris@16
|
17
|
Chris@16
|
18 #include <boost/msm/front/euml/common.hpp>
|
Chris@16
|
19 #include <boost/fusion/container/vector.hpp>
|
Chris@16
|
20 #include <boost/fusion/include/pair.hpp>
|
Chris@16
|
21 #include <boost/fusion/include/as_map.hpp>
|
Chris@16
|
22
|
Chris@16
|
23 #include <boost/mpl/remove_if.hpp>
|
Chris@16
|
24 #include <boost/mpl/eval_if.hpp>
|
Chris@16
|
25 #include <boost/mpl/assert.hpp>
|
Chris@16
|
26
|
Chris@16
|
27 #include <boost/msm/row_tags.hpp>
|
Chris@16
|
28 #include <boost/msm/front/common_states.hpp>
|
Chris@16
|
29 #include <boost/msm/front/state_machine_def.hpp>
|
Chris@16
|
30 #include <boost/msm/front/euml/operator.hpp>
|
Chris@16
|
31 #include <boost/msm/front/euml/guard_grammar.hpp>
|
Chris@16
|
32
|
Chris@16
|
33 BOOST_MPL_HAS_XXX_TRAIT_DEF(attribute_tag)
|
Chris@16
|
34 BOOST_MPL_HAS_XXX_TRAIT_DEF(flag_create_tag)
|
Chris@16
|
35 BOOST_MPL_HAS_XXX_TRAIT_DEF(defer_create_tag)
|
Chris@16
|
36 BOOST_MPL_HAS_XXX_TRAIT_DEF(control_configure_tag)
|
Chris@16
|
37
|
Chris@16
|
38 namespace proto = boost::proto;
|
Chris@16
|
39
|
Chris@16
|
40 namespace boost { namespace msm { namespace front { namespace euml
|
Chris@16
|
41 {
|
Chris@16
|
42
|
Chris@16
|
43 // provides the typedefs and interface. Concrete states derive from it.
|
Chris@16
|
44 template<class StateNameTag,
|
Chris@16
|
45 class EntryFunctor=NoAction,
|
Chris@16
|
46 class ExitFunctor=NoAction,
|
Chris@16
|
47 class Attributes= ::boost::fusion::vector<>,
|
Chris@16
|
48 class Flags = ::boost::mpl::vector0<>,
|
Chris@16
|
49 class Defer = ::boost::mpl::vector0<>,
|
Chris@16
|
50 class BASE = ::boost::msm::front::default_base_state>
|
Chris@16
|
51 struct func_state : public ::boost::msm::front::detail::state_base<BASE,Attributes>,
|
Chris@16
|
52 euml_state_intern<func_state<StateNameTag,EntryFunctor,ExitFunctor,Attributes,Flags,Defer,BASE> >
|
Chris@16
|
53 {
|
Chris@16
|
54 func_state(){}
|
Chris@16
|
55 // grammar testing
|
Chris@16
|
56 BOOST_MPL_ASSERT_NOT(( boost::is_same<EntryFunctor,invalid_type> ));
|
Chris@16
|
57 BOOST_MPL_ASSERT_NOT(( boost::is_same<ExitFunctor,invalid_type> ));
|
Chris@16
|
58
|
Chris@16
|
59 typedef StateNameTag state_name_tag;
|
Chris@16
|
60 // flags
|
Chris@16
|
61 typedef Flags flag_list;
|
Chris@16
|
62 typedef ::boost::mpl::vector0<> internal_flag_list;
|
Chris@16
|
63 // deferred events
|
Chris@16
|
64 typedef Defer deferred_events;
|
Chris@16
|
65
|
Chris@16
|
66 template <class Event,class FSM>
|
Chris@16
|
67 void on_entry(Event const& evt,FSM& fsm)
|
Chris@16
|
68 {
|
Chris@16
|
69 EntryFunctor()(evt,fsm,*this);
|
Chris@16
|
70 }
|
Chris@16
|
71 template <class Event,class FSM>
|
Chris@16
|
72 void on_exit(Event const& evt,FSM& fsm)
|
Chris@16
|
73 {
|
Chris@16
|
74 ExitFunctor()(evt,fsm,*this);
|
Chris@16
|
75 }
|
Chris@16
|
76 };
|
Chris@16
|
77
|
Chris@16
|
78 // provides the typedefs and interface. Concrete states derive from it.
|
Chris@16
|
79 template<class StateNameTag,
|
Chris@16
|
80 int ZoneIndex=-1,
|
Chris@16
|
81 class EntryFunctor=NoAction,
|
Chris@16
|
82 class ExitFunctor=NoAction,
|
Chris@16
|
83 class Attributes= ::boost::fusion::vector<>,
|
Chris@16
|
84 class Flags = ::boost::mpl::vector0<>,
|
Chris@16
|
85 class Defer = ::boost::mpl::vector0<>,
|
Chris@16
|
86 class BASE = default_base_state>
|
Chris@16
|
87 struct entry_func_state : public ::boost::msm::front::detail::state_base<BASE,Attributes>,
|
Chris@16
|
88 euml_state_intern<entry_func_state<StateNameTag,ZoneIndex,EntryFunctor,ExitFunctor,Attributes,Flags,Defer,BASE> >
|
Chris@16
|
89 {
|
Chris@16
|
90 entry_func_state(){}
|
Chris@16
|
91 // grammar testing
|
Chris@16
|
92 BOOST_MPL_ASSERT_NOT(( boost::is_same<EntryFunctor,invalid_type> ));
|
Chris@16
|
93 BOOST_MPL_ASSERT_NOT(( boost::is_same<ExitFunctor,invalid_type> ));
|
Chris@16
|
94
|
Chris@16
|
95 typedef StateNameTag state_name_tag;
|
Chris@16
|
96 // tags
|
Chris@16
|
97 typedef int pseudo_entry;
|
Chris@16
|
98 enum {zone_index=ZoneIndex};
|
Chris@16
|
99 typedef int explicit_entry_state;
|
Chris@16
|
100
|
Chris@16
|
101 // flags
|
Chris@16
|
102 typedef Flags flag_list;
|
Chris@16
|
103 typedef ::boost::mpl::vector0<> internal_flag_list;
|
Chris@16
|
104 // deferred events
|
Chris@16
|
105 typedef Defer deferred_events;
|
Chris@16
|
106
|
Chris@16
|
107 template <class Event,class FSM>
|
Chris@16
|
108 void on_entry(Event const& evt,FSM& fsm)
|
Chris@16
|
109 {
|
Chris@16
|
110 EntryFunctor()(evt,fsm,*this);
|
Chris@16
|
111 }
|
Chris@16
|
112 template <class Event,class FSM>
|
Chris@16
|
113 void on_exit(Event const& evt,FSM& fsm)
|
Chris@16
|
114 {
|
Chris@16
|
115 ExitFunctor()(evt,fsm,*this);
|
Chris@16
|
116 }
|
Chris@16
|
117 };
|
Chris@16
|
118 // provides the typedefs and interface. Concrete states derive from it.
|
Chris@16
|
119 template<class StateNameTag,
|
Chris@16
|
120 int ZoneIndex=-1,
|
Chris@16
|
121 class EntryFunctor=NoAction,
|
Chris@16
|
122 class ExitFunctor=NoAction,
|
Chris@16
|
123 class Attributes= ::boost::fusion::vector<>,
|
Chris@16
|
124 class Flags = ::boost::mpl::vector0<>,
|
Chris@16
|
125 class Defer = ::boost::mpl::vector0<>,
|
Chris@16
|
126 class BASE = default_base_state>
|
Chris@16
|
127 struct explicit_entry_func_state : public ::boost::msm::front::detail::state_base<BASE,Attributes>,
|
Chris@16
|
128 public ::boost::msm::front::explicit_entry<ZoneIndex>,
|
Chris@16
|
129 euml_state_intern<explicit_entry_func_state<StateNameTag,
|
Chris@16
|
130 ZoneIndex,EntryFunctor,ExitFunctor,Attributes,Flags,Defer,BASE> >
|
Chris@16
|
131 {
|
Chris@16
|
132 explicit_entry_func_state(){}
|
Chris@16
|
133 // grammar testing
|
Chris@16
|
134 BOOST_MPL_ASSERT_NOT(( boost::is_same<EntryFunctor,invalid_type> ));
|
Chris@16
|
135 BOOST_MPL_ASSERT_NOT(( boost::is_same<ExitFunctor,invalid_type> ));
|
Chris@16
|
136
|
Chris@16
|
137 typedef StateNameTag state_name_tag;
|
Chris@16
|
138 // flags
|
Chris@16
|
139 typedef Flags flag_list;
|
Chris@16
|
140 typedef ::boost::mpl::vector0<> internal_flag_list;
|
Chris@16
|
141 // deferred events
|
Chris@16
|
142 typedef Defer deferred_events;
|
Chris@16
|
143
|
Chris@16
|
144 template <class Event,class FSM>
|
Chris@16
|
145 void on_entry(Event const& evt,FSM& fsm)
|
Chris@16
|
146 {
|
Chris@16
|
147 EntryFunctor()(evt,fsm,*this);
|
Chris@16
|
148 }
|
Chris@16
|
149 template <class Event,class FSM>
|
Chris@16
|
150 void on_exit(Event const& evt,FSM& fsm)
|
Chris@16
|
151 {
|
Chris@16
|
152 ExitFunctor()(evt,fsm,*this);
|
Chris@16
|
153 }
|
Chris@16
|
154 };
|
Chris@16
|
155
|
Chris@16
|
156 // provides the typedefs and interface. Concrete states derive from it.
|
Chris@16
|
157 template<class StateNameTag,
|
Chris@16
|
158 class Event,
|
Chris@16
|
159 class EntryFunctor=NoAction,
|
Chris@16
|
160 class ExitFunctor=NoAction,
|
Chris@16
|
161 class Attributes= ::boost::fusion::vector<>,
|
Chris@16
|
162 class Flags = ::boost::mpl::vector0<>,
|
Chris@16
|
163 class Defer = ::boost::mpl::vector0<>,
|
Chris@16
|
164 class BASE = default_base_state>
|
Chris@16
|
165 struct exit_func_state : public ::boost::msm::front::detail::state_base<BASE,Attributes>,
|
Chris@16
|
166 euml_state_intern<exit_func_state<StateNameTag,Event,EntryFunctor,ExitFunctor,Attributes,Flags,Defer,BASE> >
|
Chris@16
|
167 {
|
Chris@16
|
168 exit_func_state(){}
|
Chris@16
|
169 // grammar testing
|
Chris@16
|
170 BOOST_MPL_ASSERT_NOT(( boost::is_same<EntryFunctor,invalid_type> ));
|
Chris@16
|
171 BOOST_MPL_ASSERT_NOT(( boost::is_same<ExitFunctor,invalid_type> ));
|
Chris@16
|
172
|
Chris@16
|
173 typedef StateNameTag state_name_tag;
|
Chris@16
|
174 // tags
|
Chris@16
|
175 typedef Event event;
|
Chris@16
|
176 typedef BASE Base;
|
Chris@16
|
177 typedef int pseudo_exit;
|
Chris@16
|
178
|
Chris@16
|
179 // flags
|
Chris@16
|
180 typedef Flags flag_list;
|
Chris@16
|
181 typedef ::boost::mpl::vector0<> internal_flag_list;
|
Chris@16
|
182 // deferred events
|
Chris@16
|
183 typedef Defer deferred_events;
|
Chris@16
|
184
|
Chris@16
|
185 template <class Evt,class FSM>
|
Chris@16
|
186 void on_entry(Evt const& evt,FSM& fsm)
|
Chris@16
|
187 {
|
Chris@16
|
188 EntryFunctor()(evt,fsm,*this);
|
Chris@16
|
189 }
|
Chris@16
|
190 template <class Evt,class FSM>
|
Chris@16
|
191 void on_exit(Evt const& evt,FSM& fsm)
|
Chris@16
|
192 {
|
Chris@16
|
193 ExitFunctor()(evt,fsm,*this);
|
Chris@16
|
194 }
|
Chris@16
|
195 };
|
Chris@16
|
196
|
Chris@16
|
197 struct BuildActions;
|
Chris@16
|
198 struct BuildGuards;
|
Chris@16
|
199
|
Chris@16
|
200 struct BuildActionSequence
|
Chris@16
|
201 : proto::or_<
|
Chris@16
|
202 proto::when <
|
Chris@16
|
203 BuildActions,
|
Chris@16
|
204 ActionSequence_<make_vector_one_row<BuildActions(proto::_)>()>()
|
Chris@16
|
205 >,
|
Chris@16
|
206 proto::when <
|
Chris@16
|
207 proto::comma<BuildActions,BuildActions >,
|
Chris@16
|
208 ActionSequence_<boost::mpl::push_back<
|
Chris@16
|
209 make_vector_one_row<BuildActions(proto::_left)>(),
|
Chris@16
|
210 BuildActions(proto::_right)>()>()
|
Chris@16
|
211 >,
|
Chris@16
|
212 proto::when <
|
Chris@16
|
213 proto::comma<BuildActionSequence,BuildActions >,
|
Chris@16
|
214 ActionSequence_<boost::mpl::push_back<
|
Chris@16
|
215 get_sequence<BuildActionSequence(proto::_left) >(),
|
Chris@16
|
216 BuildActions(proto::_right) >() >()
|
Chris@16
|
217 >
|
Chris@16
|
218 >
|
Chris@16
|
219 {};
|
Chris@16
|
220
|
Chris@16
|
221 #ifdef BOOST_MSM_EUML_PHOENIX_SUPPORT
|
Chris@16
|
222 struct CustomPhoenixGrammar
|
Chris@16
|
223 : proto::switch_<CustomPhoenixGrammar>
|
Chris@16
|
224 {
|
Chris@16
|
225 template <typename Tag, typename Dummy = void>
|
Chris@16
|
226 struct case_
|
Chris@16
|
227 : proto::and_<
|
Chris@16
|
228 proto::not_<BuildGuards> ,
|
Chris@16
|
229 proto::not_<BuildActionSequence>,
|
Chris@16
|
230 boost::phoenix::meta_grammar::case_<Tag>
|
Chris@16
|
231 >
|
Chris@16
|
232 {};
|
Chris@16
|
233 };
|
Chris@16
|
234 #endif
|
Chris@16
|
235
|
Chris@16
|
236 struct GuardGrammar
|
Chris@16
|
237 : proto::or_<
|
Chris@16
|
238 #ifdef BOOST_MSM_EUML_PHOENIX_SUPPORT
|
Chris@16
|
239 proto::when<
|
Chris@16
|
240 CustomPhoenixGrammar ,
|
Chris@16
|
241 proto::_
|
Chris@16
|
242 >,
|
Chris@16
|
243 #endif
|
Chris@16
|
244 proto::when<
|
Chris@16
|
245 BuildGuards ,
|
Chris@16
|
246 BuildGuards
|
Chris@16
|
247 >
|
Chris@16
|
248 >
|
Chris@16
|
249 {};
|
Chris@16
|
250
|
Chris@16
|
251 struct ActionGrammar
|
Chris@16
|
252 : proto::or_<
|
Chris@16
|
253 #ifdef BOOST_MSM_EUML_PHOENIX_SUPPORT
|
Chris@16
|
254 proto::when<
|
Chris@16
|
255 CustomPhoenixGrammar ,
|
Chris@16
|
256 proto::_
|
Chris@16
|
257 >,
|
Chris@16
|
258 #endif
|
Chris@16
|
259 proto::when<
|
Chris@16
|
260 BuildActionSequence ,
|
Chris@16
|
261 BuildActionSequence
|
Chris@16
|
262 >
|
Chris@16
|
263 >
|
Chris@16
|
264 {};
|
Chris@16
|
265
|
Chris@16
|
266 struct BuildActionsCases
|
Chris@16
|
267 {
|
Chris@16
|
268 // The primary template matches nothing:
|
Chris@16
|
269 template<typename Tag>
|
Chris@16
|
270 struct case_
|
Chris@16
|
271 : proto::not_<proto::_>
|
Chris@16
|
272 {};
|
Chris@16
|
273 };
|
Chris@16
|
274
|
Chris@16
|
275 template<>
|
Chris@16
|
276 struct BuildActionsCases::case_<proto::tag::pre_inc>
|
Chris@16
|
277 : proto::when<
|
Chris@16
|
278 proto::pre_inc<BuildActions >,
|
Chris@16
|
279 Pre_inc_< BuildActions(proto::_child)>()
|
Chris@16
|
280 >
|
Chris@16
|
281 {};
|
Chris@16
|
282 template<>
|
Chris@16
|
283 struct BuildActionsCases::case_<proto::tag::pre_dec>
|
Chris@16
|
284 : proto::when<
|
Chris@16
|
285 proto::pre_dec<BuildActions >,
|
Chris@16
|
286 Pre_dec_< BuildActions(proto::_child)>()
|
Chris@16
|
287 >
|
Chris@16
|
288 {};
|
Chris@16
|
289 template<>
|
Chris@16
|
290 struct BuildActionsCases::case_<proto::tag::post_inc>
|
Chris@16
|
291 : proto::when<
|
Chris@16
|
292 proto::post_inc<BuildActions >,
|
Chris@16
|
293 Post_inc_< BuildActions(proto::_child)>()
|
Chris@16
|
294 >
|
Chris@16
|
295 {};
|
Chris@16
|
296 template<>
|
Chris@16
|
297 struct BuildActionsCases::case_<proto::tag::post_dec>
|
Chris@16
|
298 : proto::when<
|
Chris@16
|
299 proto::post_dec<BuildActions >,
|
Chris@16
|
300 Post_dec_< BuildActions(proto::_child)>()
|
Chris@16
|
301 >
|
Chris@16
|
302 {};
|
Chris@16
|
303 template<>
|
Chris@16
|
304 struct BuildActionsCases::case_<proto::tag::dereference>
|
Chris@16
|
305 : proto::when<
|
Chris@16
|
306 proto::dereference<BuildActions >,
|
Chris@16
|
307 Deref_< BuildActions(proto::_child)>()
|
Chris@16
|
308 >
|
Chris@16
|
309 {};
|
Chris@16
|
310 template<>
|
Chris@16
|
311 struct BuildActionsCases::case_<proto::tag::plus>
|
Chris@16
|
312 : proto::when<
|
Chris@16
|
313 proto::plus<BuildActions,BuildActions >,
|
Chris@16
|
314 Plus_<BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
315 >
|
Chris@16
|
316 {};
|
Chris@16
|
317 template<>
|
Chris@16
|
318 struct BuildActionsCases::case_<proto::tag::minus>
|
Chris@16
|
319 : proto::when<
|
Chris@16
|
320 proto::minus<BuildActions,BuildActions >,
|
Chris@16
|
321 Minus_<BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
322 >
|
Chris@16
|
323 {};
|
Chris@16
|
324 template<>
|
Chris@16
|
325 struct BuildActionsCases::case_<proto::tag::multiplies>
|
Chris@16
|
326 : proto::when<
|
Chris@16
|
327 proto::multiplies<BuildActions,BuildActions >,
|
Chris@16
|
328 Multiplies_<BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
329 >
|
Chris@16
|
330 {};
|
Chris@16
|
331 template<>
|
Chris@16
|
332 struct BuildActionsCases::case_<proto::tag::divides>
|
Chris@16
|
333 : proto::when<
|
Chris@16
|
334 proto::divides<BuildActions,BuildActions >,
|
Chris@16
|
335 Divides_<BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
336 >
|
Chris@16
|
337 {};
|
Chris@16
|
338 template<>
|
Chris@16
|
339 struct BuildActionsCases::case_<proto::tag::modulus>
|
Chris@16
|
340 : proto::when<
|
Chris@16
|
341 proto::modulus<BuildActions,BuildActions >,
|
Chris@16
|
342 Modulus_<BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
343 >
|
Chris@16
|
344 {};
|
Chris@16
|
345 template<>
|
Chris@16
|
346 struct BuildActionsCases::case_<proto::tag::bitwise_and>
|
Chris@16
|
347 : proto::when<
|
Chris@16
|
348 proto::bitwise_and<BuildActions,BuildActions >,
|
Chris@16
|
349 Bitwise_And_<BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
350 >
|
Chris@16
|
351 {};
|
Chris@16
|
352 template<>
|
Chris@16
|
353 struct BuildActionsCases::case_<proto::tag::bitwise_or>
|
Chris@16
|
354 : proto::when<
|
Chris@16
|
355 proto::bitwise_or<BuildActions,BuildActions >,
|
Chris@16
|
356 Bitwise_Or_<BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
357 >
|
Chris@16
|
358 {};
|
Chris@16
|
359 template<>
|
Chris@16
|
360 struct BuildActionsCases::case_<proto::tag::bitwise_xor>
|
Chris@16
|
361 : proto::when<
|
Chris@16
|
362 proto::bitwise_xor<BuildActions,BuildActions >,
|
Chris@16
|
363 Bitwise_Xor_<BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
364 >
|
Chris@16
|
365 {};
|
Chris@16
|
366
|
Chris@16
|
367 template<>
|
Chris@16
|
368 struct BuildActionsCases::case_<proto::tag::plus_assign>
|
Chris@16
|
369 : proto::when<
|
Chris@16
|
370 proto::plus_assign<BuildActions,BuildActions >,
|
Chris@16
|
371 Plus_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
372 >
|
Chris@16
|
373 {};
|
Chris@16
|
374 template<>
|
Chris@16
|
375 struct BuildActionsCases::case_<proto::tag::minus_assign>
|
Chris@16
|
376 : proto::when<
|
Chris@16
|
377 proto::minus_assign<BuildActions,BuildActions >,
|
Chris@16
|
378 Minus_Assign_<BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
379 >
|
Chris@16
|
380 {};
|
Chris@16
|
381 template<>
|
Chris@16
|
382 struct BuildActionsCases::case_<proto::tag::multiplies_assign>
|
Chris@16
|
383 : proto::when<
|
Chris@16
|
384 proto::multiplies_assign<BuildActions,BuildActions >,
|
Chris@16
|
385 Multiplies_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
386 >
|
Chris@16
|
387 {};
|
Chris@16
|
388 template<>
|
Chris@16
|
389 struct BuildActionsCases::case_<proto::tag::divides_assign>
|
Chris@16
|
390 : proto::when<
|
Chris@16
|
391 proto::divides_assign<BuildActions,BuildActions >,
|
Chris@16
|
392 Divides_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
393 >
|
Chris@16
|
394 {};
|
Chris@16
|
395 template<>
|
Chris@16
|
396 struct BuildActionsCases::case_<proto::tag::modulus_assign>
|
Chris@16
|
397 : proto::when<
|
Chris@16
|
398 proto::modulus_assign<BuildActions,BuildActions >,
|
Chris@16
|
399 Modulus_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
400 >
|
Chris@16
|
401 {};
|
Chris@16
|
402 template<>
|
Chris@16
|
403 struct BuildActionsCases::case_<proto::tag::shift_left_assign>
|
Chris@16
|
404 : proto::when<
|
Chris@16
|
405 proto::shift_left_assign<BuildActions,BuildActions >,
|
Chris@16
|
406 ShiftLeft_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
407 >
|
Chris@16
|
408 {};
|
Chris@16
|
409 template<>
|
Chris@16
|
410 struct BuildActionsCases::case_<proto::tag::shift_right_assign>
|
Chris@16
|
411 : proto::when<
|
Chris@16
|
412 proto::shift_right_assign<BuildActions,BuildActions >,
|
Chris@16
|
413 ShiftRight_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
414 >
|
Chris@16
|
415 {};
|
Chris@16
|
416 template<>
|
Chris@16
|
417 struct BuildActionsCases::case_<proto::tag::shift_left>
|
Chris@16
|
418 : proto::when<
|
Chris@16
|
419 proto::shift_left<BuildActions,BuildActions >,
|
Chris@16
|
420 ShiftLeft_< BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
421 >
|
Chris@16
|
422 {};
|
Chris@16
|
423 template<>
|
Chris@16
|
424 struct BuildActionsCases::case_<proto::tag::shift_right>
|
Chris@16
|
425 : proto::when<
|
Chris@16
|
426 proto::shift_right<BuildActions,BuildActions >,
|
Chris@16
|
427 ShiftRight_< BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
428 >
|
Chris@16
|
429 {};
|
Chris@16
|
430 template<>
|
Chris@16
|
431 struct BuildActionsCases::case_<proto::tag::assign>
|
Chris@16
|
432 : proto::when<
|
Chris@16
|
433 proto::assign<BuildActions,BuildActions >,
|
Chris@16
|
434 Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
435 >
|
Chris@16
|
436 {};
|
Chris@16
|
437 template<>
|
Chris@16
|
438 struct BuildActionsCases::case_<proto::tag::subscript>
|
Chris@16
|
439 : proto::when<
|
Chris@16
|
440 proto::subscript<BuildActions,BuildActions >,
|
Chris@16
|
441 Subscript_< BuildActions(proto::_left),BuildActions(proto::_right)>()
|
Chris@16
|
442 >
|
Chris@16
|
443 {};
|
Chris@16
|
444 template<>
|
Chris@16
|
445 struct BuildActionsCases::case_<proto::tag::unary_plus>
|
Chris@16
|
446 : proto::when<
|
Chris@16
|
447 proto::unary_plus<BuildActions >,
|
Chris@16
|
448 Unary_Plus_< BuildActions(proto::_child)>()
|
Chris@16
|
449 >
|
Chris@16
|
450 {};
|
Chris@16
|
451 template<>
|
Chris@16
|
452 struct BuildActionsCases::case_<proto::tag::negate>
|
Chris@16
|
453 : proto::when<
|
Chris@16
|
454 proto::negate<BuildActions >,
|
Chris@16
|
455 Unary_Minus_< BuildActions(proto::_child)>()
|
Chris@16
|
456 >
|
Chris@16
|
457 {};
|
Chris@16
|
458
|
Chris@16
|
459 template<>
|
Chris@16
|
460 struct BuildActionsCases::case_<proto::tag::function>
|
Chris@16
|
461 : proto::or_<
|
Chris@16
|
462 proto::when<
|
Chris@16
|
463 proto::function<proto::terminal<if_tag>,BuildGuards,BuildActionSequence,BuildActionSequence >,
|
Chris@16
|
464 If_Else_<BuildGuards(proto::_child_c<1>),
|
Chris@16
|
465 BuildActionSequence(proto::_child_c<2>),
|
Chris@16
|
466 BuildActionSequence(proto::_child_c<3>) >()
|
Chris@16
|
467 >,
|
Chris@16
|
468 proto::when<
|
Chris@16
|
469 proto::function<proto::terminal<if_then_tag>,BuildGuards,BuildActionSequence >,
|
Chris@16
|
470 If_Then_<BuildGuards(proto::_child_c<1>),
|
Chris@16
|
471 BuildActionSequence(proto::_child_c<2>)>()
|
Chris@16
|
472 >,
|
Chris@16
|
473 proto::when<
|
Chris@16
|
474 proto::function<proto::terminal<while_do_tag>,BuildGuards,BuildActionSequence >,
|
Chris@16
|
475 While_Do_<BuildGuards(proto::_child_c<1>),
|
Chris@16
|
476 BuildActionSequence(proto::_child_c<2>) >()
|
Chris@16
|
477 >,
|
Chris@16
|
478 proto::when<
|
Chris@16
|
479 proto::function<proto::terminal<do_while_tag>,BuildGuards,BuildActionSequence >,
|
Chris@16
|
480 Do_While_<BuildGuards(proto::_child_c<1>),
|
Chris@16
|
481 BuildActionSequence(proto::_child_c<2>) >()
|
Chris@16
|
482 >,
|
Chris@16
|
483 proto::when<
|
Chris@16
|
484 proto::function<proto::terminal<for_loop_tag>,
|
Chris@16
|
485 BuildActionSequence,BuildGuards,BuildActionSequence,BuildActionSequence>,
|
Chris@16
|
486 For_Loop_<BuildActionSequence(proto::_child_c<1>),
|
Chris@16
|
487 BuildGuards(proto::_child_c<2>),
|
Chris@16
|
488 BuildActionSequence(proto::_child_c<3>),
|
Chris@16
|
489 BuildActionSequence(proto::_child_c<4>) >()
|
Chris@16
|
490 >,
|
Chris@16
|
491 proto::or_<
|
Chris@16
|
492 proto::when<
|
Chris@16
|
493 proto::function<proto::terminal<proto::_>,BuildActions >,
|
Chris@16
|
494 get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>) >()
|
Chris@16
|
495 >,
|
Chris@16
|
496 proto::when<
|
Chris@16
|
497 proto::function<proto::terminal<proto::_> >,
|
Chris@16
|
498 get_fct<proto::_child_c<0> >()
|
Chris@16
|
499 >,
|
Chris@16
|
500 proto::when<
|
Chris@16
|
501 proto::function<proto::terminal<proto::_>,BuildActions,BuildActions >,
|
Chris@16
|
502 get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) >()
|
Chris@16
|
503 >,
|
Chris@16
|
504 proto::when<
|
Chris@16
|
505 proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions >,
|
Chris@16
|
506 get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>)
|
Chris@16
|
507 ,BuildActions(proto::_child_c<2>),BuildActions(proto::_child_c<3>) >()
|
Chris@16
|
508 >,
|
Chris@16
|
509 proto::when<
|
Chris@16
|
510 proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions >,
|
Chris@16
|
511 get_fct<proto::_child_c<0>
|
Chris@16
|
512 ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
|
Chris@16
|
513 ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>) >()
|
Chris@16
|
514 >,
|
Chris@16
|
515 proto::when<
|
Chris@16
|
516 proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >,
|
Chris@16
|
517 get_fct<proto::_child_c<0>
|
Chris@16
|
518 ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
|
Chris@16
|
519 ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>)
|
Chris@16
|
520 ,BuildActions(proto::_child_c<5>) >()
|
Chris@16
|
521 >
|
Chris@16
|
522 #ifdef BOOST_MSVC
|
Chris@16
|
523 ,proto::when<
|
Chris@16
|
524 proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >,
|
Chris@16
|
525 get_fct<proto::_child_c<0>
|
Chris@16
|
526 ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
|
Chris@16
|
527 ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>)
|
Chris@16
|
528 ,BuildActions(proto::_child_c<5>),BuildActions(proto::_child_c<6>) >()
|
Chris@16
|
529 >
|
Chris@16
|
530 #endif
|
Chris@16
|
531 >
|
Chris@16
|
532 >
|
Chris@16
|
533 {};
|
Chris@16
|
534
|
Chris@16
|
535 template<>
|
Chris@16
|
536 struct BuildActionsCases::case_<proto::tag::terminal>
|
Chris@16
|
537 : proto::or_<
|
Chris@16
|
538 proto::when<
|
Chris@16
|
539 proto::terminal<action_tag>,
|
Chris@16
|
540 get_action_name<proto::_ >()
|
Chris@16
|
541 >,
|
Chris@16
|
542 proto::when<
|
Chris@16
|
543 proto::terminal<state_tag>,
|
Chris@16
|
544 get_state_name<proto::_>()
|
Chris@16
|
545 >,
|
Chris@16
|
546 proto::when<
|
Chris@16
|
547 proto::terminal<flag_tag>,
|
Chris@16
|
548 proto::_
|
Chris@16
|
549 >,
|
Chris@16
|
550 proto::when<
|
Chris@16
|
551 proto::terminal<event_tag>,
|
Chris@16
|
552 proto::_
|
Chris@16
|
553 >,
|
Chris@16
|
554 proto::when<
|
Chris@16
|
555 proto::terminal<fsm_artefact_tag>,
|
Chris@16
|
556 get_fct<proto::_ >()
|
Chris@16
|
557 >,
|
Chris@16
|
558 proto::when<
|
Chris@16
|
559 proto::terminal<proto::_>,
|
Chris@16
|
560 proto::_value
|
Chris@16
|
561 >
|
Chris@16
|
562 >
|
Chris@16
|
563 {};
|
Chris@16
|
564 struct BuildActions
|
Chris@16
|
565 : proto::switch_<BuildActionsCases>
|
Chris@16
|
566 {};
|
Chris@16
|
567
|
Chris@16
|
568 // attributes building
|
Chris@16
|
569 #define BOOST_MSM_EUML_DECLARE_ATTRIBUTE(attr_type,attr_name) \
|
Chris@16
|
570 struct attr_name ## _ \
|
Chris@16
|
571 : proto::extends< proto::terminal< ::boost::msm::front::action_tag>::type, attr_name ## _, boost::msm::sm_domain> \
|
Chris@16
|
572 {typedef attr_name ## _ action_name; \
|
Chris@16
|
573 typedef ::boost::fusion::pair<attr_name ## _,attr_type> attribute_type; \
|
Chris@16
|
574 attr_name ## _ (){} \
|
Chris@16
|
575 }; \
|
Chris@16
|
576 attr_name ## _ const attr_name = attr_name ## _();
|
Chris@16
|
577
|
Chris@16
|
578 struct make_attributes_tag
|
Chris@16
|
579 {
|
Chris@16
|
580 typedef int attribute_tag;
|
Chris@16
|
581 };
|
Chris@16
|
582
|
Chris@16
|
583 template <class T>
|
Chris@16
|
584 struct get_attribute_type
|
Chris@16
|
585 {
|
Chris@16
|
586 typedef typename T::attribute_type type;
|
Chris@16
|
587 };
|
Chris@16
|
588 template <class Seq>
|
Chris@16
|
589 struct transform_to_fusion_pair
|
Chris@16
|
590 {
|
Chris@16
|
591 typedef typename ::boost::mpl::fold<
|
Chris@16
|
592 Seq,::boost::mpl::vector<>,
|
Chris@16
|
593 ::boost::mpl::push_back< ::boost::mpl::placeholders::_1,
|
Chris@16
|
594 get_attribute_type< ::boost::mpl::placeholders::_2> >
|
Chris@16
|
595 >::type type;
|
Chris@16
|
596 };
|
Chris@16
|
597
|
Chris@16
|
598 template<class X = proto::is_proto_expr>
|
Chris@16
|
599 struct attribute
|
Chris@16
|
600 {
|
Chris@16
|
601 BOOST_PROTO_BASIC_EXTENDS(
|
Chris@16
|
602 proto::terminal<make_attributes_tag>::type
|
Chris@16
|
603 , attribute
|
Chris@16
|
604 , boost::msm::sm_domain
|
Chris@16
|
605 )
|
Chris@16
|
606 typedef ::boost::fusion::pair<int,int> attribute_type;
|
Chris@16
|
607 };
|
Chris@16
|
608
|
Chris@16
|
609 attribute<> const attributes_ = {{{}}};
|
Chris@16
|
610 attribute<> const no_attributes_ = {{{}}};
|
Chris@16
|
611
|
Chris@16
|
612 struct BuildAttributesHelper
|
Chris@16
|
613 : proto::make<
|
Chris@16
|
614 ::boost::mpl::pop_front<
|
Chris@16
|
615 proto::fold_tree<
|
Chris@16
|
616 proto::_
|
Chris@16
|
617 , ::boost::fusion::vector<>()
|
Chris@16
|
618 , ::boost::mpl::push_back<proto::_state,
|
Chris@16
|
619 ::boost::mpl::if_< has_attribute_tag< proto::_value>,
|
Chris@16
|
620 proto::_value,
|
Chris@16
|
621 get_attribute_type<proto::_> >
|
Chris@16
|
622 >()
|
Chris@16
|
623 >
|
Chris@16
|
624 >
|
Chris@16
|
625 >
|
Chris@16
|
626 {};
|
Chris@16
|
627
|
Chris@16
|
628 struct BuildAttributes
|
Chris@16
|
629 : proto::make<
|
Chris@16
|
630 ::boost::mpl::if_<
|
Chris@16
|
631 has_attribute_tag< ::boost::mpl::deref< ::boost::mpl::prior< ::boost::mpl::end< BuildAttributesHelper > > > >,
|
Chris@16
|
632 ::boost::fusion::result_of::as_map< ::boost::mpl::pop_back< BuildAttributesHelper > >,
|
Chris@16
|
633 ::boost::fusion::result_of::as_map< BuildAttributesHelper > >
|
Chris@16
|
634 >
|
Chris@16
|
635 {};
|
Chris@16
|
636
|
Chris@16
|
637 // helper to build a mpl::vector from a << list
|
Chris@16
|
638 struct BuildMplVectorHelper
|
Chris@16
|
639 : proto::make<
|
Chris@16
|
640 ::boost::mpl::pop_front<
|
Chris@16
|
641 proto::fold_tree<
|
Chris@16
|
642 proto::_
|
Chris@16
|
643 , ::boost::mpl::vector0<>()
|
Chris@16
|
644 , ::boost::mpl::push_back<proto::_state, proto::_>()
|
Chris@16
|
645 >
|
Chris@16
|
646 >
|
Chris@16
|
647 >
|
Chris@16
|
648 {};
|
Chris@16
|
649
|
Chris@16
|
650 // flags building
|
Chris@16
|
651 struct BuildFlags
|
Chris@16
|
652 : proto::make<
|
Chris@16
|
653 ::boost::mpl::remove_if<
|
Chris@16
|
654 BuildMplVectorHelper,
|
Chris@16
|
655 ::boost::mpl::not_< ::boost::is_same<get_euml_tag_type< ::boost::mpl::placeholders::_ >, flag_tag > >
|
Chris@16
|
656 >
|
Chris@16
|
657 >
|
Chris@16
|
658 {};
|
Chris@16
|
659
|
Chris@16
|
660 struct control_configure_tag {};
|
Chris@16
|
661
|
Chris@16
|
662 // configuration building
|
Chris@16
|
663 struct make_configure_tag
|
Chris@16
|
664 {
|
Chris@16
|
665 typedef int control_configure_tag;
|
Chris@16
|
666 };
|
Chris@16
|
667
|
Chris@16
|
668 template<class X = proto::is_proto_expr>
|
Chris@16
|
669 struct configure
|
Chris@16
|
670 {
|
Chris@16
|
671 typedef not_euml_tag euml_tag_type;
|
Chris@16
|
672 BOOST_PROTO_BASIC_EXTENDS(
|
Chris@16
|
673 proto::terminal<make_configure_tag>::type
|
Chris@16
|
674 , configure
|
Chris@16
|
675 , boost::msm::sm_domain
|
Chris@16
|
676 )
|
Chris@16
|
677 };
|
Chris@16
|
678
|
Chris@16
|
679 configure<> const configure_ = {{{}}};
|
Chris@16
|
680 configure<> const no_configure_ = {{{}}};
|
Chris@16
|
681
|
Chris@16
|
682 struct BuildConfigure
|
Chris@16
|
683 : proto::make<
|
Chris@16
|
684 ::boost::mpl::remove_if<
|
Chris@16
|
685 BuildMplVectorHelper,
|
Chris@16
|
686 ::boost::mpl::not_< ::boost::is_same<get_euml_tag_type< ::boost::mpl::placeholders::_ >, config_tag > >
|
Chris@16
|
687 >
|
Chris@16
|
688 >
|
Chris@16
|
689 {};
|
Chris@16
|
690
|
Chris@16
|
691 struct BuildDeferred
|
Chris@16
|
692 : proto::make<
|
Chris@16
|
693 ::boost::mpl::remove_if<
|
Chris@16
|
694 BuildMplVectorHelper,
|
Chris@16
|
695 ::boost::mpl::not_< ::boost::is_same<get_euml_tag_type< ::boost::mpl::placeholders::_ >, event_tag > >
|
Chris@16
|
696 >
|
Chris@16
|
697 >
|
Chris@16
|
698 {};
|
Chris@16
|
699
|
Chris@16
|
700 template<class X = proto::is_proto_expr>
|
Chris@16
|
701 struct define_init
|
Chris@16
|
702 {
|
Chris@16
|
703 typedef int defer_create_tag;
|
Chris@16
|
704 BOOST_PROTO_BASIC_EXTENDS(
|
Chris@16
|
705 proto::terminal<state_tag>::type
|
Chris@16
|
706 , define_init
|
Chris@16
|
707 , boost::msm::sm_domain
|
Chris@16
|
708 )
|
Chris@16
|
709 };
|
Chris@16
|
710
|
Chris@16
|
711 define_init<> const init_ = {{{}}};
|
Chris@16
|
712 struct BuildInit
|
Chris@16
|
713 : proto::make<
|
Chris@16
|
714 ::boost::mpl::pop_front<
|
Chris@16
|
715 proto::fold_tree<
|
Chris@16
|
716 proto::_
|
Chris@16
|
717 , ::boost::mpl::vector0<>()
|
Chris@16
|
718 , ::boost::mpl::push_back<proto::_state, proto::_>()
|
Chris@16
|
719 >
|
Chris@16
|
720 >
|
Chris@16
|
721 >
|
Chris@16
|
722 {};
|
Chris@16
|
723
|
Chris@16
|
724 template <class StateNameTag,class Expr1,class Expr2,class Attr,class Configure,class BASE>
|
Chris@16
|
725 inline
|
Chris@16
|
726 func_state<
|
Chris@16
|
727 StateNameTag,
|
Chris@16
|
728 typename ::boost::mpl::eval_if<
|
Chris@16
|
729 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
730 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
731 make_invalid_type>::type,
|
Chris@16
|
732 typename ::boost::mpl::eval_if<
|
Chris@16
|
733 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
734 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
735 make_invalid_type>::type,
|
Chris@16
|
736 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
737 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
738 typename boost::result_of<BuildDeferred(Configure)>::type,
|
Chris@16
|
739 BASE
|
Chris@16
|
740 >
|
Chris@16
|
741 build_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
|
Chris@16
|
742 {
|
Chris@16
|
743 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
744 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
745 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
746 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
747 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
748 return func_state<StateNameTag,entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
|
Chris@16
|
749 }
|
Chris@16
|
750
|
Chris@16
|
751 template <class StateNameTag,class Expr1,class Expr2,class Attr,class Configure>
|
Chris@16
|
752 inline
|
Chris@16
|
753 func_state<
|
Chris@16
|
754 StateNameTag,
|
Chris@16
|
755 typename ::boost::mpl::eval_if<
|
Chris@16
|
756 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
757 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
758 make_invalid_type>::type,
|
Chris@16
|
759 typename ::boost::mpl::eval_if<
|
Chris@16
|
760 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
761 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
762 make_invalid_type>::type,
|
Chris@16
|
763 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
764 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
765 typename boost::result_of<BuildDeferred(Configure)>::type
|
Chris@16
|
766 >
|
Chris@16
|
767 build_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
|
Chris@16
|
768 {
|
Chris@16
|
769 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
770 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
771 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
772 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
773 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
774 return func_state<StateNameTag,entry_action,exit_action,attributes_type,flags_type,deferred_type>();
|
Chris@16
|
775 }
|
Chris@16
|
776
|
Chris@16
|
777 template <class StateNameTag,class Expr1,class Expr2,class Attr>
|
Chris@16
|
778 inline
|
Chris@16
|
779 func_state<
|
Chris@16
|
780 StateNameTag,
|
Chris@16
|
781 typename ::boost::mpl::eval_if<
|
Chris@16
|
782 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
783 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
784 make_invalid_type>::type,
|
Chris@16
|
785 typename ::boost::mpl::eval_if<
|
Chris@16
|
786 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
787 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
788 make_invalid_type>::type,
|
Chris@16
|
789 typename boost::result_of<BuildAttributes(Attr)>::type
|
Chris@16
|
790 >
|
Chris@16
|
791 build_state(Expr1 const& ,Expr2 const& ,Attr const&)
|
Chris@16
|
792 {
|
Chris@16
|
793 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
794 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
795 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
796 return func_state<StateNameTag,entry_action,exit_action,attributes_type>();
|
Chris@16
|
797 }
|
Chris@16
|
798
|
Chris@16
|
799 template <class StateNameTag,class Expr1,class Expr2>
|
Chris@16
|
800 inline
|
Chris@16
|
801 func_state<
|
Chris@16
|
802 StateNameTag,
|
Chris@16
|
803 typename ::boost::mpl::eval_if<
|
Chris@16
|
804 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
805 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
806 make_invalid_type>::type,
|
Chris@16
|
807 typename ::boost::mpl::eval_if<
|
Chris@16
|
808 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
809 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
810 make_invalid_type>::type
|
Chris@16
|
811 >
|
Chris@16
|
812 build_state(Expr1 const& ,Expr2 const& )
|
Chris@16
|
813 {
|
Chris@16
|
814 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
815 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
816 return func_state<StateNameTag,entry_action,exit_action>();
|
Chris@16
|
817 }
|
Chris@16
|
818
|
Chris@16
|
819 template <class StateNameTag,class Expr1>
|
Chris@16
|
820 inline
|
Chris@16
|
821 func_state<
|
Chris@16
|
822 StateNameTag,
|
Chris@16
|
823 typename ::boost::mpl::eval_if<
|
Chris@16
|
824 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
825 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
826 make_invalid_type>::type,
|
Chris@16
|
827 NoAction
|
Chris@16
|
828 >
|
Chris@16
|
829 build_state(Expr1 const& )
|
Chris@16
|
830 {
|
Chris@16
|
831 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
832 return func_state<StateNameTag,entry_action,NoAction>();
|
Chris@16
|
833 }
|
Chris@16
|
834 template<class StateNameTag>
|
Chris@16
|
835 inline
|
Chris@16
|
836 func_state<
|
Chris@16
|
837 StateNameTag,
|
Chris@16
|
838 NoAction,
|
Chris@16
|
839 NoAction
|
Chris@16
|
840 >
|
Chris@16
|
841 build_state()
|
Chris@16
|
842 {
|
Chris@16
|
843 return func_state<StateNameTag,NoAction,NoAction>();
|
Chris@16
|
844 }
|
Chris@16
|
845
|
Chris@16
|
846 // provides the typedefs and interface. Concrete states derive from it.
|
Chris@16
|
847 template<class StateNameTag,
|
Chris@16
|
848 class STT,
|
Chris@16
|
849 class Init,
|
Chris@16
|
850 class EntryFunctor=NoAction,
|
Chris@16
|
851 class ExitFunctor=NoAction,
|
Chris@16
|
852 class Attributes= ::boost::fusion::vector<>,
|
Chris@16
|
853 class Flags = ::boost::mpl::vector0<>,
|
Chris@16
|
854 class Defer = ::boost::mpl::vector0<>,
|
Chris@16
|
855 class Configuration = ::boost::mpl::vector0<>,
|
Chris@16
|
856 class NoTransitionFunctor = NoAction,
|
Chris@16
|
857 class OnExceptionFunctor = NoAction,
|
Chris@16
|
858 class BASE = ::boost::msm::front::default_base_state>
|
Chris@16
|
859 struct func_state_machine : public ::boost::msm::front::detail::state_base<BASE,Attributes>,
|
Chris@16
|
860 euml_state_intern<func_state_machine<StateNameTag,STT,Init,EntryFunctor,ExitFunctor,Attributes,Flags,
|
Chris@16
|
861 Defer,NoTransitionFunctor,OnExceptionFunctor,BASE> >
|
Chris@16
|
862 {
|
Chris@16
|
863 func_state_machine(){}
|
Chris@16
|
864 // grammar testing
|
Chris@16
|
865 BOOST_MPL_ASSERT_NOT(( boost::is_same<EntryFunctor,invalid_type> ));
|
Chris@16
|
866 BOOST_MPL_ASSERT_NOT(( boost::is_same<ExitFunctor,invalid_type> ));
|
Chris@16
|
867 BOOST_MPL_ASSERT_NOT(( boost::is_same<NoTransitionFunctor,invalid_type> ));
|
Chris@16
|
868 BOOST_MPL_ASSERT_NOT(( boost::is_same<OnExceptionFunctor,invalid_type> ));
|
Chris@16
|
869 BOOST_MPL_ASSERT_NOT(( boost::is_same<STT,invalid_type> ));
|
Chris@16
|
870
|
Chris@16
|
871 // flags
|
Chris@16
|
872 typedef StateNameTag state_name_tag;
|
Chris@16
|
873 typedef Flags flag_list;
|
Chris@16
|
874 typedef ::boost::mpl::vector0<> internal_flag_list;
|
Chris@16
|
875 // deferred events
|
Chris@16
|
876 typedef Defer deferred_events;
|
Chris@16
|
877 // customization (message queue, exceptions)
|
Chris@16
|
878 typedef Configuration configuration;
|
Chris@16
|
879
|
Chris@16
|
880
|
Chris@16
|
881 typedef BASE BaseAllStates;
|
Chris@16
|
882 typedef STT transition_table;
|
Chris@16
|
883 // the initial state of the player SM. Must be defined
|
Chris@16
|
884 typedef Init initial_state;
|
Chris@16
|
885
|
Chris@16
|
886 template <class Event,class FSM>
|
Chris@16
|
887 void on_entry(Event const& evt,FSM& fsm)
|
Chris@16
|
888 {
|
Chris@16
|
889 EntryFunctor()(evt,fsm,*this);
|
Chris@16
|
890 }
|
Chris@16
|
891 template <class Event,class FSM>
|
Chris@16
|
892 void on_exit(Event const& evt,FSM& fsm)
|
Chris@16
|
893 {
|
Chris@16
|
894 ExitFunctor()(evt,fsm,*this);
|
Chris@16
|
895 }
|
Chris@16
|
896 protected:
|
Chris@16
|
897 // Default no-transition handler. Can be replaced in the Derived SM class.
|
Chris@16
|
898 template <class FSM,class Event>
|
Chris@16
|
899 void no_transition(Event const& evt,FSM& fsm,int state)
|
Chris@16
|
900 {
|
Chris@16
|
901 NoTransitionFunctor()(evt,fsm,state);
|
Chris@16
|
902 }
|
Chris@16
|
903 // default exception handler. Can be replaced in the Derived SM class.
|
Chris@16
|
904 template <class FSM,class Event>
|
Chris@16
|
905 void exception_caught (Event const& evt,FSM& fsm,std::exception& e)
|
Chris@16
|
906 {
|
Chris@16
|
907 OnExceptionFunctor()(evt,fsm,e);
|
Chris@16
|
908 }
|
Chris@16
|
909 };
|
Chris@16
|
910
|
Chris@16
|
911 template <class StateNameTag,class STT,class Init>
|
Chris@16
|
912 inline
|
Chris@16
|
913 func_state_machine<
|
Chris@16
|
914 StateNameTag,
|
Chris@16
|
915 STT,
|
Chris@16
|
916 typename boost::result_of<BuildInit(Init)>::type
|
Chris@16
|
917 >
|
Chris@16
|
918 build_sm(STT ,Init)
|
Chris@16
|
919 {
|
Chris@16
|
920 typedef typename boost::result_of<BuildInit(Init)>::type init_type;
|
Chris@16
|
921 return func_state_machine<StateNameTag,STT,init_type>();
|
Chris@16
|
922 }
|
Chris@16
|
923
|
Chris@16
|
924 template <class StateNameTag,class STT,class Init,class Expr1>
|
Chris@16
|
925 inline
|
Chris@16
|
926 func_state_machine<
|
Chris@16
|
927 StateNameTag,
|
Chris@16
|
928 STT,
|
Chris@16
|
929 typename boost::result_of<BuildInit(Init)>::type,
|
Chris@16
|
930 typename ::boost::mpl::eval_if<
|
Chris@16
|
931 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
932 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
933 make_invalid_type>::type
|
Chris@16
|
934 >
|
Chris@16
|
935 build_sm(STT ,Init , Expr1 const&)
|
Chris@16
|
936 {
|
Chris@16
|
937 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
938 typedef typename boost::result_of<BuildInit(Init)>::type init_type;
|
Chris@16
|
939 return func_state_machine<StateNameTag,STT,init_type,entry_action>();
|
Chris@16
|
940 }
|
Chris@16
|
941
|
Chris@16
|
942 template <class StateNameTag,class STT,class Init,class Expr1,class Expr2>
|
Chris@16
|
943 inline
|
Chris@16
|
944 func_state_machine<
|
Chris@16
|
945 StateNameTag,
|
Chris@16
|
946 STT,
|
Chris@16
|
947 typename boost::result_of<BuildInit(Init)>::type,
|
Chris@16
|
948 typename ::boost::mpl::eval_if<
|
Chris@16
|
949 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
950 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
951 make_invalid_type>::type,
|
Chris@16
|
952 typename ::boost::mpl::eval_if<
|
Chris@16
|
953 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
954 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
955 make_invalid_type>::type
|
Chris@16
|
956 >
|
Chris@16
|
957 build_sm(STT ,Init , Expr1 const& ,Expr2 const& )
|
Chris@16
|
958 {
|
Chris@16
|
959 typedef typename boost::result_of<BuildInit(Init)>::type init_type;
|
Chris@16
|
960 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
961 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
962 return func_state_machine<StateNameTag,STT,init_type,entry_action,exit_action>();
|
Chris@16
|
963 }
|
Chris@16
|
964
|
Chris@16
|
965 template <class StateNameTag,class STT,class Init,class Expr1,class Expr2,class Attr>
|
Chris@16
|
966 inline
|
Chris@16
|
967 func_state_machine<
|
Chris@16
|
968 StateNameTag,
|
Chris@16
|
969 STT,
|
Chris@16
|
970 typename boost::result_of<BuildInit(Init)>::type,
|
Chris@16
|
971 typename ::boost::mpl::eval_if<
|
Chris@16
|
972 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
973 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
974 make_invalid_type>::type,
|
Chris@16
|
975 typename ::boost::mpl::eval_if<
|
Chris@16
|
976 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
977 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
978 make_invalid_type>::type,
|
Chris@16
|
979 typename boost::result_of<BuildAttributes(Attr)>::type
|
Chris@16
|
980 >
|
Chris@16
|
981 build_sm(STT ,Init , Expr1 const& ,Expr2 const& ,Attr const&)
|
Chris@16
|
982 {
|
Chris@16
|
983 typedef typename boost::result_of<BuildInit(Init)>::type init_type;
|
Chris@16
|
984 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
985 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
986 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
987 return func_state_machine<StateNameTag,STT,init_type,entry_action,exit_action,attributes_type>();
|
Chris@16
|
988 }
|
Chris@16
|
989
|
Chris@16
|
990 template <class StateNameTag,class STT,class Init,class Expr1,class Expr2,class Attr,class Configure>
|
Chris@16
|
991 inline
|
Chris@16
|
992 func_state_machine<
|
Chris@16
|
993 StateNameTag,
|
Chris@16
|
994 STT,
|
Chris@16
|
995 typename boost::result_of<BuildInit(Init)>::type,
|
Chris@16
|
996 typename ::boost::mpl::eval_if<
|
Chris@16
|
997 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
998 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
999 make_invalid_type>::type,
|
Chris@16
|
1000 typename ::boost::mpl::eval_if<
|
Chris@16
|
1001 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1002 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1003 make_invalid_type>::type,
|
Chris@16
|
1004 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1005 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1006 typename boost::result_of<BuildDeferred(Configure)>::type,
|
Chris@16
|
1007 typename boost::result_of<BuildConfigure(Configure)>::type
|
Chris@16
|
1008 >
|
Chris@16
|
1009 build_sm(STT ,Init , Expr1 const& ,Expr2 const& , Attr const&, Configure const& )
|
Chris@16
|
1010 {
|
Chris@16
|
1011 typedef typename boost::result_of<BuildInit(Init)>::type init_type;
|
Chris@16
|
1012 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1013 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1014 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1015 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
1016 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1017 typedef typename boost::result_of<BuildConfigure(Configure)>::type config_type;
|
Chris@16
|
1018 return func_state_machine<StateNameTag,STT,init_type,entry_action,exit_action,attributes_type,flags_type,
|
Chris@16
|
1019 deferred_type,config_type>();
|
Chris@16
|
1020
|
Chris@16
|
1021 }
|
Chris@16
|
1022
|
Chris@16
|
1023 template <class StateNameTag,class STT,class Init,class Expr1,class Expr2,class Attr,class Configure,class Expr3>
|
Chris@16
|
1024 inline
|
Chris@16
|
1025 func_state_machine<
|
Chris@16
|
1026 StateNameTag,
|
Chris@16
|
1027 STT,
|
Chris@16
|
1028 typename boost::result_of<BuildInit(Init)>::type,
|
Chris@16
|
1029 typename ::boost::mpl::eval_if<
|
Chris@16
|
1030 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1031 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1032 make_invalid_type>::type,
|
Chris@16
|
1033 typename ::boost::mpl::eval_if<
|
Chris@16
|
1034 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1035 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1036 make_invalid_type>::type,
|
Chris@16
|
1037 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1038 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1039 typename boost::result_of<BuildDeferred(Configure)>::type,
|
Chris@16
|
1040 typename boost::result_of<BuildConfigure(Configure)>::type,
|
Chris@16
|
1041 typename ::boost::mpl::eval_if<
|
Chris@16
|
1042 typename proto::matches<Expr3,ActionGrammar>::type,
|
Chris@16
|
1043 boost::result_of<ActionGrammar(Expr3)>,
|
Chris@16
|
1044 make_invalid_type>::type
|
Chris@16
|
1045 >
|
Chris@16
|
1046 build_sm(STT ,Init , Expr1 const& ,Expr2 const& ,Attr const&, Configure const&, Expr3 const& )
|
Chris@16
|
1047 {
|
Chris@16
|
1048 typedef typename boost::result_of<BuildInit(Init)>::type init_type;
|
Chris@16
|
1049 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1050 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1051 typedef typename boost::result_of<ActionGrammar(Expr3)>::type no_transition_action;
|
Chris@16
|
1052 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1053 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
1054 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1055 typedef typename boost::result_of<BuildConfigure(Configure)>::type config_type;
|
Chris@16
|
1056 return func_state_machine<StateNameTag,STT,init_type,entry_action,exit_action,attributes_type,flags_type,deferred_type,
|
Chris@16
|
1057 config_type,no_transition_action>();
|
Chris@16
|
1058 }
|
Chris@16
|
1059
|
Chris@16
|
1060 template <class StateNameTag,class STT,class Init,class Expr1,class Expr2,class Attr,class Configure,class Expr3,class Expr4>
|
Chris@16
|
1061 inline
|
Chris@16
|
1062 func_state_machine<
|
Chris@16
|
1063 StateNameTag,
|
Chris@16
|
1064 STT,
|
Chris@16
|
1065 typename boost::result_of<BuildInit(Init)>::type,
|
Chris@16
|
1066 typename ::boost::mpl::eval_if<
|
Chris@16
|
1067 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1068 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1069 make_invalid_type>::type,
|
Chris@16
|
1070 typename ::boost::mpl::eval_if<
|
Chris@16
|
1071 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1072 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1073 make_invalid_type>::type,
|
Chris@16
|
1074 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1075 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1076 typename boost::result_of<BuildDeferred(Configure)>::type,
|
Chris@16
|
1077 typename boost::result_of<BuildConfigure(Configure)>::type,
|
Chris@16
|
1078 typename ::boost::mpl::eval_if<
|
Chris@16
|
1079 typename proto::matches<Expr3,ActionGrammar>::type,
|
Chris@16
|
1080 boost::result_of<ActionGrammar(Expr3)>,
|
Chris@16
|
1081 make_invalid_type>::type,
|
Chris@16
|
1082 typename ::boost::mpl::eval_if<
|
Chris@16
|
1083 typename proto::matches<Expr4,ActionGrammar>::type,
|
Chris@16
|
1084 boost::result_of<ActionGrammar(Expr4)>,
|
Chris@16
|
1085 make_invalid_type>::type
|
Chris@16
|
1086 >
|
Chris@16
|
1087 build_sm(STT ,Init , Expr1 const& ,Expr2 const& , Attr const&, Configure const&, Expr3 const&, Expr4 const& )
|
Chris@16
|
1088 {
|
Chris@16
|
1089 typedef typename boost::result_of<BuildInit(Init)>::type init_type;
|
Chris@16
|
1090 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1091 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1092 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
1093 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1094 typedef typename boost::result_of<BuildConfigure(Configure)>::type config_type;
|
Chris@16
|
1095 typedef typename boost::result_of<ActionGrammar(Expr3)>::type no_transition_action;
|
Chris@16
|
1096 typedef typename boost::result_of<ActionGrammar(Expr4)>::type on_exception_action;
|
Chris@16
|
1097 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1098 return func_state_machine<StateNameTag,STT,init_type,entry_action,exit_action,attributes_type,flags_type,deferred_type,
|
Chris@16
|
1099 config_type,no_transition_action,on_exception_action>();
|
Chris@16
|
1100 }
|
Chris@16
|
1101
|
Chris@16
|
1102 template <class StateNameTag,class STT,class Init,class Expr1,class Expr2,class Attr,class Configure,class Expr3,class Expr4,class BASE>
|
Chris@16
|
1103 inline
|
Chris@16
|
1104 func_state_machine<
|
Chris@16
|
1105 StateNameTag,
|
Chris@16
|
1106 STT,
|
Chris@16
|
1107 typename boost::result_of<BuildInit(Init)>::type,
|
Chris@16
|
1108 typename ::boost::mpl::eval_if<
|
Chris@16
|
1109 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1110 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1111 make_invalid_type>::type,
|
Chris@16
|
1112 typename ::boost::mpl::eval_if<
|
Chris@16
|
1113 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1114 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1115 make_invalid_type>::type,
|
Chris@16
|
1116 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1117 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1118 typename boost::result_of<BuildDeferred(Configure)>::type,
|
Chris@16
|
1119 typename boost::result_of<BuildConfigure(Configure)>::type,
|
Chris@16
|
1120 typename ::boost::mpl::eval_if<
|
Chris@16
|
1121 typename proto::matches<Expr3,ActionGrammar>::type,
|
Chris@16
|
1122 boost::result_of<ActionGrammar(Expr3)>,
|
Chris@16
|
1123 make_invalid_type>::type,
|
Chris@16
|
1124 typename ::boost::mpl::eval_if<
|
Chris@16
|
1125 typename proto::matches<Expr4,ActionGrammar>::type,
|
Chris@16
|
1126 boost::result_of<ActionGrammar(Expr4)>,
|
Chris@16
|
1127 make_invalid_type>::type,
|
Chris@16
|
1128 BASE
|
Chris@16
|
1129 >
|
Chris@16
|
1130 build_sm(STT ,Init , Expr1 const& ,Expr2 const& ,Attr const& , Configure const&, Expr3 const&, Expr4 const& , BASE )
|
Chris@16
|
1131 {
|
Chris@16
|
1132 typedef typename boost::result_of<BuildInit(Init)>::type init_type;
|
Chris@16
|
1133 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1134 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1135 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
1136 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1137 typedef typename boost::result_of<BuildConfigure(Configure)>::type config_type;
|
Chris@16
|
1138 typedef typename boost::result_of<ActionGrammar(Expr3)>::type no_transition_action;
|
Chris@16
|
1139 typedef typename boost::result_of<ActionGrammar(Expr4)>::type on_exception_action;
|
Chris@16
|
1140 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1141 return func_state_machine<StateNameTag,STT,init_type,entry_action,exit_action,attributes_type,flags_type,deferred_type,
|
Chris@16
|
1142 config_type,no_transition_action,on_exception_action,BASE>();
|
Chris@16
|
1143 }
|
Chris@16
|
1144
|
Chris@16
|
1145 template <class Expr>
|
Chris@16
|
1146 inline
|
Chris@16
|
1147 ::boost::msm::front::detail::inherit_attributes<typename boost::result_of<BuildAttributes(Expr)>::type>
|
Chris@16
|
1148 build_attributes (Expr const&)
|
Chris@16
|
1149 {
|
Chris@16
|
1150 return ::boost::msm::front::detail::inherit_attributes<typename boost::result_of<BuildAttributes(Expr)>::type> ();
|
Chris@16
|
1151 }
|
Chris@16
|
1152
|
Chris@16
|
1153 template <class StateNameTag,class Expr1,class Expr2,class Attr,class Configure,class BASE>
|
Chris@16
|
1154 inline
|
Chris@16
|
1155 func_state<
|
Chris@16
|
1156 StateNameTag,
|
Chris@16
|
1157 typename ::boost::mpl::eval_if<
|
Chris@16
|
1158 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1159 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1160 make_invalid_type>::type,
|
Chris@16
|
1161 typename ::boost::mpl::eval_if<
|
Chris@16
|
1162 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1163 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1164 make_invalid_type>::type,
|
Chris@16
|
1165 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1166 typename ::boost::mpl::push_back< typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1167 ::boost::msm::TerminateFlag>::type,
|
Chris@16
|
1168 typename boost::result_of<BuildDeferred(Configure)>::type,
|
Chris@16
|
1169 BASE
|
Chris@16
|
1170 >
|
Chris@16
|
1171 build_terminate_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
|
Chris@16
|
1172 {
|
Chris@16
|
1173 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1174 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1175 typedef typename ::boost::mpl::push_back<
|
Chris@16
|
1176 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1177 ::boost::msm::TerminateFlag >::type flags_type;
|
Chris@16
|
1178 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1179 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1180 return func_state<StateNameTag,entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
|
Chris@16
|
1181 }
|
Chris@16
|
1182
|
Chris@16
|
1183 template <class StateNameTag,class Expr1,class Expr2,class Attr,class Configure>
|
Chris@16
|
1184 inline
|
Chris@16
|
1185 func_state<
|
Chris@16
|
1186 StateNameTag,
|
Chris@16
|
1187 typename ::boost::mpl::eval_if<
|
Chris@16
|
1188 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1189 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1190 make_invalid_type>::type,
|
Chris@16
|
1191 typename ::boost::mpl::eval_if<
|
Chris@16
|
1192 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1193 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1194 make_invalid_type>::type,
|
Chris@16
|
1195 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1196 typename ::boost::mpl::push_back< typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1197 ::boost::msm::TerminateFlag>::type,
|
Chris@16
|
1198 typename boost::result_of<BuildDeferred(Configure)>::type
|
Chris@16
|
1199 >
|
Chris@16
|
1200 build_terminate_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
|
Chris@16
|
1201 {
|
Chris@16
|
1202 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1203 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1204 typedef typename ::boost::mpl::push_back<
|
Chris@16
|
1205 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1206 ::boost::msm::TerminateFlag >::type flags_type;
|
Chris@16
|
1207 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1208 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1209
|
Chris@16
|
1210 return func_state<StateNameTag,entry_action,exit_action,attributes_type,flags_type,deferred_type>();
|
Chris@16
|
1211 }
|
Chris@16
|
1212
|
Chris@16
|
1213 template <class StateNameTag,class Expr1,class Expr2,class Attr>
|
Chris@16
|
1214 inline
|
Chris@16
|
1215 func_state<
|
Chris@16
|
1216 StateNameTag,
|
Chris@16
|
1217 typename ::boost::mpl::eval_if<
|
Chris@16
|
1218 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1219 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1220 make_invalid_type>::type,
|
Chris@16
|
1221 typename ::boost::mpl::eval_if<
|
Chris@16
|
1222 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1223 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1224 make_invalid_type>::type,
|
Chris@16
|
1225 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1226 ::boost::mpl::vector<boost::msm::TerminateFlag>
|
Chris@16
|
1227 >
|
Chris@16
|
1228 build_terminate_state(Expr1 const& ,Expr2 const& ,Attr const&)
|
Chris@16
|
1229 {
|
Chris@16
|
1230 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1231 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1232 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1233 return func_state<StateNameTag,entry_action,exit_action,attributes_type, ::boost::mpl::vector< ::boost::msm::TerminateFlag> >();
|
Chris@16
|
1234 }
|
Chris@16
|
1235
|
Chris@16
|
1236 template <class StateNameTag,class Expr1,class Expr2>
|
Chris@16
|
1237 inline
|
Chris@16
|
1238 func_state<
|
Chris@16
|
1239 StateNameTag,
|
Chris@16
|
1240 typename ::boost::mpl::eval_if<
|
Chris@16
|
1241 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1242 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1243 make_invalid_type>::type,
|
Chris@16
|
1244 typename ::boost::mpl::eval_if<
|
Chris@16
|
1245 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1246 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1247 make_invalid_type>::type,
|
Chris@16
|
1248 ::boost::fusion::vector<>,
|
Chris@16
|
1249 ::boost::mpl::vector<boost::msm::TerminateFlag>
|
Chris@16
|
1250 >
|
Chris@16
|
1251 build_terminate_state(Expr1 const& ,Expr2 const& )
|
Chris@16
|
1252 {
|
Chris@16
|
1253 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1254 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1255 return func_state<StateNameTag,entry_action,exit_action,
|
Chris@16
|
1256 ::boost::fusion::vector<>, ::boost::mpl::vector< ::boost::msm::TerminateFlag> >();
|
Chris@16
|
1257 }
|
Chris@16
|
1258
|
Chris@16
|
1259 template <class StateNameTag,class Expr1>
|
Chris@16
|
1260 inline
|
Chris@16
|
1261 func_state<
|
Chris@16
|
1262 StateNameTag,
|
Chris@16
|
1263 typename ::boost::mpl::eval_if<
|
Chris@16
|
1264 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1265 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1266 make_invalid_type>::type,
|
Chris@16
|
1267 NoAction,
|
Chris@16
|
1268 ::boost::fusion::vector<>,
|
Chris@16
|
1269 ::boost::mpl::vector<boost::msm::TerminateFlag>
|
Chris@16
|
1270 >
|
Chris@16
|
1271 build_terminate_state(Expr1 const& )
|
Chris@16
|
1272 {
|
Chris@16
|
1273 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1274 return func_state<StateNameTag,entry_action,NoAction,::boost::fusion::vector<>,::boost::mpl::vector<boost::msm::TerminateFlag> >();
|
Chris@16
|
1275 }
|
Chris@16
|
1276 template<class StateNameTag>
|
Chris@16
|
1277 inline
|
Chris@16
|
1278 func_state<
|
Chris@16
|
1279 StateNameTag,
|
Chris@16
|
1280 NoAction,
|
Chris@16
|
1281 NoAction,
|
Chris@16
|
1282 ::boost::fusion::vector<>,
|
Chris@16
|
1283 ::boost::mpl::vector<boost::msm::TerminateFlag>
|
Chris@16
|
1284 >
|
Chris@16
|
1285 build_terminate_state()
|
Chris@16
|
1286 {
|
Chris@16
|
1287 return func_state<StateNameTag,NoAction,NoAction,::boost::fusion::vector<>,::boost::mpl::vector<boost::msm::TerminateFlag> >();
|
Chris@16
|
1288 }
|
Chris@16
|
1289
|
Chris@16
|
1290 template <class StateNameTag,class Expr1,class Expr2,class Attr,class Configure,class BASE,class EndInterruptEvent>
|
Chris@16
|
1291 inline
|
Chris@16
|
1292 func_state<
|
Chris@16
|
1293 StateNameTag,
|
Chris@16
|
1294 typename ::boost::mpl::eval_if<
|
Chris@16
|
1295 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1296 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1297 make_invalid_type>::type,
|
Chris@16
|
1298 typename ::boost::mpl::eval_if<
|
Chris@16
|
1299 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1300 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1301 make_invalid_type>::type,
|
Chris@16
|
1302 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1303 typename ::boost::mpl::push_back<
|
Chris@16
|
1304 typename ::boost::mpl::push_back< typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1305 ::boost::msm::InterruptedFlag>::type,
|
Chris@16
|
1306 boost::msm::EndInterruptFlag<EndInterruptEvent>
|
Chris@16
|
1307 >::type,
|
Chris@16
|
1308 typename boost::result_of<BuildDeferred(Configure)>::type,
|
Chris@16
|
1309 BASE
|
Chris@16
|
1310 >
|
Chris@16
|
1311 build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
|
Chris@16
|
1312 {
|
Chris@16
|
1313 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1314 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1315 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1316 typedef typename ::boost::mpl::push_back<
|
Chris@16
|
1317 typename ::boost::mpl::push_back<
|
Chris@16
|
1318 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1319 ::boost::msm::InterruptedFlag>::type,
|
Chris@16
|
1320 boost::msm::EndInterruptFlag<EndInterruptEvent>
|
Chris@16
|
1321 >::type flags_type;
|
Chris@16
|
1322 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1323 return func_state<StateNameTag,entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
|
Chris@16
|
1324 }
|
Chris@16
|
1325
|
Chris@16
|
1326 template <class StateNameTag,class Expr1,class Expr2,class Attr,class Configure,class EndInterruptEvent>
|
Chris@16
|
1327 inline
|
Chris@16
|
1328 func_state<
|
Chris@16
|
1329 StateNameTag,
|
Chris@16
|
1330 typename ::boost::mpl::eval_if<
|
Chris@16
|
1331 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1332 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1333 make_invalid_type>::type,
|
Chris@16
|
1334 typename ::boost::mpl::eval_if<
|
Chris@16
|
1335 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1336 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1337 make_invalid_type>::type,
|
Chris@16
|
1338 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1339 typename ::boost::mpl::push_back<
|
Chris@16
|
1340 typename ::boost::mpl::push_back< typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1341 ::boost::msm::InterruptedFlag>::type,
|
Chris@16
|
1342 boost::msm::EndInterruptFlag<EndInterruptEvent>
|
Chris@16
|
1343 >::type,
|
Chris@16
|
1344 typename boost::result_of<BuildDeferred(Configure)>::type
|
Chris@16
|
1345 >
|
Chris@16
|
1346 build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
|
Chris@16
|
1347 {
|
Chris@16
|
1348 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1349 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1350 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1351
|
Chris@16
|
1352 typedef typename ::boost::mpl::push_back<
|
Chris@16
|
1353 typename ::boost::mpl::push_back<
|
Chris@16
|
1354 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1355 ::boost::msm::InterruptedFlag>::type,
|
Chris@16
|
1356 boost::msm::EndInterruptFlag<EndInterruptEvent>
|
Chris@16
|
1357 >::type flags_type;
|
Chris@16
|
1358 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1359
|
Chris@16
|
1360 return func_state<StateNameTag,entry_action,exit_action,attributes_type,flags_type,deferred_type>();
|
Chris@16
|
1361 }
|
Chris@16
|
1362
|
Chris@16
|
1363 template <class StateNameTag,class Expr1,class Expr2,class Attr,class EndInterruptEvent>
|
Chris@16
|
1364 inline
|
Chris@16
|
1365 func_state<
|
Chris@16
|
1366 StateNameTag,
|
Chris@16
|
1367 typename ::boost::mpl::eval_if<
|
Chris@16
|
1368 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1369 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1370 make_invalid_type>::type,
|
Chris@16
|
1371 typename ::boost::mpl::eval_if<
|
Chris@16
|
1372 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1373 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1374 make_invalid_type>::type,
|
Chris@16
|
1375 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1376 ::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> >
|
Chris@16
|
1377 >
|
Chris@16
|
1378 build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& ,Attr const&)
|
Chris@16
|
1379 {
|
Chris@16
|
1380 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1381 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1382 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1383 return func_state<StateNameTag,entry_action,exit_action,attributes_type,
|
Chris@16
|
1384 ::boost::mpl::vector< boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> > >();
|
Chris@16
|
1385 }
|
Chris@16
|
1386
|
Chris@16
|
1387 template <class StateNameTag,class Expr1,class Expr2,class EndInterruptEvent>
|
Chris@16
|
1388 inline
|
Chris@16
|
1389 func_state<
|
Chris@16
|
1390 StateNameTag,
|
Chris@16
|
1391 typename ::boost::mpl::eval_if<
|
Chris@16
|
1392 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1393 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1394 make_invalid_type>::type,
|
Chris@16
|
1395 typename ::boost::mpl::eval_if<
|
Chris@16
|
1396 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1397 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1398 make_invalid_type>::type,
|
Chris@16
|
1399 ::boost::fusion::vector<>,
|
Chris@16
|
1400 ::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> >
|
Chris@16
|
1401 >
|
Chris@16
|
1402 build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& )
|
Chris@16
|
1403 {
|
Chris@16
|
1404 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1405 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1406 return func_state<StateNameTag,entry_action,exit_action,
|
Chris@16
|
1407 ::boost::fusion::vector<>,
|
Chris@16
|
1408 ::boost::mpl::vector< boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> > >();
|
Chris@16
|
1409 }
|
Chris@16
|
1410
|
Chris@16
|
1411 template <class StateNameTag,class Expr1,class EndInterruptEvent>
|
Chris@16
|
1412 inline
|
Chris@16
|
1413 func_state<
|
Chris@16
|
1414 StateNameTag,
|
Chris@16
|
1415 typename ::boost::mpl::eval_if<
|
Chris@16
|
1416 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1417 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1418 make_invalid_type>::type,
|
Chris@16
|
1419 NoAction,
|
Chris@16
|
1420 ::boost::fusion::vector<>,
|
Chris@16
|
1421 ::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> >
|
Chris@16
|
1422 >
|
Chris@16
|
1423 build_interrupt_state(EndInterruptEvent const&, Expr1 const&)
|
Chris@16
|
1424 {
|
Chris@16
|
1425 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1426 return func_state<StateNameTag,entry_action,NoAction, ::boost::fusion::vector<>,
|
Chris@16
|
1427 ::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> > >();
|
Chris@16
|
1428 }
|
Chris@16
|
1429
|
Chris@16
|
1430 template <class StateNameTag,class EndInterruptEvent>
|
Chris@16
|
1431 inline
|
Chris@16
|
1432 func_state<
|
Chris@16
|
1433 StateNameTag,
|
Chris@16
|
1434 NoAction,
|
Chris@16
|
1435 NoAction,
|
Chris@16
|
1436 ::boost::fusion::vector<>,
|
Chris@16
|
1437 ::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> >
|
Chris@16
|
1438 >
|
Chris@16
|
1439 build_interrupt_state(EndInterruptEvent const&)
|
Chris@16
|
1440 {
|
Chris@16
|
1441 return func_state<StateNameTag,NoAction,NoAction, ::boost::fusion::vector<>,
|
Chris@16
|
1442 ::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> > >();
|
Chris@16
|
1443 }
|
Chris@16
|
1444
|
Chris@16
|
1445 template <class StateNameTag,int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure,class BASE>
|
Chris@16
|
1446 inline
|
Chris@16
|
1447 entry_func_state<
|
Chris@16
|
1448 StateNameTag,
|
Chris@16
|
1449 ZoneIndex,
|
Chris@16
|
1450 typename ::boost::mpl::eval_if<
|
Chris@16
|
1451 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1452 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1453 make_invalid_type>::type,
|
Chris@16
|
1454 typename ::boost::mpl::eval_if<
|
Chris@16
|
1455 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1456 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1457 make_invalid_type>::type,
|
Chris@16
|
1458 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1459 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1460 typename boost::result_of<BuildDeferred(Configure)>::type,
|
Chris@16
|
1461 BASE
|
Chris@16
|
1462 >
|
Chris@16
|
1463 build_entry_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
|
Chris@16
|
1464 {
|
Chris@16
|
1465 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1466 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1467 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
1468 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1469 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1470 return entry_func_state<StateNameTag,ZoneIndex,entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
|
Chris@16
|
1471 }
|
Chris@16
|
1472
|
Chris@16
|
1473 template <class StateNameTag,int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure>
|
Chris@16
|
1474 inline
|
Chris@16
|
1475 entry_func_state<
|
Chris@16
|
1476 StateNameTag,
|
Chris@16
|
1477 ZoneIndex,
|
Chris@16
|
1478 typename ::boost::mpl::eval_if<
|
Chris@16
|
1479 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1480 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1481 make_invalid_type>::type,
|
Chris@16
|
1482 typename ::boost::mpl::eval_if<
|
Chris@16
|
1483 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1484 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1485 make_invalid_type>::type,
|
Chris@16
|
1486 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1487 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1488 typename boost::result_of<BuildDeferred(Configure)>::type
|
Chris@16
|
1489 >
|
Chris@16
|
1490 build_entry_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
|
Chris@16
|
1491 {
|
Chris@16
|
1492 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1493 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1494 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
1495 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1496 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1497 return entry_func_state<StateNameTag,ZoneIndex,entry_action,exit_action,attributes_type,flags_type,deferred_type>();
|
Chris@16
|
1498 }
|
Chris@16
|
1499
|
Chris@16
|
1500 template <class StateNameTag,int ZoneIndex,class Expr1,class Expr2,class Attr>
|
Chris@16
|
1501 inline
|
Chris@16
|
1502 entry_func_state<
|
Chris@16
|
1503 StateNameTag,
|
Chris@16
|
1504 ZoneIndex,
|
Chris@16
|
1505 typename ::boost::mpl::eval_if<
|
Chris@16
|
1506 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1507 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1508 make_invalid_type>::type,
|
Chris@16
|
1509 typename ::boost::mpl::eval_if<
|
Chris@16
|
1510 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1511 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1512 make_invalid_type>::type,
|
Chris@16
|
1513 typename boost::result_of<BuildAttributes(Attr)>::type
|
Chris@16
|
1514 >
|
Chris@16
|
1515 build_entry_state(Expr1 const& ,Expr2 const& ,Attr const&)
|
Chris@16
|
1516 {
|
Chris@16
|
1517 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1518 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1519 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1520 return entry_func_state<StateNameTag,ZoneIndex,entry_action,exit_action,attributes_type>();
|
Chris@16
|
1521 }
|
Chris@16
|
1522
|
Chris@16
|
1523 template <class StateNameTag,int ZoneIndex,class Expr1,class Expr2>
|
Chris@16
|
1524 inline
|
Chris@16
|
1525 entry_func_state<
|
Chris@16
|
1526 StateNameTag,
|
Chris@16
|
1527 ZoneIndex,
|
Chris@16
|
1528 typename ::boost::mpl::eval_if<
|
Chris@16
|
1529 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1530 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1531 make_invalid_type>::type,
|
Chris@16
|
1532 typename ::boost::mpl::eval_if<
|
Chris@16
|
1533 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1534 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1535 make_invalid_type>::type
|
Chris@16
|
1536 >
|
Chris@16
|
1537 build_entry_state(Expr1 const& ,Expr2 const& )
|
Chris@16
|
1538 {
|
Chris@16
|
1539 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1540 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1541 return entry_func_state<StateNameTag,ZoneIndex,entry_action,exit_action>();
|
Chris@16
|
1542 }
|
Chris@16
|
1543
|
Chris@16
|
1544 template <class StateNameTag,int ZoneIndex,class Expr1>
|
Chris@16
|
1545 inline
|
Chris@16
|
1546 entry_func_state<
|
Chris@16
|
1547 StateNameTag,
|
Chris@16
|
1548 ZoneIndex,
|
Chris@16
|
1549 typename ::boost::mpl::eval_if<
|
Chris@16
|
1550 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1551 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1552 make_invalid_type>::type,
|
Chris@16
|
1553 NoAction
|
Chris@16
|
1554 >
|
Chris@16
|
1555 build_entry_state(Expr1 const& )
|
Chris@16
|
1556 {
|
Chris@16
|
1557 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1558 return entry_func_state<StateNameTag,ZoneIndex,entry_action,NoAction>();
|
Chris@16
|
1559 }
|
Chris@16
|
1560
|
Chris@16
|
1561 template <class StateNameTag,int ZoneIndex>
|
Chris@16
|
1562 inline
|
Chris@16
|
1563 entry_func_state<
|
Chris@16
|
1564 StateNameTag,
|
Chris@16
|
1565 ZoneIndex,
|
Chris@16
|
1566 NoAction,
|
Chris@16
|
1567 NoAction
|
Chris@16
|
1568 >
|
Chris@16
|
1569 build_entry_state()
|
Chris@16
|
1570 {
|
Chris@16
|
1571 return entry_func_state<StateNameTag,ZoneIndex,NoAction,NoAction>();
|
Chris@16
|
1572 }
|
Chris@16
|
1573
|
Chris@16
|
1574 template <class StateNameTag,class Event,class Expr1,class Expr2,class Attr,class Configure,class BASE>
|
Chris@16
|
1575 inline
|
Chris@16
|
1576 exit_func_state<
|
Chris@16
|
1577 StateNameTag,
|
Chris@16
|
1578 Event,
|
Chris@16
|
1579 typename ::boost::mpl::eval_if<
|
Chris@16
|
1580 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1581 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1582 make_invalid_type>::type,
|
Chris@16
|
1583 typename ::boost::mpl::eval_if<
|
Chris@16
|
1584 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1585 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1586 make_invalid_type>::type,
|
Chris@16
|
1587 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1588 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1589 typename boost::result_of<BuildDeferred(Configure)>::type,
|
Chris@16
|
1590 BASE
|
Chris@16
|
1591 >
|
Chris@16
|
1592 build_exit_state(Event const&,Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
|
Chris@16
|
1593 {
|
Chris@16
|
1594 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1595 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1596 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
1597 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1598 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1599 return exit_func_state<StateNameTag,Event,entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
|
Chris@16
|
1600 }
|
Chris@16
|
1601
|
Chris@16
|
1602 template <class StateNameTag,class Event,class Expr1,class Expr2,class Attr,class Configure>
|
Chris@16
|
1603 inline
|
Chris@16
|
1604 exit_func_state<
|
Chris@16
|
1605 StateNameTag,
|
Chris@16
|
1606 Event,
|
Chris@16
|
1607 typename ::boost::mpl::eval_if<
|
Chris@16
|
1608 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1609 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1610 make_invalid_type>::type,
|
Chris@16
|
1611 typename ::boost::mpl::eval_if<
|
Chris@16
|
1612 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1613 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1614 make_invalid_type>::type,
|
Chris@16
|
1615 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1616 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1617 typename boost::result_of<BuildDeferred(Configure)>::type
|
Chris@16
|
1618 >
|
Chris@16
|
1619 build_exit_state(Event const&,Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
|
Chris@16
|
1620 {
|
Chris@16
|
1621 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1622 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1623 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
1624 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1625 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1626 return exit_func_state<StateNameTag,Event,entry_action,exit_action,attributes_type,flags_type,deferred_type>();
|
Chris@16
|
1627 }
|
Chris@16
|
1628
|
Chris@16
|
1629 template <class StateNameTag,class Event,class Expr1,class Expr2,class Attr>
|
Chris@16
|
1630 inline
|
Chris@16
|
1631 exit_func_state<
|
Chris@16
|
1632 StateNameTag,
|
Chris@16
|
1633 Event,
|
Chris@16
|
1634 typename ::boost::mpl::eval_if<
|
Chris@16
|
1635 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1636 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1637 make_invalid_type>::type,
|
Chris@16
|
1638 typename ::boost::mpl::eval_if<
|
Chris@16
|
1639 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1640 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1641 make_invalid_type>::type,
|
Chris@16
|
1642 typename boost::result_of<BuildAttributes(Attr)>::type
|
Chris@16
|
1643 >
|
Chris@16
|
1644 build_exit_state(Event const&,Expr1 const& ,Expr2 const& ,Attr const&)
|
Chris@16
|
1645 {
|
Chris@16
|
1646 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1647 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1648 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1649 return exit_func_state<StateNameTag,Event,entry_action,exit_action,attributes_type>();
|
Chris@16
|
1650 }
|
Chris@16
|
1651
|
Chris@16
|
1652 template <class StateNameTag,class Event,class Expr1,class Expr2>
|
Chris@16
|
1653 inline
|
Chris@16
|
1654 exit_func_state<
|
Chris@16
|
1655 StateNameTag,
|
Chris@16
|
1656 Event,
|
Chris@16
|
1657 typename ::boost::mpl::eval_if<
|
Chris@16
|
1658 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1659 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1660 make_invalid_type>::type,
|
Chris@16
|
1661 typename ::boost::mpl::eval_if<
|
Chris@16
|
1662 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1663 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1664 make_invalid_type>::type
|
Chris@16
|
1665 >
|
Chris@16
|
1666 build_exit_state(Event const&,Expr1 const& ,Expr2 const& )
|
Chris@16
|
1667 {
|
Chris@16
|
1668 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1669 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1670 return exit_func_state<StateNameTag,Event,entry_action,exit_action>();
|
Chris@16
|
1671 }
|
Chris@16
|
1672
|
Chris@16
|
1673 template <class StateNameTag,class Event,class Expr1>
|
Chris@16
|
1674 inline
|
Chris@16
|
1675 exit_func_state<
|
Chris@16
|
1676 StateNameTag,
|
Chris@16
|
1677 Event,
|
Chris@16
|
1678 typename ::boost::mpl::eval_if<
|
Chris@16
|
1679 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1680 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1681 make_invalid_type>::type,
|
Chris@16
|
1682 NoAction
|
Chris@16
|
1683 >
|
Chris@16
|
1684 build_exit_state(Event const&, Expr1 const& )
|
Chris@16
|
1685 {
|
Chris@16
|
1686 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1687 return exit_func_state<StateNameTag,Event,entry_action,NoAction>();
|
Chris@16
|
1688 }
|
Chris@16
|
1689
|
Chris@16
|
1690 template <class StateNameTag,class Event>
|
Chris@16
|
1691 inline
|
Chris@16
|
1692 exit_func_state<
|
Chris@16
|
1693 StateNameTag,
|
Chris@16
|
1694 Event,
|
Chris@16
|
1695 NoAction,
|
Chris@16
|
1696 NoAction
|
Chris@16
|
1697 >
|
Chris@16
|
1698 build_exit_state(Event const&)
|
Chris@16
|
1699 {
|
Chris@16
|
1700 return exit_func_state<StateNameTag,Event,NoAction,NoAction>();
|
Chris@16
|
1701 }
|
Chris@16
|
1702
|
Chris@16
|
1703 template <class StateNameTag,int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure,class BASE>
|
Chris@16
|
1704 inline
|
Chris@16
|
1705 explicit_entry_func_state<
|
Chris@16
|
1706 StateNameTag,
|
Chris@16
|
1707 ZoneIndex,
|
Chris@16
|
1708 typename ::boost::mpl::eval_if<
|
Chris@16
|
1709 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1710 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1711 make_invalid_type>::type,
|
Chris@16
|
1712 typename ::boost::mpl::eval_if<
|
Chris@16
|
1713 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1714 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1715 make_invalid_type>::type,
|
Chris@16
|
1716 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1717 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1718 typename boost::result_of<BuildDeferred(Configure)>::type,
|
Chris@16
|
1719 BASE
|
Chris@16
|
1720 >
|
Chris@16
|
1721 build_explicit_entry_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
|
Chris@16
|
1722 {
|
Chris@16
|
1723 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1724 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1725 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
1726 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1727 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1728 return explicit_entry_func_state<StateNameTag,ZoneIndex,entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
|
Chris@16
|
1729 }
|
Chris@16
|
1730
|
Chris@16
|
1731 template <class StateNameTag,int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure>
|
Chris@16
|
1732 inline
|
Chris@16
|
1733 explicit_entry_func_state<
|
Chris@16
|
1734 StateNameTag,
|
Chris@16
|
1735 ZoneIndex,
|
Chris@16
|
1736 typename ::boost::mpl::eval_if<
|
Chris@16
|
1737 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1738 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1739 make_invalid_type>::type,
|
Chris@16
|
1740 typename ::boost::mpl::eval_if<
|
Chris@16
|
1741 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1742 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1743 make_invalid_type>::type,
|
Chris@16
|
1744 typename boost::result_of<BuildAttributes(Attr)>::type,
|
Chris@16
|
1745 typename boost::result_of<BuildFlags(Configure)>::type,
|
Chris@16
|
1746 typename boost::result_of<BuildDeferred(Configure)>::type
|
Chris@16
|
1747 >
|
Chris@16
|
1748 build_explicit_entry_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
|
Chris@16
|
1749 {
|
Chris@16
|
1750 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1751 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1752 typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
|
Chris@16
|
1753 typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
|
Chris@16
|
1754 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1755 return explicit_entry_func_state<StateNameTag,ZoneIndex,entry_action,exit_action,attributes_type,flags_type,deferred_type>();
|
Chris@16
|
1756 }
|
Chris@16
|
1757
|
Chris@16
|
1758 template <class StateNameTag,int ZoneIndex,class Expr1,class Expr2,class Attr>
|
Chris@16
|
1759 inline
|
Chris@16
|
1760 explicit_entry_func_state<
|
Chris@16
|
1761 StateNameTag,
|
Chris@16
|
1762 ZoneIndex,
|
Chris@16
|
1763 typename ::boost::mpl::eval_if<
|
Chris@16
|
1764 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1765 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1766 make_invalid_type>::type,
|
Chris@16
|
1767 typename ::boost::mpl::eval_if<
|
Chris@16
|
1768 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1769 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1770 make_invalid_type>::type,
|
Chris@16
|
1771 typename boost::result_of<BuildAttributes(Attr)>::type
|
Chris@16
|
1772 >
|
Chris@16
|
1773 build_explicit_entry_state(Expr1 const& ,Expr2 const& ,Attr const&)
|
Chris@16
|
1774 {
|
Chris@16
|
1775 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1776 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1777 typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
|
Chris@16
|
1778 return explicit_entry_func_state<StateNameTag,ZoneIndex,entry_action,exit_action,attributes_type>();
|
Chris@16
|
1779 }
|
Chris@16
|
1780
|
Chris@16
|
1781 template <class StateNameTag,int ZoneIndex,class Expr1,class Expr2>
|
Chris@16
|
1782 inline
|
Chris@16
|
1783 explicit_entry_func_state<
|
Chris@16
|
1784 StateNameTag,
|
Chris@16
|
1785 ZoneIndex,
|
Chris@16
|
1786 typename ::boost::mpl::eval_if<
|
Chris@16
|
1787 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1788 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1789 make_invalid_type>::type,
|
Chris@16
|
1790 typename ::boost::mpl::eval_if<
|
Chris@16
|
1791 typename proto::matches<Expr2,ActionGrammar>::type,
|
Chris@16
|
1792 boost::result_of<ActionGrammar(Expr2)>,
|
Chris@16
|
1793 make_invalid_type>::type
|
Chris@16
|
1794 >
|
Chris@16
|
1795 build_explicit_entry_state(Expr1 const& ,Expr2 const& )
|
Chris@16
|
1796 {
|
Chris@16
|
1797 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1798 typedef typename boost::result_of<ActionGrammar(Expr2)>::type exit_action;
|
Chris@16
|
1799 return explicit_entry_func_state<StateNameTag,ZoneIndex,entry_action,exit_action>();
|
Chris@16
|
1800 }
|
Chris@16
|
1801
|
Chris@16
|
1802 template <class StateNameTag,int ZoneIndex,class Expr1>
|
Chris@16
|
1803 inline
|
Chris@16
|
1804 explicit_entry_func_state<
|
Chris@16
|
1805 StateNameTag,
|
Chris@16
|
1806 ZoneIndex,
|
Chris@16
|
1807 typename ::boost::mpl::eval_if<
|
Chris@16
|
1808 typename proto::matches<Expr1,ActionGrammar>::type,
|
Chris@16
|
1809 boost::result_of<ActionGrammar(Expr1)>,
|
Chris@16
|
1810 make_invalid_type>::type,
|
Chris@16
|
1811 NoAction
|
Chris@16
|
1812 >
|
Chris@16
|
1813 build_explicit_entry_state(Expr1 const& )
|
Chris@16
|
1814 {
|
Chris@16
|
1815 typedef typename boost::result_of<ActionGrammar(Expr1)>::type entry_action;
|
Chris@16
|
1816 return explicit_entry_func_state<StateNameTag,ZoneIndex,entry_action,NoAction>();
|
Chris@16
|
1817 }
|
Chris@16
|
1818
|
Chris@16
|
1819 template <class StateNameTag,int ZoneIndex>
|
Chris@16
|
1820 inline
|
Chris@16
|
1821 explicit_entry_func_state<
|
Chris@16
|
1822 StateNameTag,
|
Chris@16
|
1823 ZoneIndex,
|
Chris@16
|
1824 NoAction,
|
Chris@16
|
1825 NoAction
|
Chris@16
|
1826 >
|
Chris@16
|
1827 build_explicit_entry_state()
|
Chris@16
|
1828 {
|
Chris@16
|
1829 return explicit_entry_func_state<StateNameTag,ZoneIndex,NoAction,NoAction>();
|
Chris@16
|
1830 }
|
Chris@16
|
1831
|
Chris@16
|
1832
|
Chris@16
|
1833
|
Chris@16
|
1834 }}}}
|
Chris@16
|
1835
|
Chris@16
|
1836 #endif //BOOST_MSM_FRONT_EUML_STATE_GRAMMAR_H
|
Chris@16
|
1837
|