Chris@16: // Copyright 2008 Christophe Henry Chris@16: // henry UNDERSCORE christophe AT hotmail DOT com Chris@16: // This is an extended version of the state machine available in the boost::mpl library Chris@16: // Distributed under the same license as the original. Chris@16: // Copyright for the original version: Chris@16: // Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed Chris@16: // under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_MSM_FRONT_EUML_OPERATOR_H Chris@16: #define BOOST_MSM_FRONT_EUML_OPERATOR_H Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(reference) Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(key_type) Chris@16: Chris@16: namespace boost { namespace msm { namespace front { namespace euml Chris@16: { Chris@16: Chris@16: template Chris@16: struct Or_ : euml_action > Chris@16: { Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt) Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt) || T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state) Chris@16: { Chris@16: return (T1()(evt,fsm,state) || T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct And_ : euml_action > Chris@16: { Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt) Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt) && T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state) Chris@16: { Chris@16: return (T1()(evt,fsm,state) && T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Not_ : euml_action > Chris@16: { Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt) Chris@16: { Chris@16: return !(T1()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state) Chris@16: { Chris@16: return !(T1()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct If_Else_ : euml_action > {}; Chris@16: Chris@16: template Chris@16: struct If_Else_::type >::type> Chris@16: : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename Action1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: if (Condition()(evt,fsm,src,tgt)) Chris@16: { Chris@16: return Action1()(evt,fsm,src,tgt); Chris@16: } Chris@16: return Action2()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename Action1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: if (Condition()(evt,fsm,state)) Chris@16: { Chris@16: return Action1()(evt,fsm,state); Chris@16: } Chris@16: return Action2()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct If_Else_::type >::type> Chris@16: : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: if (Condition()(evt,fsm,src,tgt)) Chris@16: { Chris@16: return Action1()(evt,fsm,src,tgt); Chris@16: } Chris@16: return Action2()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: if (Condition()(evt,fsm,state)) Chris@16: { Chris@16: return Action1()(evt,fsm,state); Chris@16: } Chris@16: return Action2()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct if_tag Chris@16: { Chris@16: }; Chris@16: struct If : proto::extends::type, If, boost::msm::sm_domain> Chris@16: { Chris@16: If(){} Chris@16: using proto::extends< proto::terminal::type, If, boost::msm::sm_domain>::operator=; Chris@16: template Chris@16: struct In Chris@16: { Chris@16: typedef If_Else_ type; Chris@16: }; Chris@16: }; Chris@16: If const if_then_else_; Chris@16: Chris@16: template Chris@16: struct If_Then_ : euml_action > {}; Chris@16: Chris@16: template Chris@16: struct If_Then_::type >::type> Chris@16: : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename Action1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: if (Condition()(evt,fsm,src,tgt)) Chris@16: { Chris@16: return Action1()(evt,fsm,src,tgt); Chris@16: } Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename Action1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: if (Condition()(evt,fsm,state)) Chris@16: { Chris@16: return Action1()(evt,fsm,state); Chris@16: } Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct If_Then_::type >::type> Chris@16: : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: if (Condition()(evt,fsm,src,tgt)) Chris@16: { Chris@16: return Action1()(evt,fsm,src,tgt); Chris@16: } Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: if (Condition()(evt,fsm,state)) Chris@16: { Chris@16: return Action1()(evt,fsm,state); Chris@16: } Chris@16: } Chris@16: }; Chris@16: struct if_then_tag Chris@16: { Chris@16: }; Chris@16: struct If_Then : proto::extends< proto::terminal::type, If_Then, boost::msm::sm_domain> Chris@16: { Chris@16: If_Then(){} Chris@16: using proto::extends< proto::terminal::type, If_Then, boost::msm::sm_domain>::operator=; Chris@16: template Chris@16: struct In Chris@16: { Chris@16: typedef If_Then_ type; Chris@16: }; Chris@16: }; Chris@16: If_Then const if_then_; Chris@16: Chris@16: template Chris@16: struct While_Do_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef void type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: Body body_; Chris@16: Condition cond_; Chris@16: while (cond_(evt,fsm,src,tgt)) Chris@16: { Chris@16: body_(evt,fsm,src,tgt); Chris@16: } Chris@16: } Chris@16: template Chris@16: void operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: Body body_; Chris@16: Condition cond_; Chris@16: while (cond_(evt,fsm,state)) Chris@16: { Chris@16: body_(evt,fsm,state); Chris@16: } Chris@16: } Chris@16: }; Chris@16: struct while_do_tag Chris@16: { Chris@16: }; Chris@16: struct While_Do_Helper : proto::extends< proto::terminal::type, While_Do_Helper, boost::msm::sm_domain> Chris@16: { Chris@16: While_Do_Helper(){} Chris@16: using proto::extends< proto::terminal::type, While_Do_Helper, boost::msm::sm_domain>::operator=; Chris@16: template Chris@16: struct In Chris@16: { Chris@16: typedef While_Do_ type; Chris@16: }; Chris@16: }; Chris@16: While_Do_Helper const while_; Chris@16: Chris@16: template Chris@16: struct Do_While_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef void type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: Condition cond_; Chris@16: Body body_; Chris@16: do Chris@16: { Chris@16: body_(evt,fsm,src,tgt); Chris@16: } while (cond_(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: void operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: Condition cond_; Chris@16: Body body_; Chris@16: do Chris@16: { Chris@16: body_(evt,fsm,state); Chris@16: } while (cond_(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: struct do_while_tag Chris@16: { Chris@16: }; Chris@16: struct Do_While_Helper : proto::extends< proto::terminal::type, Do_While_Helper, boost::msm::sm_domain> Chris@16: { Chris@16: Do_While_Helper(){} Chris@16: using proto::extends< proto::terminal::type, Do_While_Helper, boost::msm::sm_domain>::operator=; Chris@16: template Chris@16: struct In Chris@16: { Chris@16: typedef Do_While_ type; Chris@16: }; Chris@16: }; Chris@16: Do_While_Helper const do_while_; Chris@16: Chris@16: template Chris@16: struct For_Loop_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef void type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: End end_; Chris@16: EndLoop end_loop_; Chris@16: Body body_; Chris@16: for(Begin()(evt,fsm,src,tgt);end_(evt,fsm,src,tgt);end_loop_(evt,fsm,src,tgt)) Chris@16: { Chris@16: body_(evt,fsm,src,tgt); Chris@16: } Chris@16: } Chris@16: template Chris@16: void operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: End end_; Chris@16: EndLoop end_loop_; Chris@16: Body body_; Chris@16: for(Begin()(evt,fsm,state);end_(evt,fsm,state);end_loop_(evt,fsm,state)) Chris@16: { Chris@16: body_(evt,fsm,state); Chris@16: } Chris@16: } Chris@16: }; Chris@16: struct for_loop_tag Chris@16: { Chris@16: }; Chris@16: struct For_Loop_Helper : proto::extends< proto::terminal::type, For_Loop_Helper, boost::msm::sm_domain> Chris@16: { Chris@16: For_Loop_Helper(){} Chris@16: using proto::extends< proto::terminal::type, For_Loop_Helper, boost::msm::sm_domain>::operator=; Chris@16: template Chris@16: struct In Chris@16: { Chris@16: typedef For_Loop_ type; Chris@16: }; Chris@16: }; Chris@16: For_Loop_Helper const for_; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct Deref_ : euml_action > Chris@16: { Chris@16: Deref_(){} Chris@16: using euml_action >::operator=; Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::add_reference< Chris@16: typename std::iterator_traits < Chris@16: typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type>::value_type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::add_reference< Chris@16: typename std::iterator_traits< Chris@16: typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type Chris@16: >::value_type Chris@16: >::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return *(T()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return *(T()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Pre_inc_ : euml_action > Chris@16: { Chris@16: using euml_action >::operator=; Chris@16: Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return ++T()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return ++T()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Pre_dec_ : euml_action > Chris@16: { Chris@16: using euml_action >::operator=; Chris@16: Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return --T()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return --T()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Post_inc_ : euml_action > Chris@16: { Chris@16: using euml_action >::operator=; Chris@16: Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T()(evt,fsm,src,tgt)++; Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T()(evt,fsm,state)++; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Post_dec_ : euml_action > Chris@16: { Chris@16: using euml_action >::operator=; Chris@16: Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T()(evt,fsm,src,tgt)--; Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T()(evt,fsm,state)--; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Plus_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T1()(evt,fsm,src,tgt)+T2()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T1()(evt,fsm,state)+T2()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Minus_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T1()(evt,fsm,src,tgt)-T2()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T1()(evt,fsm,state)-T2()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Multiplies_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T1()(evt,fsm,src,tgt)*T2()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T1()(evt,fsm,state)*T2()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Divides_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T1()(evt,fsm,src,tgt)/T2()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T1()(evt,fsm,state)/T2()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Modulus_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T1()(evt,fsm,src,tgt)%T2()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T1()(evt,fsm,state)%T2()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Bitwise_And_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T1()(evt,fsm,src,tgt)&T2()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T1()(evt,fsm,state)&T2()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Bitwise_Or_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T1()(evt,fsm,src,tgt)|T2()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T1()(evt,fsm,state)|T2()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Bitwise_Xor_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T1()(evt,fsm,src,tgt)^T2()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T1()(evt,fsm,state)^T2()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Subscript_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct get_reference Chris@16: { Chris@16: typedef typename T::reference type; Chris@16: }; Chris@16: template Chris@16: struct get_mapped_type Chris@16: { Chris@16: typedef typename T::value_type::second_type& type; Chris@16: }; Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type container_type; Chris@16: typedef typename ::boost::mpl::eval_if< Chris@16: typename has_key_type::type, Chris@16: get_mapped_type, Chris@16: ::boost::mpl::eval_if< Chris@16: typename ::boost::is_pointer::type, Chris@16: ::boost::add_reference::type >, Chris@16: get_reference Chris@16: > Chris@16: >::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type container_type; Chris@16: typedef typename ::boost::mpl::eval_if< Chris@16: typename has_key_type::type, Chris@16: get_mapped_type, Chris@16: ::boost::mpl::eval_if< Chris@16: typename ::boost::is_pointer::type, Chris@16: ::boost::add_reference::type >, Chris@16: get_reference Chris@16: > Chris@16: >::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return T1()(evt,fsm,src,tgt)[T2()(evt,fsm,src,tgt)]; Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return T1()(evt,fsm,state)[T2()(evt,fsm,state)]; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Plus_Assign_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt)+=T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return (T1()(evt,fsm,state)+=T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Minus_Assign_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt)-=T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return (T1()(evt,fsm,state)-=T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Multiplies_Assign_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt)*=T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return (T1()(evt,fsm,state)*=T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Divides_Assign_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt)/=T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return (T1()(evt,fsm,state)/=T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Modulus_Assign_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt)%=T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return (T1()(evt,fsm,state)%=T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct ShiftLeft_Assign_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt)<<=T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return (T1()(evt,fsm,state)<<=T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct ShiftRight_Assign_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt)>>=T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return (T1()(evt,fsm,state)>>=T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct ShiftLeft_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt)< Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return (T1()(evt,fsm,state)< Chris@16: struct ShiftRight_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt)>>T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return (T1()(evt,fsm,state)>>T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Assign_ : euml_action > Chris@16: { Chris@16: using euml_action< Assign_ >::operator=; Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename get_result_type2::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename get_result_type::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt)=T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return (T1()(evt,fsm,state)=T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Unary_Plus_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return +T1()(evt,fsm,src,tgt); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return +T1()(evt,fsm,state); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Unary_Minus_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type2::type>::type type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef typename ::boost::remove_reference< Chris@16: typename get_result_type::type>::type type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,action_tag>::type, Chris@16: typename transition_action_result::type >::type Chris@16: operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return -(T1()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: typename ::boost::enable_if< Chris@16: typename ::boost::mpl::has_key< Chris@16: typename T1::tag_type,state_action_tag>::type, Chris@16: typename state_action_result::type >::type Chris@16: operator()(Event const& evt,FSM& fsm,STATE& state )const Chris@16: { Chris@16: return -(T1()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Less_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt) < T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state)const Chris@16: { Chris@16: return (T1()(evt,fsm,state) < T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct LessEqual_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt) <= T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state)const Chris@16: { Chris@16: return (T1()(evt,fsm,state) <= T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct Greater_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt) > T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state)const Chris@16: { Chris@16: return (T1()(evt,fsm,state) > T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct GreaterEqual_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt) >= T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state)const Chris@16: { Chris@16: return (T1()(evt,fsm,state) >= T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct EqualTo_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt) == T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state)const Chris@16: { Chris@16: return (T1()(evt,fsm,state) == T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct NotEqualTo_ : euml_action > Chris@16: { Chris@16: template Chris@16: struct state_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: template Chris@16: struct transition_action_result Chris@16: { Chris@16: typedef bool type; Chris@16: }; Chris@16: typedef ::boost::mpl::set tag_type; Chris@16: Chris@16: template Chris@16: bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const Chris@16: { Chris@16: return (T1()(evt,fsm,src,tgt) != T2()(evt,fsm,src,tgt)); Chris@16: } Chris@16: template Chris@16: bool operator()(Event const& evt,FSM& fsm,STATE& state)const Chris@16: { Chris@16: return (T1()(evt,fsm,state) != T2()(evt,fsm,state)); Chris@16: } Chris@16: }; Chris@16: Chris@16: }}}} Chris@16: Chris@16: #endif // BOOST_MSM_FRONT_EUML_OPERATOR_H