Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/msm/front/euml/common.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/msm/front/euml/common.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,2684 @@ +// 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_COMMON_H +#define BOOST_MSM_FRONT_EUML_COMMON_H + +#include <boost/config.hpp> +#include <boost/msm/proto_config.hpp> + +#include <iterator> +#include <utility> + +#include <boost/proto/core.hpp> +#include <boost/proto/transform.hpp> + +#include <boost/utility/enable_if.hpp> +#include <boost/type_traits/is_same.hpp> +#include <boost/type_traits/remove_reference.hpp> +#include <boost/type_traits/add_const.hpp> + +#include <boost/mpl/vector.hpp> +#include <boost/mpl/set.hpp> +#include <boost/mpl/has_key.hpp> +#include <boost/mpl/int.hpp> +#include <boost/mpl/less_equal.hpp> + +#if BOOST_VERSION >= 104000 +#include <boost/mpl/string.hpp> +#endif + +#include <boost/fusion/container/vector.hpp> +#include <boost/fusion/include/at_c.hpp> +#include <boost/fusion/include/make_map.hpp> +#include <boost/fusion/include/pair.hpp> +#include <boost/fusion/include/as_vector.hpp> +#include <boost/fusion/include/pair.hpp> +#include <boost/fusion/include/is_sequence.hpp> + +#include <boost/type_traits/remove_reference.hpp> + +#include <boost/preprocessor/repetition/enum_params.hpp> +#include <boost/preprocessor/arithmetic/sub.hpp> +#include <boost/preprocessor/punctuation/comma_if.hpp> +#include <boost/preprocessor/control/expr_if.hpp> +#include <boost/preprocessor/punctuation/comma.hpp> +#include <boost/preprocessor/arithmetic/add.hpp> +#include <boost/preprocessor/cat.hpp> +#include <boost/preprocessor/comparison/less.hpp> +#include <boost/preprocessor/arithmetic/dec.hpp> +#include <boost/preprocessor/repetition/repeat_from_to.hpp> +#include <boost/preprocessor/cat.hpp> + +#include <boost/msm/msm_grammar.hpp> +#include <boost/msm/active_state_switching_policies.hpp> +#include <boost/msm/event_traits.hpp> +#include <boost/msm/front/functor_row.hpp> + +namespace proto = boost::proto; + +BOOST_MPL_HAS_XXX_TRAIT_DEF(tag_type) +BOOST_MPL_HAS_XXX_TRAIT_DEF(action_name) +BOOST_MPL_HAS_XXX_TRAIT_DEF(not_intern_euml_state) + +namespace boost { namespace msm { namespace front { namespace euml +{ +template <class T> +struct get_iterator +{ + typedef typename T::iterator type; +}; +template <class T> +struct get_reverse_iterator +{ + typedef typename T::reverse_iterator type; +}; +template <class T> +struct get_reference +{ + typedef typename T::reference type; +}; +template <class T> +struct get_size_type +{ + typedef typename T::size_type type; +}; +template <class T> +struct get_value_type +{ + typedef typename T::value_type type; +}; +template <class T> +struct get_first_type +{ + typedef typename T::first_type type; +}; +template <class T> +struct get_second_type +{ + typedef typename T::second_type type; +}; +template <class T> +struct get_action_tag_type +{ + typedef typename ::boost::mpl::has_key< + typename T::tag_type,action_tag>::type type; +}; +template <class T> +struct get_state_action_tag_type +{ + typedef typename ::boost::mpl::has_key< + typename T::tag_type,state_action_tag>::type type; +}; + +template <class T,class EVT,class FSM,class SourceState,class TargetState> +struct get_result_type +{ + typedef typename T::template transition_action_result<EVT,FSM,SourceState,TargetState>::type type; +}; +template <class T,class Event,class FSM,class STATE> +struct get_result_type2 +{ + typedef typename T::template state_action_result<Event,FSM,STATE>::type type; +}; +template<class SEQ> +struct get_sequence +{ + typedef typename SEQ::sequence type; +}; + +template <class T> +struct get_attributes_type +{ + typedef typename T::attributes_type type; +}; + +template <class T> +struct get_euml_tag_type +{ + typedef typename T::euml_tag_type type; +}; + +template <class T,class Arg1=void,class Arg2=void,class Arg3=void,class Arg4=void,class Arg5=void +#ifdef BOOST_MSVC +,class Arg6=void +#endif +> +struct get_fct +{ + typedef typename T::template In<Arg1,Arg2,Arg3,Arg4,Arg5 +#ifdef BOOST_MSVC +,Arg6 +#endif +>::type type; +}; + +// used to differentiate between different types of euml_state's +template <class T,class Enable=void> +struct get_state_name +{ + typedef T type; +}; + +template <class T> +struct get_state_name<T,typename ::boost::enable_if<has_not_intern_euml_state<T> >::type> +{ + typedef typename T::In::type type; +}; + +template <class T> +struct get_action_name +{ + typedef typename T::action_name type; +}; +template <class T> +struct get_event_name +{ + typedef typename T::event_name type; +}; + +template <class EVT> +struct euml_event: proto::extends<typename proto::terminal<event_tag>::type, EVT, boost::msm::sm_domain> +{ + typedef event_tag euml_tag_type; + typedef EVT event_name; + using proto::extends<typename proto::terminal<event_tag>::type, EVT, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef EVT type; + }; +}; + +template <class STATE> +struct euml_state_intern: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, boost::msm::state_domain> +{ + typedef state_tag euml_tag_type; + using proto::extends<typename proto::terminal<state_tag>::type, STATE, boost::msm::state_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif + > + struct In + { + typedef STATE type; + }; +}; +template <class STATE> +struct euml_state: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, boost::msm::state_domain> +{ + typedef state_tag euml_tag_type; + typedef int not_intern_euml_state; + using proto::extends<typename proto::terminal<state_tag>::type, STATE, boost::msm::state_domain>::operator=; + struct In + { + typedef STATE type; + }; +}; +template <class ACTION> +struct euml_action: proto::extends<typename proto::terminal<action_tag>::type, ACTION, boost::msm::sm_domain> +{ + typedef action_tag euml_tag_type; + typedef ACTION action_name; + using proto::extends<typename proto::terminal<action_tag>::type, ACTION, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef ACTION type; + }; +}; +template <class FLAG> +struct euml_flag: proto::extends<typename proto::terminal<flag_tag>::type, FLAG, boost::msm::sm_domain> +{ + typedef flag_tag euml_tag_type; + using proto::extends<typename proto::terminal<flag_tag>::type, FLAG, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef FLAG type; + }; +}; + +template <class CONFIG> +struct euml_config: proto::extends<typename proto::terminal<config_tag>::type, CONFIG, boost::msm::sm_domain> +{ + typedef config_tag euml_tag_type; + using proto::extends<typename proto::terminal<config_tag>::type, CONFIG, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef CONFIG type; + }; +}; + +struct No_Exception : euml_config<No_Exception> +{ + typedef int no_exception_thrown; + No_Exception(){} +}; +struct No_Msg_Queue : euml_config<No_Msg_Queue> +{ + typedef int no_message_queue; + No_Msg_Queue(){} +}; +struct Deferred_Events : euml_config<Deferred_Events> +{ + typedef int activate_deferred_events; + Deferred_Events(){} +}; +No_Exception const no_exception=No_Exception(); +No_Msg_Queue const no_msg_queue=No_Msg_Queue(); +Deferred_Events const deferred_events=Deferred_Events(); + +struct ActiveStateSwitchBeforeTransition : euml_config<ActiveStateSwitchBeforeTransition> +{ + typedef boost::msm::active_state_switch_before_transition active_state_switch_policy; + ActiveStateSwitchBeforeTransition(){} +}; +ActiveStateSwitchBeforeTransition const switch_active_before_transition = ActiveStateSwitchBeforeTransition(); + +struct ActiveStateSwitchAfterExit : euml_config<ActiveStateSwitchAfterExit> +{ + typedef boost::msm::active_state_switch_after_exit active_state_switch_policy; + ActiveStateSwitchAfterExit(){} +}; +ActiveStateSwitchAfterExit const switch_active_after_exit = ActiveStateSwitchAfterExit(); + +struct ActiveStateSwitchAfterAction : euml_config<ActiveStateSwitchAfterAction> +{ + typedef boost::msm::active_state_switch_after_transition_action active_state_switch_policy; + ActiveStateSwitchAfterAction(){} +}; +ActiveStateSwitchAfterAction const switch_active_after_action = ActiveStateSwitchAfterAction(); + + +struct invalid_type{}; +struct make_invalid_type +{ + typedef invalid_type type; +}; + +template <class ROW> +struct make_vector_one_row +{ + typedef boost::mpl::vector<ROW> type; +}; +template <class T> +T make_T(T t) {return t;} + +struct make_vector_no_row +{ + typedef boost::mpl::vector0<> type; +}; + +struct NoAction : euml_action<NoAction> +{ + NoAction(){} + // return value if used inside a state action (entry/exit) + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef bool type; + }; + // return value if used inside a transition (action/guard) + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef bool type; + }; + // this functor can be used in both modes, state action and transition action + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class Event,class FSM,class STATE> + bool operator()(Event const&,FSM&,STATE& ) + { + // does nothing + return true; + } + template <class EVT,class FSM,class SourceState,class TargetState> + bool operator()(EVT const& ,FSM& ,SourceState& ,TargetState&)const + { + // does nothing + return true; + } +}; +NoAction const no_action = NoAction(); + +struct fsm_artefact_tag {}; +template <class Index=void> +struct GetSource_ : euml_action<GetSource_<Index> > +{ + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef typename ::boost::fusion::result_of::at_key<typename SourceState::attributes_type, + Index >::type type; + }; + typedef ::boost::mpl::set<action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& ,FSM& ,SourceState& src,TargetState&)const + { + return src.get_attribute(Index()); + } +}; +template<> +struct GetSource_<void> : euml_action<GetSource_<void> > +{ + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef SourceState& type; + }; + typedef ::boost::mpl::set<action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& , FSM&,SourceState& src,TargetState& )const + { + return src; + } +}; +struct GetSource_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetSource_Helper, boost::msm::sm_domain> +{ + GetSource_Helper(){} + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef GetSource_<Arg1> type; + }; +}; +GetSource_Helper const source_ = GetSource_Helper(); + +template <class Index=void> +struct GetTarget_ : euml_action<GetTarget_<Index> > +{ + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef typename ::boost::fusion::result_of::at_key<typename TargetState::attributes_type, + Index >::type type; + }; + typedef ::boost::mpl::set<action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& ,FSM& ,SourceState& ,TargetState& tgt)const + { + return tgt.get_attribute(Index()); + } +}; +template<> +struct GetTarget_<void> : euml_action<GetTarget_<void> > +{ + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef TargetState& type; + }; + typedef ::boost::mpl::set<action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& , FSM&,SourceState& ,TargetState& tgt)const + { + return tgt; + } +}; +struct GetTarget_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetTarget_Helper, boost::msm::sm_domain> +{ + GetTarget_Helper(){} + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef GetTarget_<Arg1> type; + }; +}; +GetTarget_Helper const target_ = GetTarget_Helper(); + +template <class Index=void> +struct GetState_ : euml_action<GetState_<Index> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef typename ::boost::fusion::result_of::at_key<typename STATE::attributes_type, + Index >::type type; + }; + typedef ::boost::mpl::set<state_action_tag> tag_type; + + template <class Event,class FSM,class STATE> + typename state_action_result<Event,FSM,STATE>::type + operator()(Event const&,FSM& ,STATE& state ) + { + return state.get_attribute(Index()); + } +}; +template<> +struct GetState_<void> : euml_action<GetState_<void> > +{ + using euml_action<GetState_ >::operator=; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef STATE& type; + }; + typedef ::boost::mpl::set<state_action_tag> tag_type; + + template <class Event,class FSM,class STATE> + typename state_action_result<Event,FSM,STATE>::type + operator()(Event const&,FSM& ,STATE& state ) + { + return state; + } +}; +struct GetState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetState_Helper, boost::msm::sm_domain> +{ + GetState_Helper(){} + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef GetState_<Arg1> type; + }; +}; +GetState_Helper const state_ = GetState_Helper(); + +template <class Index=void> +struct GetEvent_ : euml_action<GetEvent_<Index> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef typename ::boost::add_const< + typename ::boost::fusion::result_of::at_key<typename Event::attributes_type, + Index >::type>::type type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef typename ::boost::add_const< + typename ::boost::fusion::result_of::at_key<typename EVT::attributes_type, + Index >::type>::type type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class Event,class FSM,class STATE> + typename state_action_result<Event,FSM,STATE>::type + operator()(Event const& evt,FSM& ,STATE& ) + { + return evt.get_attribute(Index()); + } + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& evt ,FSM& ,SourceState& ,TargetState&)const + { + return evt.get_attribute(Index()); + } +}; +template <> +struct GetEvent_<void> : euml_action<GetEvent_<void> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef Event const& type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef EVT const& type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class Event,class FSM,class STATE> + typename state_action_result<Event,FSM,STATE>::type + operator()(Event const& evt,FSM& ,STATE& ) + { + return evt; + } + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& evt ,FSM& ,SourceState& ,TargetState&)const + { + return evt; + } +}; +struct GetEvent_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetEvent_Helper, boost::msm::sm_domain> +{ + GetEvent_Helper(){} + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef GetEvent_<Arg1> type; + }; +}; +GetEvent_Helper const event_ = GetEvent_Helper(); + +template <class Index=void> +struct GetFsm_ : euml_action<GetFsm_<Index> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef typename ::boost::fusion::result_of::at_key<typename FSM::attributes_type, + Index >::type type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef typename ::boost::fusion::result_of::at_key<typename FSM::attributes_type, + Index >::type type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class Event,class FSM,class STATE> + typename state_action_result<Event,FSM,STATE>::type + operator()(Event const&,FSM& fsm,STATE& ) + { + return fsm.get_attribute(Index()); + } + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& ,FSM& fsm,SourceState& ,TargetState&)const + { + return fsm.get_attribute(Index()); + } +}; +template<> +struct GetFsm_<void> : euml_action<GetFsm_<void> > +{ + using euml_action<GetFsm_>::operator=; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef FSM& type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef FSM& type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class Event,class FSM,class STATE> + typename state_action_result<Event,FSM,STATE>::type + operator()(Event const&,FSM& fsm,STATE& ) + { + return fsm; + } + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& ,FSM& fsm,SourceState& ,TargetState&)const + { + return fsm; + } +}; +struct GetFsm_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetFsm_Helper, boost::msm::sm_domain> +{ + GetFsm_Helper(){} + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef GetFsm_<Arg1> type; + }; +}; +GetFsm_Helper const fsm_ = GetFsm_Helper(); + +template <class StateName,class Param1> +struct SubState_ : euml_action<SubState_<StateName, Param1> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef StateName& type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef StateName& type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + StateName& operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + return (Param1()(evt,fsm,src,tgt)).template get_state<StateName&>(); + } + template <class Event,class FSM,class STATE> + StateName& operator()(Event const& evt,FSM& fsm,STATE& state)const + { + return (Param1()(evt,fsm,state)).template get_state<StateName&>(); + } +}; +template <class StateName> +struct SubState_ <StateName,void> + : euml_action<SubState_<StateName, void > > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef StateName& type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef StateName& type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + StateName& operator()(EVT const&,FSM& fsm,SourceState& ,TargetState& )const + { + return fsm.template get_state<StateName&>(); + } + template <class Event,class FSM,class STATE> + StateName& operator()(Event const& ,FSM& fsm,STATE& )const + { + return fsm.template get_state<StateName&>(); + } +}; + +struct SubState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, boost::msm::sm_domain> +{ + SubState_Helper(){} + using proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef SubState_<Arg1,Arg2> type; + }; +}; +SubState_Helper const substate_ = SubState_Helper(); + +template <class Target,class Index> +struct GetAttribute_ : euml_action<GetAttribute_<Target, Index> > +{ + using euml_action<GetAttribute_<Target,Index> >::operator=; + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef typename + ::boost::fusion::result_of::at_key< + typename get_attributes_type< + typename ::boost::remove_reference< + typename get_result_type2<Target,Event,FSM,STATE>::type>::type>::type, + Index >::type type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef typename + ::boost::fusion::result_of::at_key< + typename get_attributes_type< + typename ::boost::remove_reference< + typename get_result_type<Target,EVT,FSM,SourceState,TargetState>::type>::type>::type, + Index >::type type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + typename ::boost::enable_if< + typename ::boost::mpl::has_key< + typename Target::tag_type,action_tag>::type, + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const + { + return (Target()(evt,fsm,src,tgt)).get_attribute(Index()); + } + template <class Event,class FSM,class STATE> + typename ::boost::enable_if< + typename ::boost::mpl::has_key< + typename Target::tag_type,state_action_tag>::type, + typename state_action_result<Event,FSM,STATE>::type >::type + operator()(Event const& evt,FSM& fsm,STATE& state )const + { + return (Target()(evt,fsm,state)).get_attribute(Index()); + } +}; + +struct GetAttribute_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetAttribute_Helper, boost::msm::sm_domain> +{ + GetAttribute_Helper(){} + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef GetAttribute_<Arg1,Arg2> type; + }; +}; +GetAttribute_Helper const attribute_ = GetAttribute_Helper(); + +template <class Index> +struct Source_ : euml_action<Source_<Index> > +{ + using euml_action<Source_<Index> >::operator=; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef typename + ::boost::fusion::result_of::at_key<typename SourceState::attributes_type, + Index >::type type; + }; + typedef ::boost::mpl::set<action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& , FSM&,SourceState& src,TargetState& )const + { + return src.get_attribute(Index()); + } +}; +template <class Index> +struct Target_ : euml_action<Target_<Index> > +{ + using euml_action<Target_<Index> >::operator=; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef typename + ::boost::fusion::result_of::at_key<typename TargetState::attributes_type, + Index >::type type; + }; + typedef ::boost::mpl::set<action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& ,FSM& ,SourceState& ,TargetState& tgt)const + { + return tgt.get_attribute(Index()); + } +}; +template <class Index> +struct State_ : euml_action<State_<Index> > +{ + using euml_action<State_<Index> >::operator=; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef typename + ::boost::fusion::result_of::at_key<typename STATE::attributes_type, + Index >::type type; + }; + typedef ::boost::mpl::set<state_action_tag> tag_type; + + template <class Event,class FSM,class STATE> + typename state_action_result<Event,FSM,STATE>::type + operator()(Event const&,FSM& ,STATE& state ) + { + return state.get_attribute(Index()); + } +}; +template <class Index> +struct Event_ : euml_action<Event_<Index> > +{ + using euml_action<Event_<Index> >::operator=; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef typename ::boost::add_const< + typename ::boost::fusion::result_of::at_key<typename Event::attributes_type, + Index >::type>::type type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef typename ::boost::add_const< + typename ::boost::fusion::result_of::at_key<typename EVT::attributes_type, + Index >::type>::type type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class Event,class FSM,class STATE> + typename state_action_result<Event,FSM,STATE>::type + operator()(Event const& evt,FSM& ,STATE& ) + { + return evt.get_attribute(Index()); + } + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& evt ,FSM& ,SourceState& ,TargetState&)const + { + return evt.get_attribute(Index()); + } +}; +template <class StateType,class Index> +struct State_Attribute_ : euml_action<State_Attribute_<StateType,Index> > +{ + using euml_action<State_Attribute_<StateType,Index> >::operator=; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef typename + ::boost::fusion::result_of::at_key<typename StateType::attributes_type, + Index >::type type; + }; + typedef ::boost::mpl::set<state_action_tag> tag_type; + + template <class Event,class FSM,class STATE> + typename state_action_result<Event,FSM,STATE>::type + operator()(Event const&,FSM& fsm,STATE& ) + { + return fsm.template get_state<StateType&>().get_attribute(Index()); + } +}; + +template <class Index> +struct Fsm_ : euml_action<Fsm_<Index> > +{ + using euml_action<Fsm_<Index> >::operator=; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef typename + ::boost::fusion::result_of::at_key<typename FSM::attributes_type, + Index >::type type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef typename + ::boost::fusion::result_of::at_key<typename FSM::attributes_type, + Index >::type type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class Event,class FSM,class STATE> + typename state_action_result<Event,FSM,STATE>::type + operator()(Event const&,FSM& fsm,STATE& ) + { + return fsm.get_attribute(Index()); + } + template <class EVT,class FSM,class SourceState,class TargetState> + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type + operator()(EVT const& evt ,FSM& fsm,SourceState& ,TargetState&)const + { + return fsm.get_attribute(Index()); + } +}; + +struct True_ : euml::euml_action<True_> +{ + using euml_action<True_>::operator=; + True_(){} + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef bool type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef bool type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + bool operator()(EVT const&,FSM&,SourceState& ,TargetState& ) + { + return true; + } + template <class Event,class FSM,class STATE> + bool operator()(Event const&,FSM&,STATE& ) + { + return true; + } +}; +True_ const true_ = True_(); + +struct False_ : euml::euml_action<False_> +{ + using euml_action<False_>::operator=; + False_(){} + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef bool type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef bool type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + bool operator()(EVT const&,FSM&,SourceState& ,TargetState& ) + { + return false; + } + template <class Event,class FSM,class STATE> + bool operator()(Event const&,FSM&,STATE& ) + { + return false; + } +}; +False_ const false_ = False_(); + +template <int Val> +struct Int_ : euml_action<Int_<Val> > +{ + using euml_action<Int_<Val> >::operator=; + typedef ::boost::mpl::int_<Val> value_type; + enum {value = Val}; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef int type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef int type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + int operator()(EVT const& , FSM& ,SourceState& ,TargetState& ) + { + return Val; + } + template <class Event,class FSM,class STATE> + int operator()(Event const& ,FSM& ,STATE& ) + { + return Val; + } +}; + +template <char Val> +struct Char_ : euml_action<Char_<Val> > +{ + using euml_action<Char_<Val> >::operator=; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef char type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef char type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + char operator()(EVT const& , FSM& ,SourceState& ,TargetState& ) + { + return Val; + } + template <class Event,class FSM,class STATE> + char operator()(Event const& ,FSM& ,STATE& ) + { + return Val; + } +}; + +template <size_t Val> +struct Size_t_ : euml_action<Size_t_<Val> > +{ + using euml_action<Size_t_<Val> >::operator=; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef size_t type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef size_t type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + size_t operator()(EVT const& , FSM& ,SourceState& ,TargetState& ) + { + return Val; + } + template <class Event,class FSM,class STATE> + size_t operator()(Event const& ,FSM& ,STATE& ) + { + return Val; + } +}; + +#if BOOST_VERSION >= 104000 + +template <class T> +struct String_ : euml_action<String_<T> > +{ + using euml_action<String_<T> >::operator=; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef char const* type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef char const* type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + char const* operator()(EVT const& , FSM& ,SourceState& ,TargetState& ) + { + return ::boost::mpl::c_str<T>::value; + } + template <class Event,class FSM,class STATE> + char const* operator()(Event const& ,FSM& ,STATE& ) + { + return ::boost::mpl::c_str<T>::value; + } +}; +#endif + + +template <class T> +struct Predicate_ : euml_action<Predicate_<T> > +{ + using euml_action<Predicate_<T> >::operator=; + + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef T type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef T type; + }; + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + T operator()(EVT const& , FSM& ,SourceState& ,TargetState& ) + { + return T(); + } + template <class Event,class FSM,class STATE> + T operator()(Event const& ,FSM& ,STATE& ) + { + return T(); + } +}; + +template <class ToProcessEvt,class Param1, class Param2, class Param3, class Param4> +struct Process_ : euml_action<Process_<ToProcessEvt, Param1, Param2, Param3, Param4> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt()); + (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt()); + (Param3()(evt,fsm,src,tgt)).process_event(ToProcessEvt()); + (Param4()(evt,fsm,src,tgt)).process_event(ToProcessEvt()); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(ToProcessEvt()); + (Param2()(evt,fsm,state)).process_event(ToProcessEvt()); + (Param3()(evt,fsm,state)).process_event(ToProcessEvt()); + (Param4()(evt,fsm,state)).process_event(ToProcessEvt()); + } +}; +template <class ToProcessEvt> +struct Process_ <ToProcessEvt,void,void,void,void> + : euml_action<Process_<ToProcessEvt, void, void, void, void > > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const&,FSM& fsm,SourceState& ,TargetState& )const + { + fsm.process_event(ToProcessEvt()); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& ,FSM& fsm,STATE& )const + { + fsm.process_event(ToProcessEvt()); + } +}; + +template <class ToProcessEvt,class Param1> +struct Process_ <ToProcessEvt,Param1,void,void,void> + : euml_action<Process_<ToProcessEvt, Param1, void, void, void> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt()); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(ToProcessEvt()); + } +}; + +template <class ToProcessEvt,class Param1, class Param2> +struct Process_ <ToProcessEvt,Param1,Param2,void,void> + : euml_action<Process_<ToProcessEvt, Param1, Param2, void, void> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt()); + (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt()); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(ToProcessEvt()); + (Param2()(evt,fsm,state)).process_event(ToProcessEvt()); + } +}; + +template <class ToProcessEvt,class Param1, class Param2, class Param3> +struct Process_ <ToProcessEvt,Param1,Param2,Param3,void> + : euml_action<Process_<ToProcessEvt, Param1, Param2, Param3, void> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt()); + (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt()); + (Param3()(evt,fsm,src,tgt)).process_event(ToProcessEvt()); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(ToProcessEvt()); + (Param2()(evt,fsm,state)).process_event(ToProcessEvt()); + (Param3()(evt,fsm,state)).process_event(ToProcessEvt()); + } +}; + +//version for process_(event_) +template <> +struct Process_ <GetEvent_<void>,void,void,void,void> + : euml_action<Process_<GetEvent_<void>, void, void, void, void > > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& ,TargetState& )const + { + fsm.process_event(evt); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& )const + { + fsm.process_event(evt); + } +}; + +struct process_tag {}; +struct Process_Helper: proto::extends< proto::terminal<process_tag>::type, Process_Helper, boost::msm::sm_domain> +{ + Process_Helper(){} + using proto::extends< proto::terminal<process_tag>::type, Process_Helper, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef Process_<Arg1,Arg2,Arg3,Arg4,Arg5> type; + }; +}; +Process_Helper const process_ = Process_Helper(); + +template <class Param1, class Param2, class Param3, class Param4> +struct Reprocess_ : euml_action<Reprocess_<Param1, Param2, Param3, Param4> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(evt); + (Param2()(evt,fsm,src,tgt)).process_event(evt); + (Param3()(evt,fsm,src,tgt)).process_event(evt); + (Param4()(evt,fsm,src,tgt)).process_event(evt); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(evt); + (Param2()(evt,fsm,state)).process_event(evt); + (Param3()(evt,fsm,state)).process_event(evt); + (Param4()(evt,fsm,state)).process_event(evt); + } +}; +template <> +struct Reprocess_ <void,void,void,void> + : euml_action<Reprocess_<void, void, void, void > > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& ,TargetState& )const + { + fsm.process_event(evt); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& )const + { + fsm.process_event(evt); + } +}; + +template <class Param1> +struct Reprocess_ <Param1,void,void,void> + : euml_action<Reprocess_<Param1, void, void, void> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(evt); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(evt); + } +}; + +template <class Param1, class Param2> +struct Reprocess_ <Param1,Param2,void,void> + : euml_action<Reprocess_<Param1, Param2, void, void> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(evt); + (Param2()(evt,fsm,src,tgt)).process_event(evt); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(evt); + (Param2()(evt,fsm,state)).process_event(evt); + } +}; + +template <class Param1, class Param2, class Param3> +struct Reprocess_ <Param1,Param2,Param3,void> + : euml_action<Reprocess_<Param1, Param2, Param3, void> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(evt); + (Param2()(evt,fsm,src,tgt)).process_event(evt); + (Param3()(evt,fsm,src,tgt)).process_event(evt); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(evt); + (Param2()(evt,fsm,state)).process_event(evt); + (Param3()(evt,fsm,state)).process_event(evt); + } +}; +struct reprocess_tag {}; +struct Reprocess_Helper: proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, boost::msm::sm_domain> +{ + Reprocess_Helper(){} + using proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef Reprocess_<Arg1,Arg2,Arg3,Arg4> type; + }; +}; +Reprocess_Helper const reprocess_ = Reprocess_Helper(); + +template <class ToProcessEvt,class Value,class Param1, class Param2, class Param3> +struct Process2_ : euml_action<Process2_<ToProcessEvt,Value, Param1, Param2, Param3> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt))); + (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt))); + (Param3()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt))); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state))); + (Param2()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state))); + (Param3()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state))); + } +}; + +template <class ToProcessEvt,class Value> +struct Process2_ <ToProcessEvt,Value,void,void,void> + : euml_action<Process2_<ToProcessEvt,Value, void, void, void > > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + fsm.process_event(ToProcessEvt(Value()(evt,fsm,src,tgt))); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + fsm.process_event(ToProcessEvt(Value()(evt,fsm,state))); + } +}; + +template <class ToProcessEvt,class Value,class Param1> +struct Process2_ <ToProcessEvt,Value,Param1,void,void> + : euml_action<Process2_<ToProcessEvt,Value, Param1, void, void> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt))); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state))); + } +}; + +template <class ToProcessEvt,class Value,class Param1, class Param2> +struct Process2_ <ToProcessEvt,Value,Param1,Param2,void> + : euml_action<Process2_<ToProcessEvt,Value, Param1, Param2, void> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef void type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef void type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt))); + (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt))); + } + template <class Event,class FSM,class STATE> + void operator()(Event const& evt,FSM& fsm,STATE& state)const + { + (Param1()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state))); + (Param2()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state))); + } +}; + +struct process2_tag {}; +struct Process2_Helper : proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, boost::msm::sm_domain> +{ + Process2_Helper(){} + using proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef Process2_<Arg1,Arg2,Arg3,Arg4,Arg5> type; + }; +}; +Process2_Helper const process2_ = Process2_Helper(); + +template <class Flag,class Param1=void, class Enable=void > +struct Get_Flag_ : euml_action<Get_Flag_<Flag,Param1,Enable> > {}; + +template <class Flag,class Param1> +struct Get_Flag_ <Flag,Param1 + , typename ::boost::enable_if<typename ::boost::is_same<Param1,void>::type >::type> + : euml_action<Get_Flag_<Flag, Param1> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef bool type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef bool type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + bool operator()(EVT const&,FSM& fsm,SourceState& ,TargetState& )const + { + return fsm.template is_flag_active<Flag>(); + } + template <class Event,class FSM,class STATE> + bool operator()(Event const& ,FSM& fsm,STATE& )const + { + return fsm.template is_flag_active<Flag>(); + } +}; + +template <class Flag,class Param1> +struct Get_Flag_ <Flag,Param1 + , typename ::boost::disable_if< + typename ::boost::is_same<Param1,void>::type + >::type> + : euml_action<Get_Flag_<Flag, Param1> > +{ + template <class Event,class FSM,class STATE > + struct state_action_result + { + typedef bool type; + }; + template <class EVT,class FSM,class SourceState,class TargetState> + struct transition_action_result + { + typedef bool type; + }; + + typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type; + + template <class EVT,class FSM,class SourceState,class TargetState> + bool operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const + { + return (Param1()(evt,fsm,src,tgt)).template is_flag_active<Flag>(); + } + template <class Event,class FSM,class STATE> + bool operator()(Event const& evt,FSM& fsm,STATE& state)const + { + return (Param1()(evt,fsm,state)).template is_flag_active<Flag>(); + } +}; + +struct Get_Flag_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, Get_Flag_Helper, boost::msm::sm_domain> +{ + Get_Flag_Helper(){} + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef Get_Flag_<Arg1,Arg2> type; + }; +}; +Get_Flag_Helper const is_flag_ = Get_Flag_Helper(); + +// deferring an event +struct DeferEvent_ : euml_action< DeferEvent_ > +{ + typedef ::boost::mpl::set<action_tag> tag_type; + // mark as deferring to avoid stack overflows in certain conditions + typedef int deferring_action; + template <class EVT,class FSM,class SourceState,class TargetState> + void operator()(EVT const& evt,FSM& fsm,SourceState& ,TargetState& ) const + { + fsm.defer_event(evt); + } +}; +struct Defer_Helper : proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, boost::msm::sm_domain> +{ + Defer_Helper(){} + using proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef DeferEvent_ type; + }; +}; +Defer_Helper const defer_ = Defer_Helper(); + +struct explicit_tag {}; +struct Explicit_Helper : proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, boost::msm::sm_domain> +{ + Explicit_Helper(){} + using proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef typename Arg1::template direct<Arg2> type; + }; +}; +Explicit_Helper const explicit_ = Explicit_Helper(); + +struct entry_pt_tag {}; +struct Entry_Pt_Helper : proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, boost::msm::sm_domain> +{ + Entry_Pt_Helper(){} + using proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef typename Arg1::template entry_pt<Arg2> type; + }; +}; +Entry_Pt_Helper const entry_pt_ = Entry_Pt_Helper(); + +struct exit_pt_tag {}; +struct Exit_Pt_Helper : proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, boost::msm::sm_domain> +{ + Exit_Pt_Helper(){} + using proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, boost::msm::sm_domain>::operator=; + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 +#ifdef BOOST_MSVC + ,class Arg6 +#endif +> + struct In + { + typedef typename Arg1::template exit_pt<Arg2> type; + }; +}; +Exit_Pt_Helper const exit_pt_ = Exit_Pt_Helper(); + +#ifdef BOOST_MSVC +#define BOOST_MSM_EUML_FUNCTION(functor,function,function_name,result_trans,result_state) \ + template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \ + class Param5=void,class Param6=void,class Enable=void > \ + struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6,Enable> > {}; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::enable_if<typename ::boost::is_same<Param1,void>::type>::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type \ + operator()(EVT const& , FSM& ,SourceState& ,TargetState& )const { \ + return function ();} \ + template <class Event,class FSM,class STATE> \ + typename state_action_result<Event,FSM,STATE>::type \ + operator()(Event const& ,FSM& ,STATE& )const { \ + return function ();} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param1,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param2,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \ + ,Param4()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ + ,Param4()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param5,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param6,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \ + ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ + ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::is_same<Param6,void>::type>::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \ + ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt),Param6()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ + ,Param4()(evt,fsm,state),Param5()(evt,fsm,state),Param6()(evt,fsm,state));} }; \ + struct function_name ## tag{}; \ + struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \ + functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \ + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5,class Arg6> \ + struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5,Arg6> type;}; }; \ + functor ## Helper const function_name = functor ## Helper (); + +#define BOOST_MSM_EUML_METHOD(functor,function,function_name,result_trans,result_state) \ + template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \ + class Param5=void,class Param6=void,class Enable=void > \ + struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6,Enable> > {}; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::enable_if<typename ::boost::is_same<Param2,void>::type>::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function();} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function();} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \ + ,Param4()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ + ,Param4()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param5,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param6,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \ + ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ + ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \ + struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \ + typename ::boost::disable_if<typename ::boost::is_same<Param6,void>::type>::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \ + ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt),Param6()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ + ,Param4()(evt,fsm,state),Param5()(evt,fsm,state),Param6()(evt,fsm,state));} }; \ + struct function_name ## tag{}; \ + struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \ + functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \ + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5,class Arg6> \ + struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5,Arg6> type;}; }; \ + functor ## Helper const function_name = functor ## Helper (); + +#else + +#define BOOST_MSM_EUML_FUNCTION(functor,function,function_name,result_trans,result_state) \ + template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \ + class Param5=void,class Enable=void > \ + struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Enable> > {}; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5> \ + struct functor<Param1,Param2,Param3,Param4,Param5, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param1,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param2,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5> \ + struct functor<Param1,Param2,Param3,Param4,Param5, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5> \ + struct functor<Param1,Param2,Param3,Param4,Param5, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5> \ + struct functor<Param1,Param2,Param3,Param4,Param5, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \ + ,Param4()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ + ,Param4()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5> \ + struct functor<Param1,Param2,Param3,Param4,Param5, \ + typename ::boost::disable_if<typename ::boost::is_same<Param5,void>::type>::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \ + ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ + ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \ + struct function_name ## tag{}; \ + struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \ + functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \ + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5> \ + struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5> type;}; }; \ + functor ## Helper const function_name = functor ## Helper (); + +#define BOOST_MSM_EUML_METHOD(functor,function,function_name,result_trans,result_state) \ + template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \ + class Param5=void,class Enable=void > \ + struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Enable> > {}; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5> \ + struct functor<Param1,Param2,Param3,Param4,Param5, \ + typename ::boost::enable_if<typename ::boost::is_same<Param2,void>::type>::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function();} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function();} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5> \ + struct functor<Param1,Param2,Param3,Param4,Param5, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5> \ + struct functor<Param1,Param2,Param3,Param4,Param5, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5> \ + struct functor<Param1,Param2,Param3,Param4,Param5, \ + typename ::boost::disable_if<typename ::boost::mpl::or_< \ + typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \ + typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \ + ,Param4()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ + ,Param4()(evt,fsm,state));} }; \ + template <class Param1, class Param2, class Param3, class Param4, class Param5> \ + struct functor<Param1,Param2,Param3,Param4,Param5, \ + typename ::boost::disable_if<typename ::boost::is_same<Param5,void>::type>::type> \ + : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \ + template <class Event,class FSM,class STATE > struct state_action_result { \ + typedef result_state type;} ; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + struct transition_action_result { typedef result_trans type;}; \ + typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \ + template <class EVT,class FSM,class SourceState,class TargetState> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::action_tag>::type, \ + typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \ + operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \ + return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \ + ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt));} \ + template <class Event,class FSM,class STATE> \ + typename ::boost::enable_if<typename ::boost::mpl::has_key< \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename state_action_result<Event,FSM,STATE>::type >::type \ + operator()(Event const& evt,FSM& fsm,STATE& state )const { \ + return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ + ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \ + struct function_name ## tag{}; \ + struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \ + functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \ + template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5> \ + struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5> type;}; }; \ + functor ## Helper const function_name = functor ## Helper (); + +#endif + +#define RESULT_TYPE2_PARAM1 typename get_result_type2<Param1,Event,FSM,STATE>::type +#define RESULT_TYPE_PARAM1 typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type +#define RESULT_TYPE2_PARAM2 typename get_result_type2<Param2,Event,FSM,STATE>::type +#define RESULT_TYPE_PARAM2 typename get_result_type<Param2,EVT,FSM,SourceState,TargetState>::type +#define RESULT_TYPE2_PARAM3 typename get_result_type2<Param3,Event,FSM,STATE>::type +#define RESULT_TYPE_PARAM3 typename get_result_type<Param3,EVT,FSM,SourceState,TargetState>::type +#define RESULT_TYPE2_PARAM4 typename get_result_type2<Param4,Event,FSM,STATE>::type +#define RESULT_TYPE_PARAM4 typename get_result_type<Param4,EVT,FSM,SourceState,TargetState>::type +#define RESULT_TYPE2_PARAM5 typename get_result_type2<Param5,Event,FSM,STATE>::type +#define RESULT_TYPE_PARAM5 typename get_result_type<Param5,EVT,FSM,SourceState,TargetState>::type +#define RESULT_TYPE2_PARAM6 typename get_result_type2<Param6,Event,FSM,STATE>::type +#define RESULT_TYPE_PARAM6 typename get_result_type<Param6,EVT,FSM,SourceState,TargetState>::type + + +#define RESULT_TYPE2_DIFF_TYPE_ITER_TRAITS_PARAM1 typename std::iterator_traits<typename get_result_type2<Param1,Event,FSM,STATE>::type>::difference_type +#define RESULT_TYPE_DIFF_TYPE_ITER_TRAITS_PARAM1 typename std::iterator_traits<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::difference_type + +#define RESULT_TYPE2_REMOVE_REF_PARAM1 typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type +#define RESULT_TYPE_REMOVE_REF_PARAM1 typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type + +#define RESULT_TYPE2_PAIR_REMOVE_REF_PARAM1 std::pair<RESULT_TYPE2_REMOVE_REF_PARAM1,RESULT_TYPE2_REMOVE_REF_PARAM1> +#define RESULT_TYPE_PAIR_REMOVE_REF_PARAM1 std::pair<RESULT_TYPE_REMOVE_REF_PARAM1,RESULT_TYPE_REMOVE_REF_PARAM1> + +#define RESULT_TYPE2_GET_REF_REMOVE_REF_PARAM1 typename get_reference<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type +#define RESULT_TYPE_GET_REF_REMOVE_REF_PARAM1 typename get_reference<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type + +#define RESULT_TYPE2_GET_ITERATOR_REMOVE_REF_PARAM1 typename get_iterator<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type +#define RESULT_TYPE_GET_ITERATOR_REMOVE_REF_PARAM1 typename get_iterator<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type + +#define RESULT_TYPE2_GET_REV_ITERATOR_REMOVE_REF_PARAM1 typename get_reverse_iterator<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type +#define RESULT_TYPE_GET_REV_ITERATOR_REMOVE_REF_PARAM1 typename get_reverse_iterator<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type + +#define RESULT_TYPE2_GET_SIZE_TYPE_REMOVE_REF_PARAM1 typename get_size_type<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type +#define RESULT_TYPE_GET_SIZE_TYPE_REMOVE_REF_PARAM1 typename get_size_type<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type + +#define BOOST_MSM_EUML_ACTION(instance_name) \ + struct instance_name ## _impl; \ + struct instance_name ## _helper : msm::front::euml::euml_action<instance_name ## _impl> \ + { \ + instance_name ## _helper(){} \ + typedef instance_name ## _impl action_name; \ + }; \ + static instance_name ## _helper instance_name; \ + struct instance_name ## _impl : instance_name ## _helper + +#define BOOST_MSM_EUML_DECLARE_ACTION(instance_name) \ + struct instance_name ; \ + struct instance_name ## _helper : msm::front::euml::euml_action<instance_name > \ + { \ + instance_name ## _helper(){} \ + typedef instance_name action_name; \ + }; \ + struct instance_name : instance_name ## _helper + + +#define BOOST_MSM_EUML_EVENT(instance_name) \ + struct instance_name ## _helper : msm::front::euml::euml_event<instance_name ## _helper>{ \ + instance_name ## _helper(){} \ + instance_name ## _helper const& operator()() const {return *this;} }; \ + static instance_name ## _helper instance_name; + +// an event matching any event +struct kleene_ : msm::front::euml::euml_event<kleene_>, public boost::any +{ + kleene_() : boost::any(){} + template<typename ValueType> + kleene_(const ValueType & v) : boost::any(v){} +}; +static kleene_ kleene; + +#define BOOST_MSM_EUML_DECLARE_EVENT(instance_name) \ + struct instance_name : msm::front::euml::euml_event<instance_name >{ \ + instance_name(){} \ + instance_name const& operator()() const {return *this;} }; + +#define MSM_EUML_CONCAT(param1,param2) param1 +#define MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE1(z, n, unused) ARG ## n arg ## n +#define MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE2(z, n, unused) arg ## n +#define MSM_EUML_EVENT_INSTANCE_HELPER_ATTRIBUTE_MAP_ENTRY(z, n, unused) \ + typename boost::fusion::result_of::first< \ + typename ::boost::remove_reference< \ + typename boost::fusion::result_of::at_c<T, BOOST_PP_CAT( , n)>::type>::type>::type \ + +#define MSM_EUML_EVENT_HELPER_GET_ATTRIBUTE(z, n, unused) \ + get_attribute( \ + typename boost::fusion::result_of::first< \ + typename ::boost::remove_reference< \ + typename boost::fusion::result_of::at_c<T, n>::type>::type>::type())=arg ## n; + +#define MSM_EUML_EVENT_HELPER_CONSTRUCTORS(z, n, mytuple) \ + template <BOOST_PP_ENUM_PARAMS(n, class ARG)> \ + BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, mytuple) , _helper)(BOOST_PP_ENUM(n, MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE1, ~ )): \ + BOOST_PP_TUPLE_ELEM(2, 1, mytuple)(){ \ + init(BOOST_PP_ENUM(n, MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE2, ~ ),attribute_vec());} + +#define MSM_EUML_EVENT_INSTANCE_HELPER_ATTRIBUTE_MAP(z, n, unused) \ + template <BOOST_PP_ENUM_PARAMS(n, class ARG),class T> \ + void init(BOOST_PP_ENUM(n, MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE1, ~ ), \ + T,typename ::boost::enable_if< typename boost::mpl::eval_if< typename ::boost::fusion::traits::is_sequence<T>::type,size_helper<T,n>,::boost::mpl::false_>::type,void >::type* =0) \ + { \ + BOOST_PP_REPEAT_FROM_TO(0,n , \ + MSM_EUML_EVENT_HELPER_GET_ATTRIBUTE, ~) \ + } + +#define MSM_EUML_EVENT_INSTANCE_HELPER_OPERATOR_IMPL(z, n, instance) \ + template <BOOST_PP_ENUM_PARAMS(n, class ARG)> \ + BOOST_PP_CAT(instance,_helper) operator() \ + (BOOST_PP_ENUM(n, MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE1, ~ ))const{ \ + return BOOST_PP_CAT(instance,_helper) (BOOST_PP_ENUM(n, MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE2, ~ ));} + +#define BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(instance_name, attributes_name) \ + struct instance_name ## _helper : \ + msm::front::euml::euml_event<instance_name ## _helper> , public attributes_name \ + { \ + template <class T,int checked_size> struct size_helper \ + { \ + typedef typename ::boost::mpl::less_equal< \ + typename ::boost::fusion::result_of::size<T>::type, \ + ::boost::mpl::int_<checked_size> >::type type; \ + }; \ + BOOST_PP_CAT(instance_name,_helper()) : attributes_name(){} \ + typedef attributes_name::attributes_type attribute_map; \ + typedef ::boost::fusion::result_of::as_vector<attribute_map>::type attribute_vec; \ + BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(FUSION_MAX_MAP_SIZE ,1), \ + MSM_EUML_EVENT_HELPER_CONSTRUCTORS, (instance_name,attributes_name)) \ + BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(FUSION_MAX_MAP_SIZE ,1), \ + MSM_EUML_EVENT_INSTANCE_HELPER_ATTRIBUTE_MAP, ~) \ + BOOST_PP_CAT(instance_name,_helper) operator()(){ \ + return BOOST_PP_CAT(instance_name,_helper)();} \ + BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(FUSION_MAX_MAP_SIZE ,1), \ + MSM_EUML_EVENT_INSTANCE_HELPER_OPERATOR_IMPL, instance_name) \ + }; \ + static instance_name ## _helper instance_name; + +#define BOOST_MSM_EUML_EVENT_NAME(instance_name) instance_name ## _helper + +#define BOOST_MSM_EUML_FLAG_NAME(instance_name) instance_name ## _helper + +#define BOOST_MSM_EUML_FLAG(instance_name) \ + struct instance_name ## _helper : msm::front::euml::euml_flag<instance_name ## _helper>{}; \ + static instance_name ## _helper instance_name; + +#define BOOST_MSM_EUML_DECLARE_FLAG(instance_name) \ + struct instance_name : msm::front::euml::euml_flag<instance_name >{}; + +#define BOOST_MSM_EUML_STATE_NAME(instance_name) instance_name ## _helper + +#define BOOST_MSM_EUML_BUILD_STT_HELPER build_stt( +#define BOOST_MSM_EUML_BUILD_INTERNAL_STT_HELPER build_internal_stt( +#define BOOST_MSM_EUML_BUILD_STT_HELPER2(expr) expr) +#define BOOST_MSM_EUML_ENTRY_STATE_HELPER(expr) ,expr + + +#define BOOST_MSM_EUML_ATTRIBUTES(expr,instance_name) \ + typedef BOOST_TYPEOF(build_attributes expr) instance_name; + +// following macros declare a state type but do not create an instance +#define BOOST_MSM_EUML_DECLARE_STATE(expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_state<instance_name ## tag> expr) instance_name; + +#define BOOST_MSM_EUML_DECLARE_INTERRUPT_STATE(expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_interrupt_state<instance_name ## tag> expr) instance_name; + +#define BOOST_MSM_EUML_DECLARE_TERMINATE_STATE(expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_terminate_state<instance_name ## tag> expr) instance_name; + +#define BOOST_MSM_EUML_DECLARE_EXPLICIT_ENTRY_STATE(region,expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_explicit_entry_state<instance_name ## tag BOOST_MSM_EUML_ENTRY_STATE_HELPER(region) > expr) instance_name; + +#define BOOST_MSM_EUML_DECLARE_ENTRY_STATE(region,expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_entry_state<instance_name ## tag BOOST_MSM_EUML_ENTRY_STATE_HELPER(region) > expr) instance_name; + +#define BOOST_MSM_EUML_DECLARE_EXIT_STATE(expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_exit_state<instance_name ## tag> expr) instance_name; + +#define BOOST_MSM_EUML_DECLARE_STATE_MACHINE(expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_sm<instance_name ## tag> expr) instance_name; + +#define BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(expr,instance_name) \ + typedef int using_declared_table; \ + typedef BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) instance_name; + +#define BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(expr) \ + typedef BOOST_TYPEOF( \ + BOOST_MSM_EUML_BUILD_INTERNAL_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) internal_transition_table; + +// following macros declare a state type and create an instance +#define BOOST_MSM_EUML_STATE(expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_state<instance_name ## tag> expr) instance_name ## _helper; \ + static instance_name ## _helper instance_name; + +#define BOOST_MSM_EUML_INTERRUPT_STATE(expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_interrupt_state<instance_name ## tag> expr) instance_name ## _helper; \ + static instance_name ## _helper instance_name; + +#define BOOST_MSM_EUML_TERMINATE_STATE(expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_terminate_state<instance_name ## tag> expr) instance_name ## _helper; \ + static instance_name ## _helper instance_name; + +#define BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE(region,expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_explicit_entry_state<instance_name ## tag BOOST_MSM_EUML_ENTRY_STATE_HELPER(region) > expr) instance_name ## _helper; \ + static instance_name ## _helper instance_name; + +#define BOOST_MSM_EUML_ENTRY_STATE(region,expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_entry_state<instance_name ## tag BOOST_MSM_EUML_ENTRY_STATE_HELPER(region) > expr) instance_name ## _helper; \ + static instance_name ## _helper instance_name; + +#define BOOST_MSM_EUML_EXIT_STATE(expr,instance_name) \ + struct instance_name ## tag{}; \ + typedef BOOST_TYPEOF(build_exit_state<instance_name ## tag> expr) instance_name ## _helper; \ + static instance_name ## _helper instance_name; + + +#ifndef BOOST_MSVC + +#define BOOST_MSM_EUML_TRANSITION_TABLE(expr,instance_name) \ + typedef BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) instance_name ## _def; \ + struct instance_name ## _helper : public instance_name ## _def{instance_name ## _helper(){}}; \ + static instance_name ## _helper instance_name; + +#define BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expr,instance_name) \ + typedef BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_INTERNAL_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) instance_name ## _def; \ + struct instance_name ## _helper : public instance_name ## _def{instance_name ## _helper(){}}; \ + static instance_name ## _helper instance_name; + +#else + +#define BOOST_MSM_EUML_TRANSITION_TABLE(expr,instance_name) \ + struct instance_name ## _helper : \ + public BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) \ + {instance_name ## _helper(){}} ; \ + static instance_name ## _helper instance_name; + +#define BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expr,instance_name) \ + struct instance_name ## _helper : \ + public BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_INTERNAL_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) \ + {instance_name ## _helper(){}} ; \ + static instance_name ## _helper instance_name; + +#endif + +}}}} // boost::msm::front::euml + +namespace boost { namespace msm{ + template<> + struct is_kleene_event< boost::msm::front::euml::kleene_ > + { + typedef ::boost::mpl::true_ type; + }; +}} + +#endif // BOOST_MSM_FRONT_EUML_COMMON_H