// 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_CONTAINER_H #define BOOST_MSM_FRONT_EUML_CONTAINER_H #include #include #include #include #include #include #include #include BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator_category) namespace boost { namespace msm { namespace front { namespace euml { template struct Front_ : euml_action > { template struct state_action_result { typedef typename get_reference< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_reference< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).front(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).front(); } }; struct front_tag {}; struct Front_Helper: proto::extends< proto::terminal::type, Front_Helper, sm_domain> { Front_Helper(){} template struct In { typedef Front_ type; }; }; Front_Helper const front_; template struct Back_ : euml_action > { template struct state_action_result { typedef typename get_reference< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_reference< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).back(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).back(); } }; struct back_tag {}; struct Back_Helper: proto::extends< proto::terminal::type, Back_Helper, sm_domain> { Back_Helper(){} template struct In { typedef Back_ type; }; }; Back_Helper const back_; template struct Begin_ : euml_action > { template struct state_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).begin(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).begin(); } }; struct begin_tag {}; struct Begin_Helper: proto::extends< proto::terminal::type, Begin_Helper, sm_domain> { Begin_Helper(){} template struct In { typedef Begin_ type; }; }; Begin_Helper const begin_; template struct End_ : euml_action > { template struct state_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).end(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).end(); } }; struct end_tag {}; struct End_Helper: proto::extends< proto::terminal::type, End_Helper, sm_domain> { End_Helper(){} template struct In { typedef End_ type; }; }; End_Helper const end_; template struct RBegin_ : euml_action > { template struct state_action_result { typedef typename get_reverse_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_reverse_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).rbegin(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).rbegin(); } }; struct rbegin_tag {}; struct RBegin_Helper: proto::extends< proto::terminal::type, RBegin_Helper, sm_domain> { RBegin_Helper(){} template struct In { typedef RBegin_ type; }; }; RBegin_Helper const rbegin_; template struct REnd_ : euml_action > { template struct state_action_result { typedef typename get_reverse_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_reverse_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).rend(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).rend(); } }; struct rend_tag {}; struct REnd_Helper: proto::extends< proto::terminal::type, REnd_Helper, sm_domain> { REnd_Helper(){} template struct In { typedef REnd_ type; }; }; REnd_Helper const rend_; template struct Push_Back_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).push_back(Element()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).push_back(Element()(evt,fsm,state)); } }; struct push_back_tag {}; struct Push_Back_Helper: proto::extends< proto::terminal::type, Push_Back_Helper, sm_domain> { Push_Back_Helper(){} template struct In { typedef Push_Back_ type; }; }; Push_Back_Helper const push_back_; template struct Pop_Back_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).pop_back(); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).pop_back(); } }; struct pop_back_tag {}; struct Pop_Back_Helper: proto::extends< proto::terminal::type, Pop_Back_Helper, sm_domain> { Pop_Back_Helper(){} template struct In { typedef Pop_Back_ type; }; }; Pop_Back_Helper const pop_back_; template struct Push_Front_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).push_front(Element()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).push_front(Element()(evt,fsm,state)); } }; struct push_front_tag {}; struct Push_Front_Helper: proto::extends< proto::terminal::type, Push_Front_Helper, sm_domain> { Push_Front_Helper(){} template struct In { typedef Push_Front_ type; }; }; Push_Front_Helper const push_front_; template struct Pop_Front_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).pop_front(); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).pop_front(); } }; struct pop_front_tag {}; struct Pop_Front_Helper: proto::extends< proto::terminal::type, Pop_Front_Helper, sm_domain> { Pop_Front_Helper(){} template struct In { typedef Pop_Front_ type; }; }; Pop_Front_Helper const pop_front_; template struct Clear_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).clear(); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).clear(); } }; struct clear_tag {}; struct Clear_Helper: proto::extends< proto::terminal::type, Clear_Helper, sm_domain> { Clear_Helper(){} template struct In { typedef Clear_ type; }; }; Clear_Helper const clear_; template struct ListReverse_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).reverse(); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).reverse(); } }; struct list_reverse_tag {}; struct ListReverse_Helper: proto::extends< proto::terminal::type, ListReverse_Helper, sm_domain> { ListReverse_Helper(){} template struct In { typedef ListReverse_ type; }; }; ListReverse_Helper const list_reverse_; template struct ListUnique_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).unique(); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).unique(); } }; template struct ListUnique_::type >::type> : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).unique(Predicate()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).unique(Predicate()(evt,fsm,state)); } }; struct list_unique_tag {}; struct ListUnique_Helper: proto::extends< proto::terminal::type, ListUnique_Helper, sm_domain> { ListUnique_Helper(){} template struct In { typedef ListUnique_ type; }; }; ListUnique_Helper const list_unique_; template struct ListSort_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).sort(); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).sort(); } }; template struct ListSort_::type >::type> : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).sort(Predicate()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).sort(Predicate()(evt,fsm,state)); } }; struct list_sort_tag {}; struct ListSort_Helper: proto::extends< proto::terminal::type, ListSort_Helper, sm_domain> { ListSort_Helper(){} template struct In { typedef ListSort_ type; }; }; ListSort_Helper const list_sort_; template struct Capacity_ : euml_action > { template struct state_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).capacity(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).capacity(); } }; struct capacity_tag {}; struct Capacity_Helper: proto::extends< proto::terminal::type, Capacity_Helper, sm_domain> { Capacity_Helper(){} template struct In { typedef Capacity_ type; }; }; Capacity_Helper const capacity_; template struct Size_ : euml_action > { template struct state_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).size(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).size(); } }; struct size_tag {}; struct Size_Helper: proto::extends< proto::terminal::type, Size_Helper, sm_domain> { Size_Helper(){} template struct In { typedef Size_ type; }; }; Size_Helper const size_; template struct Max_Size_ : euml_action > { template struct state_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).max_size(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).max_size(); } }; struct max_size_tag {}; struct Max_Size_Helper: proto::extends< proto::terminal::type, Max_Size_Helper, sm_domain> { Max_Size_Helper(){} template struct In { typedef Max_Size_ type; }; }; Max_Size_Helper const max_size_; template struct Reserve_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).reserve(Value()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).reserve(Value()(evt,fsm,state)); } }; struct reserve_tag {}; struct Reserve_Helper: proto::extends< proto::terminal::type, Reserve_Helper, sm_domain> { Reserve_Helper(){} template struct In { typedef Reserve_ type; }; }; Reserve_Helper const reserve_; template struct Resize_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).resize(Num()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).resize(Num()(evt,fsm,state)); } }; template struct Resize_::type >::type> : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).resize(Num()(evt,fsm,src,tgt),Value()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).resize(Num()(evt,fsm,state),Value()(evt,fsm,state)); } }; struct resize_tag {}; struct Resize_Helper: proto::extends< proto::terminal::type, Resize_Helper, sm_domain> { Resize_Helper(){} template struct In { typedef Resize_ type; }; }; Resize_Helper const resize_; // version for 3 parameters (sequence containers) template struct Insert_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state)); } }; // version for 2 parameters template struct Insert_ < Container,Param1,Param2,void> : euml_action > { // return value will actually not be correct for set::insert(it1,it2), should be void // but it's ok as nobody should call an inexistent return type template struct state_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; // version for transition + second param not an iterator (meaning that, Container is not an associative container) template typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename ::boost::mpl::not_< typename has_iterator_category< typename Param2::template transition_action_result::type >::type >::type >::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } // version for transition + second param is an iterator (meaning that, Container is an associative container) template typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename has_iterator_category< typename Param2::template transition_action_result::type >::type >::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } // version for state action + second param not an iterator (meaning that, Container is not an associative container) template typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename ::boost::mpl::not_< typename has_iterator_category< typename Param2::template state_action_result::type >::type >::type >::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } // version for state action + second param is an iterator (meaning that, Container is an associative container) template typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename has_iterator_category< typename Param2::template state_action_result::type >::type >::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; // version for 1 parameter (associative containers) template struct Insert_ < Container,Param1,void,void> : euml_action > { template struct state_action_result { typedef typename std::pair< typename get_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type,bool> type; }; template struct transition_action_result { typedef typename std::pair< typename get_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type,bool> type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state)); } }; struct insert_tag {}; struct Insert_Helper: proto::extends< proto::terminal::type, Insert_Helper, sm_domain> { Insert_Helper(){} template struct In { typedef Insert_ type; }; }; Insert_Helper const insert_; template struct Swap_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container1()(evt,fsm,src,tgt)).swap(Container2()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container1()(evt,fsm,state)).swap(Container2()(evt,fsm,state)); } }; struct swap_tag {}; struct Swap_Helper: proto::extends< proto::terminal::type, Swap_Helper, sm_domain> { Swap_Helper(){} template struct In { typedef Swap_ type; }; }; Swap_Helper const swap_; template struct Erase_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Iterator1::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).erase(Iterator1()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Iterator1::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).erase(Iterator1()(evt,fsm,state)); } }; template struct Erase_::type >::type> : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Iterator1::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).erase(Iterator1()(evt,fsm,src,tgt),Iterator2()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Iterator1::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).erase(Iterator1()(evt,fsm,state),Iterator2()(evt,fsm,state)); } }; struct erase_tag {}; struct Erase_Helper: proto::extends< proto::terminal::type, Erase_Helper, sm_domain> { Erase_Helper(){} template struct In { typedef Erase_ type; }; }; Erase_Helper const erase_; template struct Empty_ : euml_action > { template struct state_action_result { typedef bool type; }; template struct transition_action_result { typedef bool type; }; typedef ::boost::mpl::set tag_type; template bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).empty(); } template bool operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).empty(); } }; struct empty_tag {}; struct Empty_Helper: proto::extends< proto::terminal::type, Empty_Helper, sm_domain> { Empty_Helper(){} template struct In { typedef Empty_ type; }; }; Empty_Helper const empty_; template struct ListRemove_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).remove(Element()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).remove(Element()(evt,fsm,state)); } }; struct list_remove_tag {}; struct ListRemove_Helper: proto::extends< proto::terminal::type, ListRemove_Helper, sm_domain> { ListRemove_Helper(){} template struct In { typedef ListRemove_ type; }; }; ListRemove_Helper const list_remove_; template struct ListRemove_If_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).remove_if(Element()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).remove_if(Element()(evt,fsm,state)); } }; struct list_remove_if_tag {}; struct ListRemove_If_Helper: proto::extends< proto::terminal::type, ListRemove_If_Helper, sm_domain> { ListRemove_If_Helper(){} template struct In { typedef ListRemove_If_ type; }; }; ListRemove_If_Helper const list_remove_if_; template struct ListMerge_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).merge(ToMerge()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).merge(ToMerge()(evt,fsm,state)); } }; template struct ListMerge_::type >::type> : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).merge(ToMerge()(evt,fsm,src,tgt),Predicate()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).merge(ToMerge()(evt,fsm,state),Predicate()(evt,fsm,state)); } }; struct list_merge_tag {}; struct ListMerge_Helper: proto::extends< proto::terminal::type, ListMerge_Helper, sm_domain> { ListMerge_Helper(){} template struct In { typedef ListMerge_ type; }; }; ListMerge_Helper const list_merge_; template struct Splice_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).splice(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).splice(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; template struct Splice_::type, typename ::boost::mpl::not_< typename ::boost::is_same::type>::type>::type >::type> : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).splice(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).splice(Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state)); } }; template struct Splice_::type >::type> : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).splice(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt),Param4()(evt,fsm,src,tgt)); } template void operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).splice(Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state),Param4()(evt,fsm,state)); } }; struct splice_tag {}; struct Splice_Helper: proto::extends< proto::terminal::type, Splice_Helper, sm_domain> { Splice_Helper(){} template struct In { typedef Splice_ type; }; }; Splice_Helper const splice_; //template //struct StringFind_ : euml_action > //{ //}; template struct StringFind_ : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)). find(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)). find(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state)); } }; template struct StringFind_ < Container,Param1,void,void> : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).find(Param1()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).find(Param1()(evt,fsm,state)); } }; template struct StringFind_ : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).find(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).find(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; struct string_find_tag {}; struct StringFind_Helper: proto::extends< proto::terminal::type, StringFind_Helper, sm_domain> { StringFind_Helper(){} template struct In { typedef StringFind_ type; }; }; StringFind_Helper const string_find_; template struct StringRFind_ : euml_action > { }; template struct StringRFind_ < Container,Param1,Param2,Param3, typename ::boost::enable_if< typename ::boost::is_same::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).rfind(Param1()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).rfind(Param1()(evt,fsm,state)); } }; template struct StringRFind_ < Container,Param1,Param2,Param3, typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::is_same::type, typename ::boost::mpl::not_< typename ::boost::is_same::type >::type >::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).rfind(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).rfind(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; template struct StringRFind_< Container,Param1,Param2,Param3, typename ::boost::disable_if< typename ::boost::is_same::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)). rfind(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)). rfind(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state)); } }; struct string_rfind_tag {}; struct StringRFind_Helper: proto::extends< proto::terminal::type, StringRFind_Helper, sm_domain> { StringRFind_Helper(){} template struct In { typedef StringRFind_ type; }; }; StringRFind_Helper const string_rfind_; template struct StringFindFirstOf_ : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)). find_first_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)). find_first_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state)); } }; template struct StringFindFirstOf_ : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).find_first_of(Param1()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).find_first_of(Param1()(evt,fsm,state)); } }; template struct StringFindFirstOf_ : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).find_first_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).find_first_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; struct string_find_first_of_tag {}; struct StringFindFirstOf_Helper: proto::extends< proto::terminal::type, StringFindFirstOf_Helper, sm_domain> { StringFindFirstOf_Helper(){} template struct In { typedef StringFindFirstOf_ type; }; }; StringFindFirstOf_Helper const string_find_first_of_; template struct StringFindFirstNotOf_ : euml_action > { }; template struct StringFindFirstNotOf_ < Container,Param1,Param2,Param3, typename ::boost::enable_if< typename ::boost::is_same::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).find_first_not_of(Param1()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).find_first_not_of(Param1()(evt,fsm,state)); } }; template struct StringFindFirstNotOf_ < Container,Param1,Param2,Param3, typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::is_same::type, typename ::boost::mpl::not_< typename ::boost::is_same::type >::type >::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).find_first_not_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).find_first_not_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; template struct StringFindFirstNotOf_< Container,Param1,Param2,Param3, typename ::boost::disable_if< typename ::boost::is_same::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)). find_first_not_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)). find_first_not_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state)); } }; struct string_find_first_not_of_tag {}; struct StringFindFirstNotOf_Helper: proto::extends< proto::terminal::type, StringFindFirstNotOf_Helper, sm_domain> { StringFindFirstNotOf_Helper(){} template struct In { typedef StringFindFirstNotOf_ type; }; }; StringFindFirstNotOf_Helper const string_find_first_not_of_; template struct StringFindLastOf_ : euml_action > { }; template struct StringFindLastOf_ < Container,Param1,Param2,Param3, typename ::boost::enable_if< typename ::boost::is_same::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).find_last_of(Param1()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).find_last_of(Param1()(evt,fsm,state)); } }; template struct StringFindLastOf_ < Container,Param1,Param2,Param3, typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::is_same::type, typename ::boost::mpl::not_< typename ::boost::is_same::type >::type >::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).find_last_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).find_last_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; template struct StringFindLastOf_< Container,Param1,Param2,Param3, typename ::boost::disable_if< typename ::boost::is_same::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)). find_last_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)). find_last_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state)); } }; struct string_find_last_of_tag {}; struct StringFindLastOf_Helper: proto::extends< proto::terminal::type, StringFindLastOf_Helper, sm_domain> { StringFindLastOf_Helper(){} template struct In { typedef StringFindLastOf_ type; }; }; StringFindLastOf_Helper const string_find_last_of_; template struct StringFindLastNotOf_ : euml_action > { }; template struct StringFindLastNotOf_ < Container,Param1,Param2,Param3, typename ::boost::enable_if< typename ::boost::is_same::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).find_last_not_of(Param1()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).find_last_not_of(Param1()(evt,fsm,state)); } }; template struct StringFindLastNotOf_ < Container,Param1,Param2,Param3, typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::is_same::type, typename ::boost::mpl::not_< typename ::boost::is_same::type >::type >::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).find_last_not_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).find_last_not_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; template struct StringFindLastNotOf_< Container,Param1,Param2,Param3, typename ::boost::disable_if< typename ::boost::is_same::type >::type > : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type::size_type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)). find_last_not_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)). find_last_not_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state)); } }; struct string_find_last_not_of_tag {}; struct StringFindLastNotOf_Helper: proto::extends< proto::terminal::type, StringFindLastNotOf_Helper, sm_domain> { StringFindLastNotOf_Helper(){} template struct In { typedef StringFindLastNotOf_ type; }; }; StringFindLastNotOf_Helper const string_find_last_not_of_; template struct Npos_ : euml_action > { Npos_(){} template struct state_action_result { typedef typename Container::size_type type; }; template struct transition_action_result { typedef typename Container::size_type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return Container::npos; } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return Container::npos; } }; // version for 2 parameters template struct Associative_Erase_ : euml_action > { template struct state_action_result { typedef void type; }; template struct transition_action_result { typedef void type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).erase(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).erase(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; // version for 1 parameter template struct Associative_Erase_ < Container,Param1,void> : euml_action > { // return value will actually not be correct for set::erase(it), should be void // but it's ok as nobody should call an inexistent return type template struct state_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; // version for transition + param is an iterator template typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename has_iterator_category< typename Param1::template transition_action_result::type >::type >::type, void >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { (Container()(evt,fsm,src,tgt)).erase(Param1()(evt,fsm,src,tgt)); } // version for state action + param is an iterator template typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename has_iterator_category< typename Param1::template state_action_result::type >::type >::type, void >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { (Container()(evt,fsm,state)).erase(Param1()(evt,fsm,state)); } // version for transition + param not an iterator template typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename ::boost::mpl::not_< typename has_iterator_category< typename Param1::template transition_action_result::type >::type >::type >::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).erase(Param1()(evt,fsm,src,tgt)); } // version for state action + param not an iterator template typename ::boost::enable_if< typename ::boost::mpl::and_< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename ::boost::mpl::not_< typename has_iterator_category< typename Param1::template state_action_result::type >::type >::type >::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).erase(Param1()(evt,fsm,state)); } }; struct associative_erase_tag {}; struct Associative_Erase_Helper: proto::extends< proto::terminal::type, Associative_Erase_Helper, sm_domain> { Associative_Erase_Helper(){} template struct In { typedef Associative_Erase_ type; }; }; Associative_Erase_Helper const associative_erase_; template struct Associative_Find_ : euml_action > { template struct state_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).find(Param()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).find(Param()(evt,fsm,state)); } }; struct associative_find_tag {}; struct Associative_Find_Helper: proto::extends< proto::terminal::type, Associative_Find_Helper, sm_domain> { Associative_Find_Helper(){} template struct In { typedef Associative_Find_ type; }; }; Associative_Find_Helper const associative_find_; template struct AssociativeCount_ : euml_action > { template struct state_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).count(Param()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).count(Param()(evt,fsm,state)); } }; struct associative_count_tag {}; struct AssociativeCount_Helper: proto::extends< proto::terminal::type, AssociativeCount_Helper, sm_domain> { AssociativeCount_Helper(){} template struct In { typedef AssociativeCount_ type; }; }; AssociativeCount_Helper const associative_count_; template struct Associative_Lower_Bound_ : euml_action > { template struct state_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).lower_bound(Param()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).lower_bound(Param()(evt,fsm,state)); } }; struct associative_lower_bound_tag {}; struct Associative_Lower_Bound_Helper: proto::extends< proto::terminal::type, Associative_Lower_Bound_Helper, sm_domain> { Associative_Lower_Bound_Helper(){} template struct In { typedef Associative_Lower_Bound_ type; }; }; Associative_Lower_Bound_Helper const associative_lower_bound_; template struct Associative_Upper_Bound_ : euml_action > { template struct state_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).upper_bound(Param()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).upper_bound(Param()(evt,fsm,state)); } }; struct associative_upper_bound_tag {}; struct Associative_Upper_Bound_Helper: proto::extends< proto::terminal::type, Associative_Upper_Bound_Helper, sm_domain> { Associative_Upper_Bound_Helper(){} template struct In { typedef Associative_Upper_Bound_ type; }; }; Associative_Upper_Bound_Helper const associative_upper_bound_; template struct First_ : euml_action > { template struct state_action_result { typedef typename get_first_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_first_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).first; } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).first; } }; struct first_tag {}; struct First_Helper: proto::extends< proto::terminal::type, First_Helper, sm_domain> { First_Helper(){} template struct In { typedef First_ type; }; }; First_Helper const first_; template struct Second_ : euml_action > { template struct state_action_result { typedef typename get_second_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_second_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).second; } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).second; } }; struct second_tag {}; struct Second_Helper: proto::extends< proto::terminal::type, Second_Helper, sm_domain> { Second_Helper(){} template struct In { typedef Second_ type; }; }; Second_Helper const second_; template struct Associative_Equal_Range_ : euml_action > { template struct state_action_result { typedef std::pair< typename get_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type, typename get_iterator< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type > type; }; template struct transition_action_result { typedef std::pair< typename get_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type, typename get_iterator< typename ::boost::remove_reference< typename get_result_type::type>::type>::type > type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (T()(evt,fsm,src,tgt)).equal_range(Param()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename T::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (T()(evt,fsm,state)).equal_range(Param()(evt,fsm,state)); } }; struct associative_equal_range_tag {}; struct Associative_Equal_Range_Helper: proto::extends< proto::terminal::type, Associative_Equal_Range_Helper, sm_domain> { Associative_Equal_Range_Helper(){} template struct In { typedef Associative_Equal_Range_ type; }; }; Associative_Equal_Range_Helper const associative_equal_range_; template struct Substr_ : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)). substr(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)). substr(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; template struct Substr_ : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).substr(); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).substr(); } }; template struct Substr_ < Container,Param1,void> : euml_action > { template struct state_action_result { typedef typename remove_reference< typename get_result_type2::type>::type type; }; template struct transition_action_result { typedef typename remove_reference< typename get_result_type::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).substr(Param1()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).substr(Param1()(evt,fsm,state)); } }; struct substr_tag {}; struct Substr_Helper: proto::extends< proto::terminal::type, Substr_Helper, sm_domain> { Substr_Helper(){} template struct In { typedef Substr_ type; }; }; Substr_Helper const substr_; template struct StringCompare_ : euml_action > { template struct state_action_result { typedef int type; }; template struct transition_action_result { typedef int type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).compare(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt),Param4()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).compare(Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state),Param4()(evt,fsm,state)); } }; template struct StringCompare_ : euml_action > { template struct state_action_result { typedef int type; }; template struct transition_action_result { typedef int type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).compare(Param1()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).compare(Param1()(evt,fsm,state)); } }; template struct StringCompare_ : euml_action > { template struct state_action_result { typedef int type; }; template struct transition_action_result { typedef int type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).compare(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).compare(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; template struct StringCompare_ : euml_action > { template struct state_action_result { typedef int type; }; template struct transition_action_result { typedef int type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).compare(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).compare(Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state)); } }; struct string_compare_tag {}; struct StringCompare_Helper: proto::extends< proto::terminal::type, StringCompare_Helper, sm_domain> { StringCompare_Helper(){} template struct In { typedef StringCompare_ type; }; }; StringCompare_Helper const string_compare_; template struct Append_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).append (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).append (Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state)); } }; template struct Append_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).append(Param1()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).append(Param1()(evt,fsm,state)); } }; template struct Append_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).append(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).append(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; struct append_tag {}; struct Append_Helper: proto::extends< proto::terminal::type, Append_Helper, sm_domain> { Append_Helper(){} template struct In { typedef Append_ type; }; }; Append_Helper const append_; template struct StringInsert_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt),Param4()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state),Param4()(evt,fsm,state)); } }; template struct StringInsert_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; template struct StringInsert_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state)); } }; struct string_insert_tag {}; struct StringInsert_Helper: proto::extends< proto::terminal::type, StringInsert_Helper, sm_domain> { StringInsert_Helper(){} template struct In { typedef StringInsert_ type; }; }; StringInsert_Helper const string_insert_; template struct StringErase_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)). erase(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)). erase(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; template struct StringErase_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).erase(); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).erase(); } }; template struct StringErase_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).erase(Param1()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).erase(Param1()(evt,fsm,state)); } }; struct string_erase_tag {}; struct StringErase_Helper: proto::extends< proto::terminal::type, StringErase_Helper, sm_domain> { StringErase_Helper(){} template struct In { typedef StringErase_ type; }; }; StringErase_Helper const string_erase_; template struct StringAssign_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).assign (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).assign (Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state)); } }; template struct StringAssign_ < Container,Param1,void,void> : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).assign(Param1()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).assign(Param1()(evt,fsm,state)); } }; template struct StringAssign_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).assign(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).assign(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; struct assign_tag {}; struct StringAssign_Helper: proto::extends< proto::terminal::type, StringAssign_Helper, sm_domain> { StringAssign_Helper(){} template struct In { typedef StringAssign_ type; }; }; StringAssign_Helper const string_assign_; template struct StringReplace_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).replace (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt),Param4()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).replace (Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state),Param4()(evt,fsm,state)); } }; template struct StringReplace_ : euml_action > { template struct state_action_result { typedef typename get_result_type2::type type; }; template struct transition_action_result { typedef typename get_result_type::type type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).replace(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt), Param3()(evt,fsm,src,tgt)); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).replace(Param1()(evt,fsm,state),Param2()(evt,fsm,state), Param3()(evt,fsm,state)); } }; struct string_replace_tag {}; struct StringReplace_Helper: proto::extends< proto::terminal::type, StringReplace_Helper, sm_domain> { StringReplace_Helper(){} template struct In { typedef StringReplace_ type; }; }; StringReplace_Helper const string_replace_; template struct CStr_ : euml_action > { template struct state_action_result { typedef typename ::boost::add_const< typename get_value_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type>::type* type; }; template struct transition_action_result { typedef typename ::boost::add_const< typename get_value_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type>::type* type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).c_str(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).c_str(); } }; struct c_str_tag {}; struct CStr_Helper: proto::extends< proto::terminal::type, CStr_Helper, sm_domain> { CStr_Helper(){} template struct In { typedef CStr_ type; }; }; CStr_Helper const c_str_; template struct StringData_ : euml_action > { template struct state_action_result { typedef typename ::boost::add_const< typename get_value_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type>::type* type; }; template struct transition_action_result { typedef typename ::boost::add_const< typename get_value_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type>::type* type; }; typedef ::boost::mpl::set tag_type; template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,action_tag>::type, typename transition_action_result::type >::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).data(); } template typename ::boost::enable_if< typename ::boost::mpl::has_key< typename Container::tag_type,state_action_tag>::type, typename state_action_result::type >::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).data(); } }; struct string_data_tag {}; struct StringData_Helper: proto::extends< proto::terminal::type, StringData_Helper, sm_domain> { StringData_Helper(){} template struct In { typedef StringData_ type; }; }; StringData_Helper const string_data_; template struct StringCopy_ : euml_action > { }; template struct StringCopy_< Container,Param1,Param2,Param3, typename ::boost::enable_if< typename ::boost::is_same::type >::type > : euml_action > { template struct state_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)).copy(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)).copy(Param1()(evt,fsm,state),Param2()(evt,fsm,state)); } }; template struct StringCopy_< Container,Param1,Param2,Param3, typename ::boost::disable_if< typename ::boost::is_same::type >::type > : euml_action > { template struct state_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type2::type>::type>::type type; }; template struct transition_action_result { typedef typename get_size_type< typename ::boost::remove_reference< typename get_result_type::type>::type>::type type; }; typedef ::boost::mpl::set tag_type; template typename transition_action_result::type operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { return (Container()(evt,fsm,src,tgt)). copy(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt)); } template typename state_action_result::type operator()(Event const& evt,FSM& fsm,STATE& state )const { return (Container()(evt,fsm,state)). copy(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state)); } }; struct string_copy_tag {}; struct StringCopy_Helper: proto::extends< proto::terminal::type, StringCopy_Helper, sm_domain> { StringCopy_Helper(){} template struct In { typedef StringCopy_ type; }; }; StringCopy_Helper const string_copy_; }}}} #endif //BOOST_MSM_FRONT_EUML_CONTAINER_H