Chris@16: // Copyright 2008 Christophe Henry Chris@16: // henry UNDERSCORE christophe AT hotmail DOT com Chris@16: // This is an extended version of the state machine available in the boost::mpl library Chris@16: // Distributed under the same license as the original. Chris@16: // Copyright for the original version: Chris@16: // Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed Chris@16: // under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_MSM_FRONT_EUML_STATE_GRAMMAR_H Chris@16: #define BOOST_MSM_FRONT_EUML_STATE_GRAMMAR_H Chris@16: Chris@16: #ifdef BOOST_MSM_EUML_PHOENIX_SUPPORT Chris@16: #include Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(attribute_tag) Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(flag_create_tag) Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(defer_create_tag) Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(control_configure_tag) Chris@16: Chris@16: namespace proto = boost::proto; Chris@16: Chris@16: namespace boost { namespace msm { namespace front { namespace euml Chris@16: { Chris@16: Chris@16: // provides the typedefs and interface. Concrete states derive from it. Chris@16: template, Chris@16: class Flags = ::boost::mpl::vector0<>, Chris@16: class Defer = ::boost::mpl::vector0<>, Chris@16: class BASE = ::boost::msm::front::default_base_state> Chris@16: struct func_state : public ::boost::msm::front::detail::state_base, Chris@16: euml_state_intern > Chris@16: { Chris@16: func_state(){} Chris@16: // grammar testing Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: Chris@16: typedef StateNameTag state_name_tag; Chris@16: // flags Chris@16: typedef Flags flag_list; Chris@16: typedef ::boost::mpl::vector0<> internal_flag_list; Chris@16: // deferred events Chris@16: typedef Defer deferred_events; Chris@16: Chris@16: template Chris@16: void on_entry(Event const& evt,FSM& fsm) Chris@16: { Chris@16: EntryFunctor()(evt,fsm,*this); Chris@16: } Chris@16: template Chris@16: void on_exit(Event const& evt,FSM& fsm) Chris@16: { Chris@16: ExitFunctor()(evt,fsm,*this); Chris@16: } Chris@16: }; Chris@16: Chris@16: // provides the typedefs and interface. Concrete states derive from it. Chris@16: template, Chris@16: class Flags = ::boost::mpl::vector0<>, Chris@16: class Defer = ::boost::mpl::vector0<>, Chris@16: class BASE = default_base_state> Chris@16: struct entry_func_state : public ::boost::msm::front::detail::state_base, Chris@16: euml_state_intern > Chris@16: { Chris@16: entry_func_state(){} Chris@16: // grammar testing Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: Chris@16: typedef StateNameTag state_name_tag; Chris@16: // tags Chris@16: typedef int pseudo_entry; Chris@16: enum {zone_index=ZoneIndex}; Chris@16: typedef int explicit_entry_state; Chris@16: Chris@16: // flags Chris@16: typedef Flags flag_list; Chris@16: typedef ::boost::mpl::vector0<> internal_flag_list; Chris@16: // deferred events Chris@16: typedef Defer deferred_events; Chris@16: Chris@16: template Chris@16: void on_entry(Event const& evt,FSM& fsm) Chris@16: { Chris@16: EntryFunctor()(evt,fsm,*this); Chris@16: } Chris@16: template Chris@16: void on_exit(Event const& evt,FSM& fsm) Chris@16: { Chris@16: ExitFunctor()(evt,fsm,*this); Chris@16: } Chris@16: }; Chris@16: // provides the typedefs and interface. Concrete states derive from it. Chris@16: template, Chris@16: class Flags = ::boost::mpl::vector0<>, Chris@16: class Defer = ::boost::mpl::vector0<>, Chris@16: class BASE = default_base_state> Chris@16: struct explicit_entry_func_state : public ::boost::msm::front::detail::state_base, Chris@16: public ::boost::msm::front::explicit_entry, Chris@16: euml_state_intern > Chris@16: { Chris@16: explicit_entry_func_state(){} Chris@16: // grammar testing Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: Chris@16: typedef StateNameTag state_name_tag; Chris@16: // flags Chris@16: typedef Flags flag_list; Chris@16: typedef ::boost::mpl::vector0<> internal_flag_list; Chris@16: // deferred events Chris@16: typedef Defer deferred_events; Chris@16: Chris@16: template Chris@16: void on_entry(Event const& evt,FSM& fsm) Chris@16: { Chris@16: EntryFunctor()(evt,fsm,*this); Chris@16: } Chris@16: template Chris@16: void on_exit(Event const& evt,FSM& fsm) Chris@16: { Chris@16: ExitFunctor()(evt,fsm,*this); Chris@16: } Chris@16: }; Chris@16: Chris@16: // provides the typedefs and interface. Concrete states derive from it. Chris@16: template, Chris@16: class Flags = ::boost::mpl::vector0<>, Chris@16: class Defer = ::boost::mpl::vector0<>, Chris@16: class BASE = default_base_state> Chris@16: struct exit_func_state : public ::boost::msm::front::detail::state_base, Chris@16: euml_state_intern > Chris@16: { Chris@16: exit_func_state(){} Chris@16: // grammar testing Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: Chris@16: typedef StateNameTag state_name_tag; Chris@16: // tags Chris@16: typedef Event event; Chris@16: typedef BASE Base; Chris@16: typedef int pseudo_exit; Chris@16: Chris@16: // flags Chris@16: typedef Flags flag_list; Chris@16: typedef ::boost::mpl::vector0<> internal_flag_list; Chris@16: // deferred events Chris@16: typedef Defer deferred_events; Chris@16: Chris@16: template Chris@16: void on_entry(Evt const& evt,FSM& fsm) Chris@16: { Chris@16: EntryFunctor()(evt,fsm,*this); Chris@16: } Chris@16: template Chris@16: void on_exit(Evt const& evt,FSM& fsm) Chris@16: { Chris@16: ExitFunctor()(evt,fsm,*this); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct BuildActions; Chris@16: struct BuildGuards; Chris@16: Chris@16: struct BuildActionSequence Chris@16: : proto::or_< Chris@16: proto::when < Chris@16: BuildActions, Chris@16: ActionSequence_()>() Chris@16: >, Chris@16: proto::when < Chris@16: proto::comma, Chris@16: ActionSequence_(), Chris@16: BuildActions(proto::_right)>()>() Chris@16: >, Chris@16: proto::when < Chris@16: proto::comma, Chris@16: ActionSequence_(), Chris@16: BuildActions(proto::_right) >() >() Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: #ifdef BOOST_MSM_EUML_PHOENIX_SUPPORT Chris@16: struct CustomPhoenixGrammar Chris@16: : proto::switch_ Chris@16: { Chris@16: template Chris@16: struct case_ Chris@16: : proto::and_< Chris@16: proto::not_ , Chris@16: proto::not_, Chris@16: boost::phoenix::meta_grammar::case_ Chris@16: > Chris@16: {}; Chris@16: }; Chris@16: #endif Chris@16: Chris@16: struct GuardGrammar Chris@16: : proto::or_< Chris@16: #ifdef BOOST_MSM_EUML_PHOENIX_SUPPORT Chris@16: proto::when< Chris@16: CustomPhoenixGrammar , Chris@16: proto::_ Chris@16: >, Chris@16: #endif Chris@16: proto::when< Chris@16: BuildGuards , Chris@16: BuildGuards Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: struct ActionGrammar Chris@16: : proto::or_< Chris@16: #ifdef BOOST_MSM_EUML_PHOENIX_SUPPORT Chris@16: proto::when< Chris@16: CustomPhoenixGrammar , Chris@16: proto::_ Chris@16: >, Chris@16: #endif Chris@16: proto::when< Chris@16: BuildActionSequence , Chris@16: BuildActionSequence Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: struct BuildActionsCases Chris@16: { Chris@16: // The primary template matches nothing: Chris@16: template Chris@16: struct case_ Chris@16: : proto::not_ Chris@16: {}; Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::pre_inc, Chris@16: Pre_inc_< BuildActions(proto::_child)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::pre_dec, Chris@16: Pre_dec_< BuildActions(proto::_child)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::post_inc, Chris@16: Post_inc_< BuildActions(proto::_child)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::post_dec, Chris@16: Post_dec_< BuildActions(proto::_child)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::dereference, Chris@16: Deref_< BuildActions(proto::_child)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::plus, Chris@16: Plus_() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::minus, Chris@16: Minus_() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::multiplies, Chris@16: Multiplies_() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::divides, Chris@16: Divides_() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::modulus, Chris@16: Modulus_() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::bitwise_and, Chris@16: Bitwise_And_() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::bitwise_or, Chris@16: Bitwise_Or_() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::bitwise_xor, Chris@16: Bitwise_Xor_() Chris@16: > Chris@16: {}; Chris@16: Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::plus_assign, Chris@16: Plus_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::minus_assign, Chris@16: Minus_Assign_() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::multiplies_assign, Chris@16: Multiplies_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::divides_assign, Chris@16: Divides_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::modulus_assign, Chris@16: Modulus_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::shift_left_assign, Chris@16: ShiftLeft_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::shift_right_assign, Chris@16: ShiftRight_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::shift_left, Chris@16: ShiftLeft_< BuildActions(proto::_left),BuildActions(proto::_right)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::shift_right, Chris@16: ShiftRight_< BuildActions(proto::_left),BuildActions(proto::_right)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::assign, Chris@16: Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::subscript, Chris@16: Subscript_< BuildActions(proto::_left),BuildActions(proto::_right)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::unary_plus, Chris@16: Unary_Plus_< BuildActions(proto::_child)>() Chris@16: > Chris@16: {}; Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::when< Chris@16: proto::negate, Chris@16: Unary_Minus_< BuildActions(proto::_child)>() Chris@16: > Chris@16: {}; Chris@16: Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::function,BuildGuards,BuildActionSequence,BuildActionSequence >, Chris@16: If_Else_), Chris@16: BuildActionSequence(proto::_child_c<2>), Chris@16: BuildActionSequence(proto::_child_c<3>) >() Chris@16: >, Chris@16: proto::when< Chris@16: proto::function,BuildGuards,BuildActionSequence >, Chris@16: If_Then_), Chris@16: BuildActionSequence(proto::_child_c<2>)>() Chris@16: >, Chris@16: proto::when< Chris@16: proto::function,BuildGuards,BuildActionSequence >, Chris@16: While_Do_), Chris@16: BuildActionSequence(proto::_child_c<2>) >() Chris@16: >, Chris@16: proto::when< Chris@16: proto::function,BuildGuards,BuildActionSequence >, Chris@16: Do_While_), Chris@16: BuildActionSequence(proto::_child_c<2>) >() Chris@16: >, Chris@16: proto::when< Chris@16: proto::function, Chris@16: BuildActionSequence,BuildGuards,BuildActionSequence,BuildActionSequence>, Chris@16: For_Loop_), Chris@16: BuildGuards(proto::_child_c<2>), Chris@16: BuildActionSequence(proto::_child_c<3>), Chris@16: BuildActionSequence(proto::_child_c<4>) >() Chris@16: >, Chris@16: proto::or_< Chris@16: proto::when< Chris@16: proto::function,BuildActions >, Chris@16: get_fct,BuildActions(proto::_child_c<1>) >() Chris@16: >, Chris@16: proto::when< Chris@16: proto::function >, Chris@16: get_fct >() Chris@16: >, Chris@16: proto::when< Chris@16: proto::function,BuildActions,BuildActions >, Chris@16: get_fct,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) >() Chris@16: >, Chris@16: proto::when< Chris@16: proto::function,BuildActions,BuildActions,BuildActions >, Chris@16: get_fct,BuildActions(proto::_child_c<1>) Chris@16: ,BuildActions(proto::_child_c<2>),BuildActions(proto::_child_c<3>) >() Chris@16: >, Chris@16: proto::when< Chris@16: proto::function,BuildActions,BuildActions,BuildActions,BuildActions >, Chris@16: get_fct Chris@16: ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) Chris@16: ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>) >() Chris@16: >, Chris@16: proto::when< Chris@16: proto::function,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >, Chris@16: get_fct Chris@16: ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) Chris@16: ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>) Chris@16: ,BuildActions(proto::_child_c<5>) >() Chris@16: > Chris@16: #ifdef BOOST_MSVC Chris@16: ,proto::when< Chris@16: proto::function,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >, Chris@16: get_fct Chris@16: ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) Chris@16: ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>) Chris@16: ,BuildActions(proto::_child_c<5>),BuildActions(proto::_child_c<6>) >() Chris@16: > Chris@16: #endif Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template<> Chris@16: struct BuildActionsCases::case_ Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::terminal, Chris@16: get_action_name() Chris@16: >, Chris@16: proto::when< Chris@16: proto::terminal, Chris@16: get_state_name() Chris@16: >, Chris@16: proto::when< Chris@16: proto::terminal, Chris@16: proto::_ Chris@16: >, Chris@16: proto::when< Chris@16: proto::terminal, Chris@16: proto::_ Chris@16: >, Chris@16: proto::when< Chris@16: proto::terminal, Chris@16: get_fct() Chris@16: >, Chris@16: proto::when< Chris@16: proto::terminal, Chris@16: proto::_value Chris@16: > Chris@16: > Chris@16: {}; Chris@16: struct BuildActions Chris@16: : proto::switch_ Chris@16: {}; Chris@16: Chris@16: // attributes building Chris@16: #define BOOST_MSM_EUML_DECLARE_ATTRIBUTE(attr_type,attr_name) \ Chris@16: struct attr_name ## _ \ Chris@16: : proto::extends< proto::terminal< ::boost::msm::front::action_tag>::type, attr_name ## _, boost::msm::sm_domain> \ Chris@16: {typedef attr_name ## _ action_name; \ Chris@16: typedef ::boost::fusion::pair attribute_type; \ Chris@16: attr_name ## _ (){} \ Chris@16: }; \ Chris@16: attr_name ## _ const attr_name = attr_name ## _(); Chris@16: Chris@16: struct make_attributes_tag Chris@16: { Chris@16: typedef int attribute_tag; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct get_attribute_type Chris@16: { Chris@16: typedef typename T::attribute_type type; Chris@16: }; Chris@16: template Chris@16: struct transform_to_fusion_pair Chris@16: { Chris@16: typedef typename ::boost::mpl::fold< Chris@16: Seq,::boost::mpl::vector<>, Chris@16: ::boost::mpl::push_back< ::boost::mpl::placeholders::_1, Chris@16: get_attribute_type< ::boost::mpl::placeholders::_2> > Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct attribute Chris@16: { Chris@16: BOOST_PROTO_BASIC_EXTENDS( Chris@16: proto::terminal::type Chris@16: , attribute Chris@16: , boost::msm::sm_domain Chris@16: ) Chris@16: typedef ::boost::fusion::pair attribute_type; Chris@16: }; Chris@16: Chris@16: attribute<> const attributes_ = {{{}}}; Chris@16: attribute<> const no_attributes_ = {{{}}}; Chris@16: Chris@16: struct BuildAttributesHelper Chris@16: : proto::make< Chris@16: ::boost::mpl::pop_front< Chris@16: proto::fold_tree< Chris@16: proto::_ Chris@16: , ::boost::fusion::vector<>() Chris@16: , ::boost::mpl::push_back, Chris@16: proto::_value, Chris@16: get_attribute_type > Chris@16: >() Chris@16: > Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: struct BuildAttributes Chris@16: : proto::make< Chris@16: ::boost::mpl::if_< Chris@16: has_attribute_tag< ::boost::mpl::deref< ::boost::mpl::prior< ::boost::mpl::end< BuildAttributesHelper > > > >, Chris@16: ::boost::fusion::result_of::as_map< ::boost::mpl::pop_back< BuildAttributesHelper > >, Chris@16: ::boost::fusion::result_of::as_map< BuildAttributesHelper > > Chris@16: > Chris@16: {}; Chris@16: Chris@16: // helper to build a mpl::vector from a << list Chris@16: struct BuildMplVectorHelper Chris@16: : proto::make< Chris@16: ::boost::mpl::pop_front< Chris@16: proto::fold_tree< Chris@16: proto::_ Chris@16: , ::boost::mpl::vector0<>() Chris@16: , ::boost::mpl::push_back() Chris@16: > Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: // flags building Chris@16: struct BuildFlags Chris@16: : proto::make< Chris@16: ::boost::mpl::remove_if< Chris@16: BuildMplVectorHelper, Chris@16: ::boost::mpl::not_< ::boost::is_same, flag_tag > > Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: struct control_configure_tag {}; Chris@16: Chris@16: // configuration building Chris@16: struct make_configure_tag Chris@16: { Chris@16: typedef int control_configure_tag; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct configure Chris@16: { Chris@16: typedef not_euml_tag euml_tag_type; Chris@16: BOOST_PROTO_BASIC_EXTENDS( Chris@16: proto::terminal::type Chris@16: , configure Chris@16: , boost::msm::sm_domain Chris@16: ) Chris@16: }; Chris@16: Chris@16: configure<> const configure_ = {{{}}}; Chris@16: configure<> const no_configure_ = {{{}}}; Chris@16: Chris@16: struct BuildConfigure Chris@16: : proto::make< Chris@16: ::boost::mpl::remove_if< Chris@16: BuildMplVectorHelper, Chris@16: ::boost::mpl::not_< ::boost::is_same, config_tag > > Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: struct BuildDeferred Chris@16: : proto::make< Chris@16: ::boost::mpl::remove_if< Chris@16: BuildMplVectorHelper, Chris@16: ::boost::mpl::not_< ::boost::is_same, event_tag > > Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct define_init Chris@16: { Chris@16: typedef int defer_create_tag; Chris@16: BOOST_PROTO_BASIC_EXTENDS( Chris@16: proto::terminal::type Chris@16: , define_init Chris@16: , boost::msm::sm_domain Chris@16: ) Chris@16: }; Chris@16: Chris@16: define_init<> const init_ = {{{}}}; Chris@16: struct BuildInit Chris@16: : proto::make< Chris@16: ::boost::mpl::pop_front< Chris@16: proto::fold_tree< Chris@16: proto::_ Chris@16: , ::boost::mpl::vector0<>() Chris@16: , ::boost::mpl::push_back() Chris@16: > Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: BASE Chris@16: > Chris@16: build_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: return func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: return func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_state(Expr1 const& ,Expr2 const& ,Attr const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type Chris@16: > Chris@16: build_state(Expr1 const& ,Expr2 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: return func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: NoAction Chris@16: > Chris@16: build_state(Expr1 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: return func_state(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: NoAction, Chris@16: NoAction Chris@16: > Chris@16: build_state() Chris@16: { Chris@16: return func_state(); Chris@16: } Chris@16: Chris@16: // provides the typedefs and interface. Concrete states derive from it. Chris@16: template, Chris@16: class Flags = ::boost::mpl::vector0<>, Chris@16: class Defer = ::boost::mpl::vector0<>, Chris@16: class Configuration = ::boost::mpl::vector0<>, Chris@16: class NoTransitionFunctor = NoAction, Chris@16: class OnExceptionFunctor = NoAction, Chris@16: class BASE = ::boost::msm::front::default_base_state> Chris@16: struct func_state_machine : public ::boost::msm::front::detail::state_base, Chris@16: euml_state_intern > Chris@16: { Chris@16: func_state_machine(){} Chris@16: // grammar testing Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: BOOST_MPL_ASSERT_NOT(( boost::is_same )); Chris@16: Chris@16: // flags Chris@16: typedef StateNameTag state_name_tag; Chris@16: typedef Flags flag_list; Chris@16: typedef ::boost::mpl::vector0<> internal_flag_list; Chris@16: // deferred events Chris@16: typedef Defer deferred_events; Chris@16: // customization (message queue, exceptions) Chris@16: typedef Configuration configuration; Chris@16: Chris@16: Chris@16: typedef BASE BaseAllStates; Chris@16: typedef STT transition_table; Chris@16: // the initial state of the player SM. Must be defined Chris@16: typedef Init initial_state; Chris@16: Chris@16: template Chris@16: void on_entry(Event const& evt,FSM& fsm) Chris@16: { Chris@16: EntryFunctor()(evt,fsm,*this); Chris@16: } Chris@16: template Chris@16: void on_exit(Event const& evt,FSM& fsm) Chris@16: { Chris@16: ExitFunctor()(evt,fsm,*this); Chris@16: } Chris@16: protected: Chris@16: // Default no-transition handler. Can be replaced in the Derived SM class. Chris@16: template Chris@16: void no_transition(Event const& evt,FSM& fsm,int state) Chris@16: { Chris@16: NoTransitionFunctor()(evt,fsm,state); Chris@16: } Chris@16: // default exception handler. Can be replaced in the Derived SM class. Chris@16: template Chris@16: void exception_caught (Event const& evt,FSM& fsm,std::exception& e) Chris@16: { Chris@16: OnExceptionFunctor()(evt,fsm,e); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state_machine< Chris@16: StateNameTag, Chris@16: STT, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_sm(STT ,Init) Chris@16: { Chris@16: typedef typename boost::result_of::type init_type; Chris@16: return func_state_machine(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state_machine< Chris@16: StateNameTag, Chris@16: STT, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type Chris@16: > Chris@16: build_sm(STT ,Init , Expr1 const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type init_type; Chris@16: return func_state_machine(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state_machine< Chris@16: StateNameTag, Chris@16: STT, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type Chris@16: > Chris@16: build_sm(STT ,Init , Expr1 const& ,Expr2 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type init_type; Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: return func_state_machine(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state_machine< Chris@16: StateNameTag, Chris@16: STT, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_sm(STT ,Init , Expr1 const& ,Expr2 const& ,Attr const&) Chris@16: { Chris@16: typedef typename boost::result_of::type init_type; Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return func_state_machine(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state_machine< Chris@16: StateNameTag, Chris@16: STT, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_sm(STT ,Init , Expr1 const& ,Expr2 const& , Attr const&, Configure const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type init_type; Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type config_type; Chris@16: return func_state_machine(); Chris@16: Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state_machine< Chris@16: StateNameTag, Chris@16: STT, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type Chris@16: > Chris@16: build_sm(STT ,Init , Expr1 const& ,Expr2 const& ,Attr const&, Configure const&, Expr3 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type init_type; Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type no_transition_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type config_type; Chris@16: return func_state_machine(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state_machine< Chris@16: StateNameTag, Chris@16: STT, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type Chris@16: > Chris@16: build_sm(STT ,Init , Expr1 const& ,Expr2 const& , Attr const&, Configure const&, Expr3 const&, Expr4 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type init_type; Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type config_type; Chris@16: typedef typename boost::result_of::type no_transition_action; Chris@16: typedef typename boost::result_of::type on_exception_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return func_state_machine(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state_machine< Chris@16: StateNameTag, Chris@16: STT, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: BASE Chris@16: > Chris@16: build_sm(STT ,Init , Expr1 const& ,Expr2 const& ,Attr const& , Configure const&, Expr3 const&, Expr4 const& , BASE ) Chris@16: { Chris@16: typedef typename boost::result_of::type init_type; Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type config_type; Chris@16: typedef typename boost::result_of::type no_transition_action; Chris@16: typedef typename boost::result_of::type on_exception_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return func_state_machine(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: ::boost::msm::front::detail::inherit_attributes::type> Chris@16: build_attributes (Expr const&) Chris@16: { Chris@16: return ::boost::msm::front::detail::inherit_attributes::type> (); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::push_back< typename boost::result_of::type, Chris@16: ::boost::msm::TerminateFlag>::type, Chris@16: typename boost::result_of::type, Chris@16: BASE Chris@16: > Chris@16: build_terminate_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename ::boost::mpl::push_back< Chris@16: typename boost::result_of::type, Chris@16: ::boost::msm::TerminateFlag >::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::push_back< typename boost::result_of::type, Chris@16: ::boost::msm::TerminateFlag>::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_terminate_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename ::boost::mpl::push_back< Chris@16: typename boost::result_of::type, Chris@16: ::boost::msm::TerminateFlag >::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: Chris@16: return func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: ::boost::mpl::vector Chris@16: > Chris@16: build_terminate_state(Expr1 const& ,Expr2 const& ,Attr const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return func_state >(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: ::boost::fusion::vector<>, Chris@16: ::boost::mpl::vector Chris@16: > Chris@16: build_terminate_state(Expr1 const& ,Expr2 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: return func_state, ::boost::mpl::vector< ::boost::msm::TerminateFlag> >(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: NoAction, Chris@16: ::boost::fusion::vector<>, Chris@16: ::boost::mpl::vector Chris@16: > Chris@16: build_terminate_state(Expr1 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: return func_state,::boost::mpl::vector >(); Chris@16: } Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: NoAction, Chris@16: NoAction, Chris@16: ::boost::fusion::vector<>, Chris@16: ::boost::mpl::vector Chris@16: > Chris@16: build_terminate_state() Chris@16: { Chris@16: return func_state,::boost::mpl::vector >(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::push_back< Chris@16: typename ::boost::mpl::push_back< typename boost::result_of::type, Chris@16: ::boost::msm::InterruptedFlag>::type, Chris@16: boost::msm::EndInterruptFlag Chris@16: >::type, Chris@16: typename boost::result_of::type, Chris@16: BASE Chris@16: > Chris@16: build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: typedef typename ::boost::mpl::push_back< Chris@16: typename ::boost::mpl::push_back< Chris@16: typename boost::result_of::type, Chris@16: ::boost::msm::InterruptedFlag>::type, Chris@16: boost::msm::EndInterruptFlag Chris@16: >::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: return func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename ::boost::mpl::push_back< Chris@16: typename ::boost::mpl::push_back< typename boost::result_of::type, Chris@16: ::boost::msm::InterruptedFlag>::type, Chris@16: boost::msm::EndInterruptFlag Chris@16: >::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& ,Attr const&, Configure const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: Chris@16: typedef typename ::boost::mpl::push_back< Chris@16: typename ::boost::mpl::push_back< Chris@16: typename boost::result_of::type, Chris@16: ::boost::msm::InterruptedFlag>::type, Chris@16: boost::msm::EndInterruptFlag Chris@16: >::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: Chris@16: return func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: ::boost::mpl::vector > Chris@16: > Chris@16: build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& ,Attr const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return func_state > >(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: ::boost::fusion::vector<>, Chris@16: ::boost::mpl::vector > Chris@16: > Chris@16: build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: return func_state, Chris@16: ::boost::mpl::vector< boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag > >(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: NoAction, Chris@16: ::boost::fusion::vector<>, Chris@16: ::boost::mpl::vector > Chris@16: > Chris@16: build_interrupt_state(EndInterruptEvent const&, Expr1 const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: return func_state, Chris@16: ::boost::mpl::vector > >(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: func_state< Chris@16: StateNameTag, Chris@16: NoAction, Chris@16: NoAction, Chris@16: ::boost::fusion::vector<>, Chris@16: ::boost::mpl::vector > Chris@16: > Chris@16: build_interrupt_state(EndInterruptEvent const&) Chris@16: { Chris@16: return func_state, Chris@16: ::boost::mpl::vector > >(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: BASE Chris@16: > Chris@16: build_entry_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_entry_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_entry_state(Expr1 const& ,Expr2 const& ,Attr const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type Chris@16: > Chris@16: build_entry_state(Expr1 const& ,Expr2 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: return entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: NoAction Chris@16: > Chris@16: build_entry_state(Expr1 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: return entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: NoAction, Chris@16: NoAction Chris@16: > Chris@16: build_entry_state() Chris@16: { Chris@16: return entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: exit_func_state< Chris@16: StateNameTag, Chris@16: Event, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: BASE Chris@16: > Chris@16: build_exit_state(Event const&,Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return exit_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: exit_func_state< Chris@16: StateNameTag, Chris@16: Event, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_exit_state(Event const&,Expr1 const& ,Expr2 const& ,Attr const&, Configure const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return exit_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: exit_func_state< Chris@16: StateNameTag, Chris@16: Event, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_exit_state(Event const&,Expr1 const& ,Expr2 const& ,Attr const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return exit_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: exit_func_state< Chris@16: StateNameTag, Chris@16: Event, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type Chris@16: > Chris@16: build_exit_state(Event const&,Expr1 const& ,Expr2 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: return exit_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: exit_func_state< Chris@16: StateNameTag, Chris@16: Event, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: NoAction Chris@16: > Chris@16: build_exit_state(Event const&, Expr1 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: return exit_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: exit_func_state< Chris@16: StateNameTag, Chris@16: Event, Chris@16: NoAction, Chris@16: NoAction Chris@16: > Chris@16: build_exit_state(Event const&) Chris@16: { Chris@16: return exit_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: explicit_entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: BASE Chris@16: > Chris@16: build_explicit_entry_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return explicit_entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: explicit_entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_explicit_entry_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type flags_type; Chris@16: typedef typename boost::result_of::type deferred_type; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return explicit_entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: explicit_entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename boost::result_of::type Chris@16: > Chris@16: build_explicit_entry_state(Expr1 const& ,Expr2 const& ,Attr const&) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: typedef typename boost::result_of::type attributes_type; Chris@16: return explicit_entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: explicit_entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type Chris@16: > Chris@16: build_explicit_entry_state(Expr1 const& ,Expr2 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: typedef typename boost::result_of::type exit_action; Chris@16: return explicit_entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: explicit_entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type, Chris@16: NoAction Chris@16: > Chris@16: build_explicit_entry_state(Expr1 const& ) Chris@16: { Chris@16: typedef typename boost::result_of::type entry_action; Chris@16: return explicit_entry_func_state(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Chris@16: explicit_entry_func_state< Chris@16: StateNameTag, Chris@16: ZoneIndex, Chris@16: NoAction, Chris@16: NoAction Chris@16: > Chris@16: build_explicit_entry_state() Chris@16: { Chris@16: return explicit_entry_func_state(); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: }}}} Chris@16: Chris@16: #endif //BOOST_MSM_FRONT_EUML_STATE_GRAMMAR_H Chris@16: