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