annotate DEPENDENCIES/generic/include/boost/msm/front/euml/state_grammar.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
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