diff options
Diffstat (limited to 'boost/msm')
-rw-r--r-- | boost/msm/back/dispatch_table.hpp | 67 | ||||
-rw-r--r-- | boost/msm/back/favor_compile_time.hpp | 2 | ||||
-rw-r--r-- | boost/msm/back/metafunctions.hpp | 13 | ||||
-rw-r--r-- | boost/msm/back/state_machine.hpp | 186 | ||||
-rw-r--r-- | boost/msm/common.hpp | 2 | ||||
-rw-r--r-- | boost/msm/event_traits.hpp | 36 | ||||
-rw-r--r-- | boost/msm/front/euml/common.hpp | 143 | ||||
-rw-r--r-- | boost/msm/front/euml/container.hpp | 102 | ||||
-rw-r--r-- | boost/msm/front/euml/operator.hpp | 20 | ||||
-rw-r--r-- | boost/msm/front/euml/state_grammar.hpp | 25 | ||||
-rw-r--r-- | boost/msm/front/euml/transformation.hpp | 8 | ||||
-rw-r--r-- | boost/msm/front/functor_row.hpp | 22 | ||||
-rw-r--r-- | boost/msm/front/state_machine_def.hpp | 3 | ||||
-rw-r--r-- | boost/msm/front/states.hpp | 11 | ||||
-rw-r--r-- | boost/msm/msm_grammar.hpp | 40 |
15 files changed, 438 insertions, 242 deletions
diff --git a/boost/msm/back/dispatch_table.hpp b/boost/msm/back/dispatch_table.hpp index d233ff61db..caa830efc1 100644 --- a/boost/msm/back/dispatch_table.hpp +++ b/boost/msm/back/dispatch_table.hpp @@ -21,7 +21,9 @@ #include <boost/mpl/advance.hpp> #include <boost/type_traits/is_base_of.hpp> +#include <boost/type_traits/is_same.hpp> +#include <boost/msm/event_traits.hpp> #include <boost/msm/back/metafunctions.hpp> #include <boost/msm/back/common_types.hpp> @@ -146,6 +148,16 @@ struct dispatch_table typedef typename generate_state_set<Stt>::type state_list; BOOST_STATIC_CONSTANT(int, max_state = ( ::boost::mpl::size<state_list>::value)); + template <class Transition> + struct convert_event_and_forward + { + static HandledEnum execute(Fsm& fsm, int region_index, int state, Event const& evt) + { + typename Transition::transition_event forwarded(evt); + return Transition::execute(fsm,region_index,state,forwarded); + } + }; + // A function object for use with mpl::for_each that stuffs // transitions into cells. struct init_cell @@ -159,7 +171,7 @@ struct dispatch_table typename ::boost::disable_if< typename ::boost::is_same<typename Transition::current_state_type,Fsm>::type ,void>::type - init_event_base_case(Transition const&, ::boost::mpl::true_ const &) const + init_event_base_case(Transition const&, ::boost::mpl::true_ const &, ::boost::mpl::false_ const &) const { typedef typename create_stt<Fsm>::type stt; BOOST_STATIC_CONSTANT(int, state_id = @@ -170,18 +182,40 @@ struct dispatch_table typename ::boost::enable_if< typename ::boost::is_same<typename Transition::current_state_type,Fsm>::type ,void>::type - init_event_base_case(Transition const&, ::boost::mpl::true_ const &) const + init_event_base_case(Transition const&, ::boost::mpl::true_ const &, ::boost::mpl::false_ const &) const { self->entries[0] = reinterpret_cast<cell>(&Transition::execute); } + // version for transition event is boost::any + // first for all transitions, then for internal ones of a fsm + template <class Transition> + typename ::boost::disable_if< + typename ::boost::is_same<typename Transition::current_state_type,Fsm>::type + ,void>::type + init_event_base_case(Transition const&, ::boost::mpl::false_ const &, ::boost::mpl::true_ const &) const + { + typedef typename create_stt<Fsm>::type stt; + BOOST_STATIC_CONSTANT(int, state_id = + (get_state_id<stt,typename Transition::current_state_type>::value)); + self->entries[state_id+1] = &convert_event_and_forward<Transition>::execute; + } + template <class Transition> + typename ::boost::enable_if< + typename ::boost::is_same<typename Transition::current_state_type,Fsm>::type + ,void>::type + init_event_base_case(Transition const&, ::boost::mpl::false_ const &, ::boost::mpl::true_ const &) const + { + self->entries[0] = &convert_event_and_forward<Transition>::execute; + } + // version for transition event base of our event // first for all transitions, then for internal ones of a fsm template <class Transition> typename ::boost::disable_if< typename ::boost::is_same<typename Transition::current_state_type,Fsm>::type ,void>::type - init_event_base_case(Transition const&, ::boost::mpl::false_ const &) const + init_event_base_case(Transition const&, ::boost::mpl::false_ const &, ::boost::mpl::false_ const &) const { typedef typename create_stt<Fsm>::type stt; BOOST_STATIC_CONSTANT(int, state_id = @@ -192,7 +226,7 @@ struct dispatch_table typename ::boost::enable_if< typename ::boost::is_same<typename Transition::current_state_type,Fsm>::type ,void>::type - init_event_base_case(Transition const&, ::boost::mpl::false_ const &) const + init_event_base_case(Transition const&, ::boost::mpl::false_ const &, ::boost::mpl::false_ const &) const { self->entries[0] = &Transition::execute; } @@ -210,7 +244,9 @@ struct dispatch_table //only if the transition event is a base of our event is the reinterpret_case safe init_event_base_case(tr, ::boost::mpl::bool_< - ::boost::is_base_of<typename Transition::transition_event,Event>::type::value>() ); + ::boost::is_base_of<typename Transition::transition_event,Event>::type::value>(), + ::boost::mpl::bool_< + ::boost::msm::is_kleene_event<typename Transition::transition_event>::type::value>()); } dispatch_table* self; @@ -277,8 +313,12 @@ struct dispatch_table // this event is a compound one (not a real one, just one for use in event-less transitions) // Note this event cannot be used as deferred! + // case for internal transitions of this fsm template <class State> - void operator()(boost::msm::wrap<State> const&) + typename ::boost::disable_if< + typename ::boost::is_same<State,Fsm>::type + ,void>::type + operator()(boost::msm::wrap<State> const&,boost::msm::back::dummy<0> = 0) { typedef typename create_stt<Fsm>::type stt; BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,State>::value)); @@ -286,6 +326,15 @@ struct dispatch_table tofill_entries[state_id+1] = call_no_transition; } + template <class State> + typename ::boost::enable_if< + typename ::boost::is_same<State,Fsm>::type + ,void>::type + operator()(boost::msm::wrap<State> const&,boost::msm::back::dummy<1> = 0) + { + cell call_no_transition = &Fsm::default_eventless_transition; + tofill_entries[0] = call_no_transition; + } dispatch_table* self; cell* tofill_entries; }; @@ -305,7 +354,11 @@ struct dispatch_table typedef typename ::boost::mpl::reverse_fold< // filter on event ::boost::mpl::filter_view - <Stt, ::boost::is_base_of<transition_event< ::boost::mpl::placeholders::_>, Event> >, + <Stt, boost::mpl::or_< + ::boost::is_base_of<transition_event< ::boost::mpl::placeholders::_>, Event>, + ::boost::msm::is_kleene_event<transition_event< ::boost::mpl::placeholders::_> > + > + >, // build a map ::boost::mpl::map<>, ::boost::mpl::if_< diff --git a/boost/msm/back/favor_compile_time.hpp b/boost/msm/back/favor_compile_time.hpp index bda97d198d..74f40019bd 100644 --- a/boost/msm/back/favor_compile_time.hpp +++ b/boost/msm/back/favor_compile_time.hpp @@ -108,7 +108,7 @@ struct dispatch_table < Fsm, Stt, Event, ::boost::msm::back::favor_compile_time> std::deque<cell> one_state; }; template <class TransitionState> - static HandledEnum call_submachine(Fsm& fsm, int region, int state, Event const& evt) + static HandledEnum call_submachine(Fsm& fsm, int , int , Event const& evt) { return (fsm.template get_state<TransitionState&>()).process_any_event( ::boost::any(evt)); } diff --git a/boost/msm/back/metafunctions.hpp b/boost/msm/back/metafunctions.hpp index da1a421ca0..a1ffc35616 100644 --- a/boost/msm/back/metafunctions.hpp +++ b/boost/msm/back/metafunctions.hpp @@ -632,11 +632,22 @@ struct has_exit_pseudo_states ::boost::mpl::bool_<false> >::type type; }; +// builds flags (add internal_flag_list and flag_list). internal_flag_list is used for terminate/interrupt states +template <class StateType> +struct get_flag_list +{ + typedef typename ::boost::mpl::insert_range< + typename StateType::flag_list, + typename ::boost::mpl::end< typename StateType::flag_list >::type, + typename StateType::internal_flag_list + >::type type; +}; + template <class StateType> struct is_state_blocking { typedef typename ::boost::mpl::fold< - typename StateType::flag_list, ::boost::mpl::set<>, + typename get_flag_list<StateType>::type, ::boost::mpl::set<>, ::boost::mpl::if_< has_event_blocking_flag< ::boost::mpl::placeholders::_2>, ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::placeholders::_2 >, diff --git a/boost/msm/back/state_machine.hpp b/boost/msm/back/state_machine.hpp index e840a86d52..b6181cd252 100644 --- a/boost/msm/back/state_machine.hpp +++ b/boost/msm/back/state_machine.hpp @@ -52,6 +52,7 @@ #include <boost/msm/active_state_switching_policies.hpp> #include <boost/msm/row_tags.hpp> +#include <boost/msm/msm_grammar.hpp> #include <boost/msm/back/fold_to_list.hpp> #include <boost/msm/back/metafunctions.hpp> #include <boost/msm/back/history_policies.hpp> @@ -73,6 +74,7 @@ BOOST_MPL_HAS_XXX_TRAIT_DEF(history_policy) BOOST_MPL_HAS_XXX_TRAIT_DEF(fsm_check) BOOST_MPL_HAS_XXX_TRAIT_DEF(compile_policy) BOOST_MPL_HAS_XXX_TRAIT_DEF(queue_container_policy) +BOOST_MPL_HAS_XXX_TRAIT_DEF(using_declared_table) #ifndef BOOST_MSM_CONSTRUCTOR_ARG_SIZE #define BOOST_MSM_CONSTRUCTOR_ARG_SIZE 5 // default max number of arguments for constructors @@ -120,7 +122,16 @@ typedef ::boost::parameter::parameters< > > state_machine_signature; - +// just here to disable use of proto when not needed +template <class T, class F,class Enable=void> +struct make_euml_terminal; +template <class T,class F> +struct make_euml_terminal<T,F,typename ::boost::disable_if<has_using_declared_table<F> >::type> +{}; +template <class T,class F> +struct make_euml_terminal<T,F,typename ::boost::enable_if<has_using_declared_table<F> >::type> + : public proto::extends<typename proto::terminal< boost::msm::state_tag>::type, T, boost::msm::state_domain> +{}; // library-containing class for state machines. Pass the actual FSM class as // the Concrete parameter. @@ -136,6 +147,11 @@ class state_machine : //public Derived public ::boost::parameter::binding< typename state_machine_signature::bind<A0,A1,A2,A3,A4>::type, ::boost::msm::back::tag::front_end >::type + , public make_euml_terminal<state_machine<A0,A1,A2,A3,A4>, + typename ::boost::parameter::binding< + typename state_machine_signature::bind<A0,A1,A2,A3,A4>::type, ::boost::msm::back::tag::front_end + >::type + > { public: // Create ArgumentPack @@ -170,7 +186,8 @@ private: typedef ::boost::function< execute_return () > deferred_fct; typedef typename QueueContainerPolicy:: - template In<deferred_fct>::type deferred_events_queue_t; + template In< + std::pair<deferred_fct,bool> >::type deferred_events_queue_t; typedef typename QueueContainerPolicy:: template In<transition_fct>::type events_queue_t; @@ -255,7 +272,7 @@ private: { public: deferred_msg_queue_helper():m_deferred_events_queue(){} - deferred_events_queue_t m_deferred_events_queue; + deferred_events_queue_t m_deferred_events_queue; }; public: @@ -996,10 +1013,11 @@ private: // Take the transition action and return the next state. static HandledEnum execute(library_sm& fsm, int region_index, int , transition_event const& evt) { - execute_return res = - (::boost::fusion::at_key<current_state_type>(fsm.m_substate_list)).process_event(evt); - fsm.m_states[region_index]=get_state_id<stt,T1>::type::value; - return res; + // false as second parameter because this event is forwarded from outer fsm + execute_return res = + (::boost::fusion::at_key<current_state_type>(fsm.m_substate_list)).process_event_internal(evt,false); + fsm.m_states[region_index]=get_state_id<stt,T1>::type::value; + return res; } // helper metafunctions used by dispatch table and give the frow a new event // (used to avoid double entries in a table because of base events) @@ -1232,50 +1250,11 @@ private: do_exit(finalEvent,*this); } - // Main function used by clients of the derived FSM to make - // transitions. Can also be called for internally (for example in an action method) generated events. + // Main function used by clients of the derived FSM to make transitions. template<class Event> execute_return process_event(Event const& evt) { - HandledEnum ret_handled=HANDLED_FALSE; - // if the state machine has terminate or interrupt flags, check them, otherwise skip - if (is_event_handling_blocked_helper<Event> - ( ::boost::mpl::bool_<has_fsm_blocking_states<library_sm>::type::value>() ) ) - return HANDLED_TRUE; - // if a message queue is needed and processing is on the way - if (!do_pre_msg_queue_helper<Event> - (evt,::boost::mpl::bool_<is_no_message_queue<library_sm>::type::value>()) ) - { - // wait for the end of current processing - return HANDLED_TRUE; - } - else - { - // prepare the next deferred event for handling - // if one defer is found in the SM, otherwise skip - handle_defer_helper<library_sm> defer_helper(m_deferred_events_queue); - defer_helper.do_pre_handle_deferred(); - // process event - HandledEnum handled = this->do_process_helper<Event> - (evt,::boost::mpl::bool_<is_no_exception_thrown<library_sm>::type::value>()); - if (handled) - { - ret_handled = handled; - } - - // process completion transitions BEFORE any other event in the pool (UML Standard 2.3 §15.3.14) - handle_eventless_transitions_helper<library_sm> eventless_helper(this,(handled == HANDLED_TRUE)); - eventless_helper.process_completion_event(); - - // after handling, take care of the deferred events - defer_helper.do_post_handle_deferred(handled); - - // now check if some events were generated in a transition and was not handled - // because of another processing, and if yes, start handling them - do_post_msg_queue_helper(::boost::mpl::bool_<is_no_message_queue<library_sm>::type::value>()); - - return ret_handled; - } + return process_event_internal(evt,true); } template <class EventType> @@ -1748,16 +1727,16 @@ private: } // the following 2 functions handle the processing either with a try/catch protection or without template <class StateType,class EventType> - HandledEnum do_process_helper(EventType const& evt, ::boost::mpl::true_ const &) + HandledEnum do_process_helper(EventType const& evt, ::boost::mpl::true_ const &, bool is_direct_call) { - return this->do_process_event(evt); + return this->do_process_event(evt,is_direct_call); } template <class StateType,class EventType> - HandledEnum do_process_helper(EventType const& evt, ::boost::mpl::false_ const &) + HandledEnum do_process_helper(EventType const& evt, ::boost::mpl::false_ const &, bool is_direct_call) { try { - return this->do_process_event(evt); + return this->do_process_event(evt,is_direct_call); } catch (std::exception& e) { @@ -1789,24 +1768,40 @@ private: events_queue(a_queue),next_deferred_event(){} void do_pre_handle_deferred() { - if (!events_queue.m_deferred_events_queue.empty()) - { - next_deferred_event = events_queue.m_deferred_events_queue.back(); - events_queue.m_deferred_events_queue.pop_back(); - } } void do_post_handle_deferred(HandledEnum handled) { - if (((handled & HANDLED_DEFERRED) == HANDLED_DEFERRED) && next_deferred_event ) + if (handled == HANDLED_TRUE) { - // the event was already deferred, no reason to process another deferred event - events_queue.m_deferred_events_queue.push_back(next_deferred_event); - return; + // a transition has been taken, it makes sense again to try processing waiting deferred events + // reset all events to not tested + for (std::size_t i = 0; i < events_queue.m_deferred_events_queue.size(); ++i) + { + events_queue.m_deferred_events_queue[i].second=false; + } + // test first event + if (!events_queue.m_deferred_events_queue.empty()) + { + deferred_fct next = events_queue.m_deferred_events_queue.front().first; + events_queue.m_deferred_events_queue.pop_front(); + next(); + } } - else if (next_deferred_event) + else { - next_deferred_event(); + // look for next deferred event, if any + typename deferred_events_queue_t::iterator it = + std::find_if(events_queue.m_deferred_events_queue.begin(), + events_queue.m_deferred_events_queue.end(), + boost::bind(&std::pair<deferred_fct,bool>::second, _1) == false); + if (it != events_queue.m_deferred_events_queue.end()) + { + (*it).second = true; + deferred_fct next = (*it).first; + events_queue.m_deferred_events_queue.erase(it); + next(); + } } } @@ -1945,9 +1940,55 @@ private: HandledEnum& result; }; + // Main function used internally to make transitions + // Can only be called for internally (for example in an action method) generated events. + template<class Event> + execute_return process_event_internal(Event const& evt, bool is_direct_call) + { + HandledEnum ret_handled=HANDLED_FALSE; + // if the state machine has terminate or interrupt flags, check them, otherwise skip + if (is_event_handling_blocked_helper<Event> + ( ::boost::mpl::bool_<has_fsm_blocking_states<library_sm>::type::value>() ) ) + return HANDLED_TRUE; + // if a message queue is needed and processing is on the way + if (!do_pre_msg_queue_helper<Event> + (evt,::boost::mpl::bool_<is_no_message_queue<library_sm>::type::value>()) ) + { + // wait for the end of current processing + return HANDLED_TRUE; + } + else + { + // prepare the next deferred event for handling + // if one defer is found in the SM, otherwise skip + handle_defer_helper<library_sm> defer_helper(m_deferred_events_queue); + defer_helper.do_pre_handle_deferred(); + // process event + HandledEnum handled = this->do_process_helper<Event> + (evt,::boost::mpl::bool_<is_no_exception_thrown<library_sm>::type::value>(),is_direct_call); + if (handled) + { + ret_handled = handled; + } + + // process completion transitions BEFORE any other event in the pool (UML Standard 2.3 §15.3.14) + handle_eventless_transitions_helper<library_sm> eventless_helper(this,(handled == HANDLED_TRUE)); + eventless_helper.process_completion_event(); + + // after handling, take care of the deferred events + defer_helper.do_post_handle_deferred(handled); + + // now check if some events were generated in a transition and was not handled + // because of another processing, and if yes, start handling them + do_post_msg_queue_helper(::boost::mpl::bool_<is_no_message_queue<library_sm>::type::value>()); + + return ret_handled; + } + } + // minimum event processing without exceptions, queues, etc. template<class Event> - HandledEnum do_process_event(Event const& evt) + HandledEnum do_process_event(Event const& evt, bool is_direct_call) { HandledEnum handled = HANDLED_FALSE; // dispatch the event to every region @@ -1957,9 +1998,10 @@ private: // if the event has not been handled and we have orthogonal zones, then // generate an error on every active state // for state machine states contained in other state machines, do not handle - // but let the containing sm handle the error + // but let the containing sm handle the error, unless the event was generated in this fsm + // (by calling process_event on this fsm object, is_direct_call == true) // completion events do not produce an error - if (!handled && !is_contained() && !is_completion_event<Event>::type::value) + if ( (!is_contained() || is_direct_call) && !handled && !is_completion_event<Event>::type::value) { for (int i=0; i<nr_regions::value;++i) { @@ -1988,16 +2030,18 @@ private: } #define MSM_COMPOSITE_ACCEPT_SUB(z, n, unused) ARG ## n vis ## n +#define MSM_COMPOSITE_ACCEPT_SUB2(z, n, unused) boost::ref( vis ## n ) #define MSM_COMPOSITE_ACCEPT_EXECUTE(z, n, unused) \ template <BOOST_PP_ENUM_PARAMS(n, class ARG)> \ void composite_accept(BOOST_PP_ENUM(n, MSM_COMPOSITE_ACCEPT_SUB, ~ ) ) \ { \ this->accept(BOOST_PP_ENUM_PARAMS(n,vis)); \ - this->visit_current_states(BOOST_PP_ENUM_PARAMS(n,vis)); \ + this->visit_current_states(BOOST_PP_ENUM(n,MSM_COMPOSITE_ACCEPT_SUB2, ~)); \ } BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_COMPOSITE_ACCEPT_EXECUTE, ~) #undef MSM_COMPOSITE_ACCEPT_EXECUTE #undef MSM_COMPOSITE_ACCEPT_SUB +#undef MSM_COMPOSITE_ACCEPT_SUB2 // helper used to call the init states at the start of the state machine template <class Event> @@ -2080,7 +2124,7 @@ private: template <class StateType> void operator()( ::boost::msm::wrap<StateType> const& ) { - typedef typename StateType::flag_list flags; + typedef typename get_flag_list<StateType>::type flags; typedef typename ::boost::mpl::contains<flags,Flag >::type found; typedef typename is_composite_state<StateType>::type composite; @@ -2405,7 +2449,7 @@ BOOST_PP_REPEAT(BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_VISITOR_ARGS_EXE { typedef typename build_orthogonal_regions< library_sm, - typename Derived::initial_state + initial_states >::type all_regions; enum {region_index= find_region_index<all_regions,StateType>::value }; }; @@ -2477,6 +2521,8 @@ BOOST_PP_REPEAT(BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_VISITOR_ARGS_EXE // entry on the FSM (static_cast<Derived*>(self))->on_entry(evt,fsm); int state_id = get_state_id<stt,typename EventType::active_state::wrapped_entry>::value; + BOOST_STATIC_ASSERT(find_region_id<typename EventType::active_state::wrapped_entry>::region_index >= 0); + BOOST_STATIC_ASSERT(find_region_id<typename EventType::active_state::wrapped_entry>::region_index < nr_regions::value); // given region starts with the entry pseudo state as active state self->m_states[find_region_id<typename EventType::active_state::wrapped_entry>::region_index] = state_id; self->internal_start(evt.m_event); @@ -2600,7 +2646,7 @@ BOOST_PP_REPEAT(BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_VISITOR_ARGS_EXE // puts a deferred event in the queue void post_deferred_event(deferred_fct& deferred) { - m_deferred_events_queue.m_deferred_events_queue.push_front(deferred); + m_deferred_events_queue.m_deferred_events_queue.push_back(std::make_pair(deferred,true)); } // removes one event from the message queue and processes it template <class StateType> diff --git a/boost/msm/common.hpp b/boost/msm/common.hpp index b0335814fa..6a80b82275 100644 --- a/boost/msm/common.hpp +++ b/boost/msm/common.hpp @@ -11,8 +11,6 @@ #ifndef BOOST_MSM_COMMON_H #define BOOST_MSM_COMMON_H - - namespace boost { namespace msm { // wrapper for mpl::for_each as showed in the C++ Template Metaprogramming ch. 9 diff --git a/boost/msm/event_traits.hpp b/boost/msm/event_traits.hpp new file mode 100644 index 0000000000..4b2350594f --- /dev/null +++ b/boost/msm/event_traits.hpp @@ -0,0 +1,36 @@ +// 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_EVENT_TRAITS_H +#define BOOST_MSM_EVENT_TRAITS_H + +#include <boost/any.hpp> +#include <boost/mpl/bool.hpp> + +namespace boost { namespace msm +{ + +template< typename Event > +struct is_kleene_event +{ + // default: no event is a kleene event (kleene: matches any event in a transitions) + typedef ::boost::mpl::false_ type; +}; + +// add this way in this namespace specializations for events which you want to use as kleene +// requirement: a copy-constructor matching the events which will be converted to this kleene +template<> +struct is_kleene_event< boost::any > +{ + typedef ::boost::mpl::true_ type; +}; + +} } // boost::msm +#endif //BOOST_MSM_EVENT_TRAITS_H diff --git a/boost/msm/front/euml/common.hpp b/boost/msm/front/euml/common.hpp index 91864a275f..f9a9cc46fa 100644 --- a/boost/msm/front/euml/common.hpp +++ b/boost/msm/front/euml/common.hpp @@ -59,6 +59,7 @@ #include <boost/msm/msm_grammar.hpp> #include <boost/msm/active_state_switching_policies.hpp> +#include <boost/msm/event_traits.hpp> #include <boost/msm/front/functor_row.hpp> namespace proto = boost::proto; @@ -183,51 +184,12 @@ struct get_event_name typedef typename T::event_name type; }; -// grammar forbidding address of for terminals -struct terminal_grammar : proto::not_<proto::address_of<proto::_> > -{}; - -// Forward-declare an expression wrapper -template<typename Expr> -struct euml_terminal; - -struct sm_domain - : proto::domain< proto::generator<euml_terminal>, terminal_grammar, boost::msm::msm_domain > -{}; - -struct state_grammar : - proto::and_< - proto::not_<proto::address_of<proto::_> >, - proto::not_<proto::shift_right<proto::_,proto::_> >, - proto::not_<proto::shift_left<proto::_,proto::_> >, - proto::not_<proto::bitwise_and<proto::_,proto::_> > - > -{}; -struct state_domain - : proto::domain< proto::generator<euml_terminal>, state_grammar,sm_domain > -{}; - -template<typename Expr> -struct euml_terminal - : proto::extends<Expr, euml_terminal<Expr>, sm_domain> -{ - typedef - proto::extends<Expr, euml_terminal<Expr>, sm_domain> - base_type; - // Needs a constructor - euml_terminal(Expr const &e = Expr()) - : base_type(e) - {} - // Unhide Proto's overloaded assignment operator - using base_type::operator=; -}; - template <class EVT> -struct euml_event: proto::extends<typename proto::terminal<event_tag>::type, EVT, sm_domain> +struct euml_event: proto::extends<typename proto::terminal<event_tag>::type, EVT, boost::msm::sm_domain> { typedef event_tag euml_tag_type; typedef EVT event_name; - using proto::extends<typename proto::terminal<event_tag>::type, EVT, sm_domain>::operator=; + using proto::extends<typename proto::terminal<event_tag>::type, EVT, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -238,11 +200,12 @@ struct euml_event: proto::extends<typename proto::terminal<event_tag>::type, EVT typedef EVT type; }; }; + template <class STATE> -struct euml_state_intern: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, state_domain> +struct euml_state_intern: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, boost::msm::state_domain> { typedef state_tag euml_tag_type; - using proto::extends<typename proto::terminal<state_tag>::type, STATE, state_domain>::operator=; + using proto::extends<typename proto::terminal<state_tag>::type, STATE, boost::msm::state_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -254,22 +217,22 @@ struct euml_state_intern: proto::extends<typename proto::terminal< boost::msm::s }; }; template <class STATE> -struct euml_state: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, state_domain> +struct euml_state: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, boost::msm::state_domain> { typedef state_tag euml_tag_type; typedef int not_intern_euml_state; - using proto::extends<typename proto::terminal<state_tag>::type, STATE, state_domain>::operator=; + using proto::extends<typename proto::terminal<state_tag>::type, STATE, boost::msm::state_domain>::operator=; struct In { typedef STATE type; }; }; template <class ACTION> -struct euml_action: proto::extends<typename proto::terminal<action_tag>::type, ACTION, sm_domain> +struct euml_action: proto::extends<typename proto::terminal<action_tag>::type, ACTION, boost::msm::sm_domain> { typedef action_tag euml_tag_type; typedef ACTION action_name; - using proto::extends<typename proto::terminal<action_tag>::type, ACTION, sm_domain>::operator=; + using proto::extends<typename proto::terminal<action_tag>::type, ACTION, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -281,10 +244,10 @@ struct euml_action: proto::extends<typename proto::terminal<action_tag>::type, A }; }; template <class FLAG> -struct euml_flag: proto::extends<typename proto::terminal<flag_tag>::type, FLAG, sm_domain> +struct euml_flag: proto::extends<typename proto::terminal<flag_tag>::type, FLAG, boost::msm::sm_domain> { typedef flag_tag euml_tag_type; - using proto::extends<typename proto::terminal<flag_tag>::type, FLAG, sm_domain>::operator=; + using proto::extends<typename proto::terminal<flag_tag>::type, FLAG, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -297,10 +260,10 @@ struct euml_flag: proto::extends<typename proto::terminal<flag_tag>::type, FLAG, }; template <class CONFIG> -struct euml_config: proto::extends<typename proto::terminal<config_tag>::type, CONFIG, sm_domain> +struct euml_config: proto::extends<typename proto::terminal<config_tag>::type, CONFIG, boost::msm::sm_domain> { typedef config_tag euml_tag_type; - using proto::extends<typename proto::terminal<config_tag>::type, CONFIG, sm_domain>::operator=; + using proto::extends<typename proto::terminal<config_tag>::type, CONFIG, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -441,7 +404,7 @@ struct GetSource_<void> : euml_action<GetSource_<void> > return src; } }; -struct GetSource_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetSource_Helper, sm_domain> +struct GetSource_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetSource_Helper, boost::msm::sm_domain> { GetSource_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -491,7 +454,7 @@ struct GetTarget_<void> : euml_action<GetTarget_<void> > return tgt; } }; -struct GetTarget_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetTarget_Helper, sm_domain> +struct GetTarget_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetTarget_Helper, boost::msm::sm_domain> { GetTarget_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -543,7 +506,7 @@ struct GetState_<void> : euml_action<GetState_<void> > return state; } }; -struct GetState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetState_Helper, sm_domain> +struct GetState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetState_Helper, boost::msm::sm_domain> { GetState_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -618,7 +581,7 @@ struct GetEvent_<void> : euml_action<GetEvent_<void> > return evt; } }; -struct GetEvent_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetEvent_Helper, sm_domain> +struct GetEvent_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetEvent_Helper, boost::msm::sm_domain> { GetEvent_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -688,12 +651,12 @@ struct GetFsm_<void> : euml_action<GetFsm_<void> > } template <class EVT,class FSM,class SourceState,class TargetState> typename transition_action_result<EVT,FSM,SourceState,TargetState>::type - operator()(EVT const& evt ,FSM& fsm,SourceState& ,TargetState&)const + operator()(EVT const& ,FSM& fsm,SourceState& ,TargetState&)const { return fsm; } }; -struct GetFsm_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetFsm_Helper, sm_domain> +struct GetFsm_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetFsm_Helper, boost::msm::sm_domain> { GetFsm_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -764,10 +727,10 @@ struct SubState_ <StateName,void> } }; -struct SubState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, sm_domain> +struct SubState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, boost::msm::sm_domain> { SubState_Helper(){} - using proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -827,7 +790,7 @@ struct GetAttribute_ : euml_action<GetAttribute_<Target, Index> > } }; -struct GetAttribute_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetAttribute_Helper, sm_domain> +struct GetAttribute_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetAttribute_Helper, boost::msm::sm_domain> { GetAttribute_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1391,10 +1354,10 @@ struct Process_ <GetEvent_<void>,void,void,void,void> }; struct process_tag {}; -struct Process_Helper: proto::extends< proto::terminal<process_tag>::type, Process_Helper, sm_domain> +struct Process_Helper: proto::extends< proto::terminal<process_tag>::type, Process_Helper, boost::msm::sm_domain> { Process_Helper(){} - using proto::extends< proto::terminal<process_tag>::type, Process_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<process_tag>::type, Process_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -1562,10 +1525,10 @@ struct Reprocess_ <Param1,Param2,Param3,void> } }; struct reprocess_tag {}; -struct Reprocess_Helper: proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, sm_domain> +struct Reprocess_Helper: proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, boost::msm::sm_domain> { Reprocess_Helper(){} - using proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -1700,10 +1663,10 @@ struct Process2_ <ToProcessEvt,Value,Param1,Param2,void> }; struct process2_tag {}; -struct Process2_Helper : proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, sm_domain> +struct Process2_Helper : proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, boost::msm::sm_domain> { Process2_Helper(){} - using proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -1781,7 +1744,7 @@ struct Get_Flag_ <Flag,Param1 } }; -struct Get_Flag_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, Get_Flag_Helper, sm_domain> +struct Get_Flag_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, Get_Flag_Helper, boost::msm::sm_domain> { Get_Flag_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1800,16 +1763,18 @@ Get_Flag_Helper const is_flag_ = Get_Flag_Helper(); struct DeferEvent_ : euml_action< DeferEvent_ > { typedef ::boost::mpl::set<action_tag> tag_type; + // mark as deferring to avoid stack overflows in certain conditions + typedef int deferring_action; template <class EVT,class FSM,class SourceState,class TargetState> void operator()(EVT const& evt,FSM& fsm,SourceState& ,TargetState& ) const { fsm.defer_event(evt); } }; -struct Defer_Helper : proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, sm_domain> +struct Defer_Helper : proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, boost::msm::sm_domain> { Defer_Helper(){} - using proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -1823,10 +1788,10 @@ struct Defer_Helper : proto::extends< proto::terminal<fsm_artefact_tag>::type, D Defer_Helper const defer_ = Defer_Helper(); struct explicit_tag {}; -struct Explicit_Helper : proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, sm_domain> +struct Explicit_Helper : proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, boost::msm::sm_domain> { Explicit_Helper(){} - using proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -1840,10 +1805,10 @@ struct Explicit_Helper : proto::extends< proto::terminal<explicit_tag>::type, Ex Explicit_Helper const explicit_ = Explicit_Helper(); struct entry_pt_tag {}; -struct Entry_Pt_Helper : proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, sm_domain> +struct Entry_Pt_Helper : proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, boost::msm::sm_domain> { Entry_Pt_Helper(){} - using proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -1857,10 +1822,10 @@ struct Entry_Pt_Helper : proto::extends< proto::terminal<entry_pt_tag>::type, En Entry_Pt_Helper const entry_pt_ = Entry_Pt_Helper(); struct exit_pt_tag {}; -struct Exit_Pt_Helper : proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, sm_domain> +struct Exit_Pt_Helper : proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, boost::msm::sm_domain> { Exit_Pt_Helper(){} - using proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -2039,7 +2004,7 @@ Exit_Pt_Helper const exit_pt_ = Exit_Pt_Helper(); ,Param4()(evt,fsm,state),Param5()(evt,fsm,state),Param6()(evt,fsm,state));} }; \ struct function_name ## tag{}; \ struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \ - functor ## Helper , sm_domain> { functor ## Helper(){} \ + functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5,class Arg6> \ struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5,Arg6> type;}; }; \ functor ## Helper const function_name = functor ## Helper (); @@ -2183,14 +2148,14 @@ Exit_Pt_Helper const exit_pt_ = Exit_Pt_Helper(); ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt),Param6()(evt,fsm,src,tgt));} \ template <class Event,class FSM,class STATE> \ typename ::boost::enable_if<typename ::boost::mpl::has_key< \ - typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ + typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \ typename state_action_result<Event,FSM,STATE>::type >::type \ operator()(Event const& evt,FSM& fsm,STATE& state )const { \ return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \ ,Param4()(evt,fsm,state),Param5()(evt,fsm,state),Param6()(evt,fsm,state));} }; \ struct function_name ## tag{}; \ struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \ - functor ## Helper , sm_domain> { functor ## Helper(){} \ + functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5,class Arg6> \ struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5,Arg6> type;}; }; \ functor ## Helper const function_name = functor ## Helper (); @@ -2320,7 +2285,7 @@ Exit_Pt_Helper const exit_pt_ = Exit_Pt_Helper(); ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \ struct function_name ## tag{}; \ struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \ - functor ## Helper , sm_domain> { functor ## Helper(){} \ + functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5> \ struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5> type;}; }; \ functor ## Helper const function_name = functor ## Helper (); @@ -2446,7 +2411,7 @@ Exit_Pt_Helper const exit_pt_ = Exit_Pt_Helper(); ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \ struct function_name ## tag{}; \ struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \ - functor ## Helper , sm_domain> { functor ## Helper(){} \ + functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5> \ struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5> type;}; }; \ functor ## Helper const function_name = functor ## Helper (); @@ -2514,6 +2479,15 @@ Exit_Pt_Helper const exit_pt_ = Exit_Pt_Helper(); instance_name ## _helper const& operator()() const {return *this;} }; \ static instance_name ## _helper instance_name; +// an event matching any event +struct kleene_ : msm::front::euml::euml_event<kleene_>, public boost::any +{ + kleene_() : boost::any(){} + template<typename ValueType> + kleene_(const ValueType & v) : boost::any(v){} +}; +static kleene_ kleene; + #define BOOST_MSM_EUML_DECLARE_EVENT(instance_name) \ struct instance_name : msm::front::euml::euml_event<instance_name >{ \ instance_name(){} \ @@ -2630,6 +2604,7 @@ Exit_Pt_Helper const exit_pt_ = Exit_Pt_Helper(); typedef BOOST_TYPEOF(build_sm<instance_name ## tag> expr) instance_name; #define BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(expr,instance_name) \ + typedef int using_declared_table; \ typedef BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) instance_name; #define BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(expr) \ @@ -2698,4 +2673,12 @@ Exit_Pt_Helper const exit_pt_ = Exit_Pt_Helper(); }}}} // boost::msm::front::euml +namespace boost { namespace msm{ + template<> + struct is_kleene_event< boost::msm::front::euml::kleene_ > + { + typedef ::boost::mpl::true_ type; + }; +}} + #endif // BOOST_MSM_FRONT_EUML_COMMON_H diff --git a/boost/msm/front/euml/container.hpp b/boost/msm/front/euml/container.hpp index 15a9750dd7..56546cff84 100644 --- a/boost/msm/front/euml/container.hpp +++ b/boost/msm/front/euml/container.hpp @@ -65,7 +65,7 @@ struct Front_ : euml_action<Front_<T> > }; struct front_tag {}; -struct Front_Helper: proto::extends< proto::terminal<front_tag>::type, Front_Helper, sm_domain> +struct Front_Helper: proto::extends< proto::terminal<front_tag>::type, Front_Helper, boost::msm::sm_domain> { Front_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -120,7 +120,7 @@ struct Back_ : euml_action<Back_<T> > }; struct back_tag {}; -struct Back_Helper: proto::extends< proto::terminal<back_tag>::type, Back_Helper, sm_domain> +struct Back_Helper: proto::extends< proto::terminal<back_tag>::type, Back_Helper, boost::msm::sm_domain> { Back_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -175,7 +175,7 @@ struct Begin_ : euml_action<Begin_<T> > }; struct begin_tag {}; -struct Begin_Helper: proto::extends< proto::terminal<begin_tag>::type, Begin_Helper, sm_domain> +struct Begin_Helper: proto::extends< proto::terminal<begin_tag>::type, Begin_Helper, boost::msm::sm_domain> { Begin_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -229,7 +229,7 @@ struct End_ : euml_action<End_<T> > } }; struct end_tag {}; -struct End_Helper: proto::extends< proto::terminal<end_tag>::type, End_Helper, sm_domain> +struct End_Helper: proto::extends< proto::terminal<end_tag>::type, End_Helper, boost::msm::sm_domain> { End_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -284,7 +284,7 @@ struct RBegin_ : euml_action<RBegin_<T> > }; struct rbegin_tag {}; -struct RBegin_Helper: proto::extends< proto::terminal<rbegin_tag>::type, RBegin_Helper, sm_domain> +struct RBegin_Helper: proto::extends< proto::terminal<rbegin_tag>::type, RBegin_Helper, boost::msm::sm_domain> { RBegin_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -338,7 +338,7 @@ struct REnd_ : euml_action<REnd_<T> > } }; struct rend_tag {}; -struct REnd_Helper: proto::extends< proto::terminal<rend_tag>::type, REnd_Helper, sm_domain> +struct REnd_Helper: proto::extends< proto::terminal<rend_tag>::type, REnd_Helper, boost::msm::sm_domain> { REnd_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -380,7 +380,7 @@ struct Push_Back_ : euml_action<Push_Back_<Container,Element> > } }; struct push_back_tag {}; -struct Push_Back_Helper: proto::extends< proto::terminal<push_back_tag>::type, Push_Back_Helper, sm_domain> +struct Push_Back_Helper: proto::extends< proto::terminal<push_back_tag>::type, Push_Back_Helper, boost::msm::sm_domain> { Push_Back_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -422,7 +422,7 @@ struct Pop_Back_ : euml_action<Pop_Back_<Container> > } }; struct pop_back_tag {}; -struct Pop_Back_Helper: proto::extends< proto::terminal<pop_back_tag>::type, Pop_Back_Helper, sm_domain> +struct Pop_Back_Helper: proto::extends< proto::terminal<pop_back_tag>::type, Pop_Back_Helper, boost::msm::sm_domain> { Pop_Back_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -464,7 +464,7 @@ struct Push_Front_ : euml_action<Push_Front_<Container,Element> > } }; struct push_front_tag {}; -struct Push_Front_Helper: proto::extends< proto::terminal<push_front_tag>::type, Push_Front_Helper, sm_domain> +struct Push_Front_Helper: proto::extends< proto::terminal<push_front_tag>::type, Push_Front_Helper, boost::msm::sm_domain> { Push_Front_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -506,7 +506,7 @@ struct Pop_Front_ : euml_action<Pop_Front_<Container> > } }; struct pop_front_tag {}; -struct Pop_Front_Helper: proto::extends< proto::terminal<pop_front_tag>::type, Pop_Front_Helper, sm_domain> +struct Pop_Front_Helper: proto::extends< proto::terminal<pop_front_tag>::type, Pop_Front_Helper, boost::msm::sm_domain> { Pop_Front_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -548,7 +548,7 @@ struct Clear_ : euml_action<Clear_<Container> > } }; struct clear_tag {}; -struct Clear_Helper: proto::extends< proto::terminal<clear_tag>::type, Clear_Helper, sm_domain> +struct Clear_Helper: proto::extends< proto::terminal<clear_tag>::type, Clear_Helper, boost::msm::sm_domain> { Clear_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -590,7 +590,7 @@ struct ListReverse_ : euml_action<ListReverse_<Container> > } }; struct list_reverse_tag {}; -struct ListReverse_Helper: proto::extends< proto::terminal<list_reverse_tag>::type, ListReverse_Helper, sm_domain> +struct ListReverse_Helper: proto::extends< proto::terminal<list_reverse_tag>::type, ListReverse_Helper, boost::msm::sm_domain> { ListReverse_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -660,7 +660,7 @@ struct ListUnique_<Container,Predicate, } }; struct list_unique_tag {}; -struct ListUnique_Helper: proto::extends< proto::terminal<list_unique_tag>::type, ListUnique_Helper, sm_domain> +struct ListUnique_Helper: proto::extends< proto::terminal<list_unique_tag>::type, ListUnique_Helper, boost::msm::sm_domain> { ListUnique_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -730,7 +730,7 @@ struct ListSort_<Container,Predicate, } }; struct list_sort_tag {}; -struct ListSort_Helper: proto::extends< proto::terminal<list_sort_tag>::type, ListSort_Helper, sm_domain> +struct ListSort_Helper: proto::extends< proto::terminal<list_sort_tag>::type, ListSort_Helper, boost::msm::sm_domain> { ListSort_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -784,7 +784,7 @@ struct Capacity_ : euml_action<Capacity_<Container> > } }; struct capacity_tag {}; -struct Capacity_Helper: proto::extends< proto::terminal<capacity_tag>::type, Capacity_Helper, sm_domain> +struct Capacity_Helper: proto::extends< proto::terminal<capacity_tag>::type, Capacity_Helper, boost::msm::sm_domain> { Capacity_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -838,7 +838,7 @@ struct Size_ : euml_action<Size_<Container> > } }; struct size_tag {}; -struct Size_Helper: proto::extends< proto::terminal<size_tag>::type, Size_Helper, sm_domain> +struct Size_Helper: proto::extends< proto::terminal<size_tag>::type, Size_Helper, boost::msm::sm_domain> { Size_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -892,7 +892,7 @@ struct Max_Size_ : euml_action<Max_Size_<Container> > } }; struct max_size_tag {}; -struct Max_Size_Helper: proto::extends< proto::terminal<max_size_tag>::type, Max_Size_Helper, sm_domain> +struct Max_Size_Helper: proto::extends< proto::terminal<max_size_tag>::type, Max_Size_Helper, boost::msm::sm_domain> { Max_Size_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -934,7 +934,7 @@ struct Reserve_ : euml_action<Reserve_<Container,Value> > } }; struct reserve_tag {}; -struct Reserve_Helper: proto::extends< proto::terminal<reserve_tag>::type, Reserve_Helper, sm_domain> +struct Reserve_Helper: proto::extends< proto::terminal<reserve_tag>::type, Reserve_Helper, boost::msm::sm_domain> { Reserve_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1003,7 +1003,7 @@ struct Resize_<Container,Num,Value,typename ::boost::disable_if<typename ::boost } }; struct resize_tag {}; -struct Resize_Helper: proto::extends< proto::terminal<resize_tag>::type, Resize_Helper, sm_domain> +struct Resize_Helper: proto::extends< proto::terminal<resize_tag>::type, Resize_Helper, boost::msm::sm_domain> { Resize_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1186,7 +1186,7 @@ struct Insert_ < Container,Param1,void,void> } }; struct insert_tag {}; -struct Insert_Helper: proto::extends< proto::terminal<insert_tag>::type, Insert_Helper, sm_domain> +struct Insert_Helper: proto::extends< proto::terminal<insert_tag>::type, Insert_Helper, boost::msm::sm_domain> { Insert_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1228,7 +1228,7 @@ struct Swap_ : euml_action<Swap_<Container1,Container2> > } }; struct swap_tag {}; -struct Swap_Helper: proto::extends< proto::terminal<swap_tag>::type, Swap_Helper, sm_domain> +struct Swap_Helper: proto::extends< proto::terminal<swap_tag>::type, Swap_Helper, boost::msm::sm_domain> { Swap_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1314,7 +1314,7 @@ struct Erase_<Container,Iterator1,Iterator2, } }; struct erase_tag {}; -struct Erase_Helper: proto::extends< proto::terminal<erase_tag>::type, Erase_Helper, sm_domain> +struct Erase_Helper: proto::extends< proto::terminal<erase_tag>::type, Erase_Helper, boost::msm::sm_domain> { Erase_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1356,7 +1356,7 @@ struct Empty_ : euml_action<Empty_<Container> > } }; struct empty_tag {}; -struct Empty_Helper: proto::extends< proto::terminal<empty_tag>::type, Empty_Helper, sm_domain> +struct Empty_Helper: proto::extends< proto::terminal<empty_tag>::type, Empty_Helper, boost::msm::sm_domain> { Empty_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1398,7 +1398,7 @@ struct ListRemove_ : euml_action<ListRemove_<Container,Element> > } }; struct list_remove_tag {}; -struct ListRemove_Helper: proto::extends< proto::terminal<list_remove_tag>::type, ListRemove_Helper, sm_domain> +struct ListRemove_Helper: proto::extends< proto::terminal<list_remove_tag>::type, ListRemove_Helper, boost::msm::sm_domain> { ListRemove_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1440,7 +1440,7 @@ struct ListRemove_If_ : euml_action<ListRemove_If_<Container,Element> > } }; struct list_remove_if_tag {}; -struct ListRemove_If_Helper: proto::extends< proto::terminal<list_remove_if_tag>::type, ListRemove_If_Helper, sm_domain> +struct ListRemove_If_Helper: proto::extends< proto::terminal<list_remove_if_tag>::type, ListRemove_If_Helper, boost::msm::sm_domain> { ListRemove_If_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1510,7 +1510,7 @@ struct ListMerge_<Container,ToMerge,Predicate, } }; struct list_merge_tag {}; -struct ListMerge_Helper: proto::extends< proto::terminal<list_merge_tag>::type, ListMerge_Helper, sm_domain> +struct ListMerge_Helper: proto::extends< proto::terminal<list_merge_tag>::type, ListMerge_Helper, boost::msm::sm_domain> { ListMerge_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1623,7 +1623,7 @@ struct Splice_<Container,Param1,Param2,Param3,Param4, } }; struct splice_tag {}; -struct Splice_Helper: proto::extends< proto::terminal<splice_tag>::type, Splice_Helper, sm_domain> +struct Splice_Helper: proto::extends< proto::terminal<splice_tag>::type, Splice_Helper, boost::msm::sm_domain> { Splice_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1741,7 +1741,7 @@ struct StringFind_ <Container,Param1,Param2,void> }; struct string_find_tag {}; -struct StringFind_Helper: proto::extends< proto::terminal<string_find_tag>::type, StringFind_Helper, sm_domain> +struct StringFind_Helper: proto::extends< proto::terminal<string_find_tag>::type, StringFind_Helper, boost::msm::sm_domain> { StringFind_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1881,7 +1881,7 @@ struct StringRFind_< }; struct string_rfind_tag {}; -struct StringRFind_Helper: proto::extends< proto::terminal<string_rfind_tag>::type, StringRFind_Helper, sm_domain> +struct StringRFind_Helper: proto::extends< proto::terminal<string_rfind_tag>::type, StringRFind_Helper, boost::msm::sm_domain> { StringRFind_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -1994,7 +1994,7 @@ struct StringFindFirstOf_ <Container,Param1,Param2,void> struct string_find_first_of_tag {}; struct StringFindFirstOf_Helper: - proto::extends< proto::terminal<string_find_first_of_tag>::type, StringFindFirstOf_Helper, sm_domain> + proto::extends< proto::terminal<string_find_first_of_tag>::type, StringFindFirstOf_Helper, boost::msm::sm_domain> { StringFindFirstOf_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2135,7 +2135,7 @@ struct StringFindFirstNotOf_< struct string_find_first_not_of_tag {}; struct StringFindFirstNotOf_Helper: - proto::extends< proto::terminal<string_find_first_not_of_tag>::type, StringFindFirstNotOf_Helper, sm_domain> + proto::extends< proto::terminal<string_find_first_not_of_tag>::type, StringFindFirstNotOf_Helper, boost::msm::sm_domain> { StringFindFirstNotOf_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2276,7 +2276,7 @@ struct StringFindLastOf_< struct string_find_last_of_tag {}; struct StringFindLastOf_Helper: - proto::extends< proto::terminal<string_find_last_of_tag>::type, StringFindLastOf_Helper, sm_domain> + proto::extends< proto::terminal<string_find_last_of_tag>::type, StringFindLastOf_Helper, boost::msm::sm_domain> { StringFindLastOf_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2417,7 +2417,7 @@ struct StringFindLastNotOf_< struct string_find_last_not_of_tag {}; struct StringFindLastNotOf_Helper: - proto::extends< proto::terminal<string_find_last_of_tag>::type, StringFindLastNotOf_Helper, sm_domain> + proto::extends< proto::terminal<string_find_last_of_tag>::type, StringFindLastNotOf_Helper, boost::msm::sm_domain> { StringFindLastNotOf_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2594,7 +2594,7 @@ struct Associative_Erase_ < Container,Param1,void> }; struct associative_erase_tag {}; -struct Associative_Erase_Helper: proto::extends< proto::terminal<associative_erase_tag>::type, Associative_Erase_Helper, sm_domain> +struct Associative_Erase_Helper: proto::extends< proto::terminal<associative_erase_tag>::type, Associative_Erase_Helper, boost::msm::sm_domain> { Associative_Erase_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2650,7 +2650,7 @@ struct Associative_Find_ : euml_action<Associative_Find_<T,Param> > }; struct associative_find_tag {}; -struct Associative_Find_Helper: proto::extends< proto::terminal<associative_find_tag>::type, Associative_Find_Helper, sm_domain> +struct Associative_Find_Helper: proto::extends< proto::terminal<associative_find_tag>::type, Associative_Find_Helper, boost::msm::sm_domain> { Associative_Find_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2704,7 +2704,7 @@ struct AssociativeCount_ : euml_action<AssociativeCount_<Container,Param> > } }; struct associative_count_tag {}; -struct AssociativeCount_Helper: proto::extends< proto::terminal<associative_count_tag>::type, AssociativeCount_Helper, sm_domain> +struct AssociativeCount_Helper: proto::extends< proto::terminal<associative_count_tag>::type, AssociativeCount_Helper, boost::msm::sm_domain> { AssociativeCount_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2760,7 +2760,7 @@ struct Associative_Lower_Bound_ : euml_action<Associative_Lower_Bound_<T,Param> struct associative_lower_bound_tag {}; struct Associative_Lower_Bound_Helper: proto::extends< proto::terminal<associative_lower_bound_tag>::type, - Associative_Lower_Bound_Helper, sm_domain> + Associative_Lower_Bound_Helper, boost::msm::sm_domain> { Associative_Lower_Bound_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2816,7 +2816,7 @@ struct Associative_Upper_Bound_ : euml_action<Associative_Upper_Bound_<T,Param> struct associative_upper_bound_tag {}; struct Associative_Upper_Bound_Helper: proto::extends< proto::terminal<associative_upper_bound_tag>::type, - Associative_Upper_Bound_Helper, sm_domain> + Associative_Upper_Bound_Helper, boost::msm::sm_domain> { Associative_Upper_Bound_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2871,7 +2871,7 @@ struct First_ : euml_action<First_<T> > }; struct first_tag {}; -struct First_Helper: proto::extends< proto::terminal<first_tag>::type, First_Helper, sm_domain> +struct First_Helper: proto::extends< proto::terminal<first_tag>::type, First_Helper, boost::msm::sm_domain> { First_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2926,7 +2926,7 @@ struct Second_ : euml_action<Second_<T> > }; struct second_tag {}; -struct Second_Helper: proto::extends< proto::terminal<second_tag>::type, Second_Helper, sm_domain> +struct Second_Helper: proto::extends< proto::terminal<second_tag>::type, Second_Helper, boost::msm::sm_domain> { Second_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -2990,7 +2990,7 @@ struct Associative_Equal_Range_ : euml_action<Associative_Equal_Range_<T,Param> struct associative_equal_range_tag {}; struct Associative_Equal_Range_Helper: proto::extends< proto::terminal<associative_equal_range_tag>::type, - Associative_Equal_Range_Helper, sm_domain> + Associative_Equal_Range_Helper, boost::msm::sm_domain> { Associative_Equal_Range_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -3102,7 +3102,7 @@ struct Substr_ < Container,Param1,void> } }; struct substr_tag {}; -struct Substr_Helper: proto::extends< proto::terminal<substr_tag>::type, Substr_Helper, sm_domain> +struct Substr_Helper: proto::extends< proto::terminal<substr_tag>::type, Substr_Helper, boost::msm::sm_domain> { Substr_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -3264,7 +3264,7 @@ struct StringCompare_<Container,Param1,Param2,Param3,void> }; struct string_compare_tag {}; -struct StringCompare_Helper: proto::extends< proto::terminal<string_compare_tag>::type, StringCompare_Helper, sm_domain> +struct StringCompare_Helper: proto::extends< proto::terminal<string_compare_tag>::type, StringCompare_Helper, boost::msm::sm_domain> { StringCompare_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -3388,7 +3388,7 @@ struct Append_<Container,Param1,Param2,void> }; struct append_tag {}; -struct Append_Helper: proto::extends< proto::terminal<append_tag>::type, Append_Helper, sm_domain> +struct Append_Helper: proto::extends< proto::terminal<append_tag>::type, Append_Helper, boost::msm::sm_domain> { Append_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -3513,7 +3513,7 @@ struct StringInsert_<Container,Param1,Param2,Param3,void> }; struct string_insert_tag {}; -struct StringInsert_Helper: proto::extends< proto::terminal<string_insert_tag>::type, StringInsert_Helper, sm_domain> +struct StringInsert_Helper: proto::extends< proto::terminal<string_insert_tag>::type, StringInsert_Helper, boost::msm::sm_domain> { StringInsert_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -3620,7 +3620,7 @@ struct StringErase_ <Container,Param1,void> }; struct string_erase_tag {}; -struct StringErase_Helper: proto::extends< proto::terminal<string_erase_tag>::type, StringErase_Helper, sm_domain> +struct StringErase_Helper: proto::extends< proto::terminal<string_erase_tag>::type, StringErase_Helper, boost::msm::sm_domain> { StringErase_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -3744,7 +3744,7 @@ struct StringAssign_<Container,Param1,Param2,void> } }; struct assign_tag {}; -struct StringAssign_Helper: proto::extends< proto::terminal<assign_tag>::type, StringAssign_Helper, sm_domain> +struct StringAssign_Helper: proto::extends< proto::terminal<assign_tag>::type, StringAssign_Helper, boost::msm::sm_domain> { StringAssign_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -3835,7 +3835,7 @@ struct StringReplace_<Container,Param1,Param2,Param3,void> }; struct string_replace_tag {}; -struct StringReplace_Helper: proto::extends< proto::terminal<string_replace_tag>::type, StringReplace_Helper, sm_domain> +struct StringReplace_Helper: proto::extends< proto::terminal<string_replace_tag>::type, StringReplace_Helper, boost::msm::sm_domain> { StringReplace_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -3891,7 +3891,7 @@ struct CStr_ : euml_action<CStr_<Container> > } }; struct c_str_tag {}; -struct CStr_Helper: proto::extends< proto::terminal<c_str_tag>::type, CStr_Helper, sm_domain> +struct CStr_Helper: proto::extends< proto::terminal<c_str_tag>::type, CStr_Helper, boost::msm::sm_domain> { CStr_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -3947,7 +3947,7 @@ struct StringData_ : euml_action<StringData_<Container> > } }; struct string_data_tag {}; -struct StringData_Helper: proto::extends< proto::terminal<string_data_tag>::type, StringData_Helper, sm_domain> +struct StringData_Helper: proto::extends< proto::terminal<string_data_tag>::type, StringData_Helper, boost::msm::sm_domain> { StringData_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -4048,7 +4048,7 @@ struct StringCopy_< }; struct string_copy_tag {}; -struct StringCopy_Helper: proto::extends< proto::terminal<string_copy_tag>::type, StringCopy_Helper, sm_domain> +struct StringCopy_Helper: proto::extends< proto::terminal<string_copy_tag>::type, StringCopy_Helper, boost::msm::sm_domain> { StringCopy_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 diff --git a/boost/msm/front/euml/operator.hpp b/boost/msm/front/euml/operator.hpp index c5ec5d0e88..d976df7a6c 100644 --- a/boost/msm/front/euml/operator.hpp +++ b/boost/msm/front/euml/operator.hpp @@ -157,10 +157,10 @@ struct If_Else_<Condition,Action1,Action2 struct if_tag { }; -struct If : proto::extends<proto::terminal<if_tag>::type, If, sm_domain> +struct If : proto::extends<proto::terminal<if_tag>::type, If, boost::msm::sm_domain> { If(){} - using proto::extends< proto::terminal<if_tag>::type, If, sm_domain>::operator=; + using proto::extends< proto::terminal<if_tag>::type, If, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -256,10 +256,10 @@ struct If_Then_<Condition,Action1 struct if_then_tag { }; -struct If_Then : proto::extends< proto::terminal<if_then_tag>::type, If_Then, sm_domain> +struct If_Then : proto::extends< proto::terminal<if_then_tag>::type, If_Then, boost::msm::sm_domain> { If_Then(){} - using proto::extends< proto::terminal<if_then_tag>::type, If_Then, sm_domain>::operator=; + using proto::extends< proto::terminal<if_then_tag>::type, If_Then, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -312,10 +312,10 @@ struct While_Do_ : euml_action<While_Do_<Condition,Body> > struct while_do_tag { }; -struct While_Do_Helper : proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, sm_domain> +struct While_Do_Helper : proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, boost::msm::sm_domain> { While_Do_Helper(){} - using proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -368,10 +368,10 @@ struct Do_While_ : euml_action<Do_While_<Condition,Body> > struct do_while_tag { }; -struct Do_While_Helper : proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, sm_domain> +struct Do_While_Helper : proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, boost::msm::sm_domain> { Do_While_Helper(){} - using proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 @@ -426,10 +426,10 @@ struct For_Loop_ : euml_action<For_Loop_<Begin,End,EndLoop,Body> > struct for_loop_tag { }; -struct For_Loop_Helper : proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, sm_domain> +struct For_Loop_Helper : proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, boost::msm::sm_domain> { For_Loop_Helper(){} - using proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, sm_domain>::operator=; + using proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, boost::msm::sm_domain>::operator=; template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 #ifdef BOOST_MSVC ,class Arg6 diff --git a/boost/msm/front/euml/state_grammar.hpp b/boost/msm/front/euml/state_grammar.hpp index 17baa03912..a9bea10fec 100644 --- a/boost/msm/front/euml/state_grammar.hpp +++ b/boost/msm/front/euml/state_grammar.hpp @@ -59,6 +59,7 @@ struct func_state : public ::boost::msm::front::detail::state_base<BASE,Attribu typedef StateNameTag state_name_tag; // flags typedef Flags flag_list; + typedef ::boost::mpl::vector0<> internal_flag_list; // deferred events typedef Defer deferred_events; @@ -99,6 +100,7 @@ struct entry_func_state : public ::boost::msm::front::detail::state_base<BASE,A // flags typedef Flags flag_list; + typedef ::boost::mpl::vector0<> internal_flag_list; // deferred events typedef Defer deferred_events; @@ -135,6 +137,7 @@ struct explicit_entry_func_state : public ::boost::msm::front::detail::state_ba typedef StateNameTag state_name_tag; // flags typedef Flags flag_list; + typedef ::boost::mpl::vector0<> internal_flag_list; // deferred events typedef Defer deferred_events; @@ -175,6 +178,7 @@ struct exit_func_state : public ::boost::msm::front::detail::state_base<BASE,A // flags typedef Flags flag_list; + typedef ::boost::mpl::vector0<> internal_flag_list; // deferred events typedef Defer deferred_events; @@ -562,13 +566,13 @@ struct BuildActions {}; // attributes building -#define BOOST_MSM_EUML_DECLARE_ATTRIBUTE(attr_type,attr_name) \ -struct attr_name ## _ \ - : proto::extends< proto::terminal<msm::front::action_tag>::type, attr_name ## _, sm_domain> \ - {typedef attr_name ## _ action_name; \ - typedef ::boost::fusion::pair<attr_name ## _,attr_type> attribute_type; \ - attr_name ## _ (){} \ - }; \ +#define BOOST_MSM_EUML_DECLARE_ATTRIBUTE(attr_type,attr_name) \ +struct attr_name ## _ \ + : proto::extends< proto::terminal< ::boost::msm::front::action_tag>::type, attr_name ## _, boost::msm::sm_domain> \ + {typedef attr_name ## _ action_name; \ + typedef ::boost::fusion::pair<attr_name ## _,attr_type> attribute_type; \ + attr_name ## _ (){} \ + }; \ attr_name ## _ const attr_name = attr_name ## _(); struct make_attributes_tag @@ -597,7 +601,7 @@ struct attribute BOOST_PROTO_BASIC_EXTENDS( proto::terminal<make_attributes_tag>::type , attribute - , sm_domain + , boost::msm::sm_domain ) typedef ::boost::fusion::pair<int,int> attribute_type; }; @@ -668,7 +672,7 @@ struct configure BOOST_PROTO_BASIC_EXTENDS( proto::terminal<make_configure_tag>::type , configure - , sm_domain + , boost::msm::sm_domain ) }; @@ -700,7 +704,7 @@ struct define_init BOOST_PROTO_BASIC_EXTENDS( proto::terminal<state_tag>::type , define_init - , sm_domain + , boost::msm::sm_domain ) }; @@ -867,6 +871,7 @@ struct func_state_machine : public ::boost::msm::front::detail::state_base<BASE // flags typedef StateNameTag state_name_tag; typedef Flags flag_list; + typedef ::boost::mpl::vector0<> internal_flag_list; // deferred events typedef Defer deferred_events; // customization (message queue, exceptions) diff --git a/boost/msm/front/euml/transformation.hpp b/boost/msm/front/euml/transformation.hpp index 8ea7c5edc8..2fb4bc01c8 100644 --- a/boost/msm/front/euml/transformation.hpp +++ b/boost/msm/front/euml/transformation.hpp @@ -107,7 +107,7 @@ struct BackInserter_ : euml_action<BackInserter_<T> > }; struct back_inserter_tag {}; -struct BackInserter_Helper: proto::extends< proto::terminal<back_inserter_tag>::type, BackInserter_Helper, sm_domain> +struct BackInserter_Helper: proto::extends< proto::terminal<back_inserter_tag>::type, BackInserter_Helper, boost::msm::sm_domain> { BackInserter_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -162,7 +162,7 @@ struct FrontInserter_ : euml_action<FrontInserter_<T> > }; struct front_inserter_tag {}; -struct FrontInserter_Helper: proto::extends< proto::terminal<front_inserter_tag>::type, FrontInserter_Helper, sm_domain> +struct FrontInserter_Helper: proto::extends< proto::terminal<front_inserter_tag>::type, FrontInserter_Helper, boost::msm::sm_domain> { FrontInserter_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -217,7 +217,7 @@ struct Inserter_ : euml_action<Inserter_<T,Pos> > }; struct inserter_tag {}; -struct Inserter_Helper: proto::extends< proto::terminal<inserter_tag>::type, Inserter_Helper, sm_domain> +struct Inserter_Helper: proto::extends< proto::terminal<inserter_tag>::type, Inserter_Helper, boost::msm::sm_domain> { Inserter_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 @@ -315,7 +315,7 @@ struct Transform_<Param1,Param2,Param3,Param4,Param5, } }; struct transform_tag {}; -struct Transform_Helper: proto::extends< proto::terminal<transform_tag>::type, Transform_Helper, sm_domain> +struct Transform_Helper: proto::extends< proto::terminal<transform_tag>::type, Transform_Helper, boost::msm::sm_domain> { Transform_Helper(){} template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5 diff --git a/boost/msm/front/functor_row.hpp b/boost/msm/front/functor_row.hpp index 0600881dfa..e542451f4f 100644 --- a/boost/msm/front/functor_row.hpp +++ b/boost/msm/front/functor_row.hpp @@ -14,6 +14,7 @@ #include <boost/mpl/set.hpp> #include <boost/mpl/for_each.hpp> #include <boost/mpl/has_xxx.hpp> +#include <boost/mpl/count_if.hpp> #include <boost/typeof/typeof.hpp> @@ -25,7 +26,8 @@ #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() BOOST_MPL_HAS_XXX_TRAIT_DEF(deferring_action) - +BOOST_MPL_HAS_XXX_TRAIT_DEF(some_deferring_actions) + namespace boost { namespace msm { namespace front { template <class Func,class Enable=void> @@ -42,7 +44,17 @@ namespace boost { namespace msm { namespace front { static const ::boost::msm::back::HandledEnum value = ::boost::msm::back::HANDLED_DEFERRED; }; - + // for sequences + template <class Func> + struct get_functor_return_value<Func, + typename ::boost::enable_if< + typename has_some_deferring_actions<Func>::type + >::type + > + { + static const ::boost::msm::back::HandledEnum value = + (Func::some_deferring_actions::value ? ::boost::msm::back::HANDLED_DEFERRED : ::boost::msm::back::HANDLED_TRUE ); + }; template <class SOURCE,class EVENT,class TARGET,class ACTION=none,class GUARD=none> struct Row { @@ -265,6 +277,12 @@ namespace boost { namespace msm { namespace front struct ActionSequence_ { typedef Sequence sequence; + // if one functor of the sequence defers events, the complete sequence does + typedef ::boost::mpl::bool_< + ::boost::mpl::count_if<sequence, + has_deferring_action< ::boost::mpl::placeholders::_1 > + >::value != 0> some_deferring_actions; + template <class Event,class FSM,class STATE > struct state_action_result { diff --git a/boost/msm/front/state_machine_def.hpp b/boost/msm/front/state_machine_def.hpp index ca72dd09ff..f890a983a3 100644 --- a/boost/msm/front/state_machine_def.hpp +++ b/boost/msm/front/state_machine_def.hpp @@ -31,6 +31,7 @@ struct state_machine_def : public boost::msm::front::detail::state_base<BaseSta // tags // default: no flag typedef ::boost::mpl::vector0<> flag_list; + typedef ::boost::mpl::vector0<> internal_flag_list; //default: no deferred events typedef ::boost::mpl::vector0<> deferred_events; // customization (message queue, exceptions) @@ -197,7 +198,7 @@ struct state_machine_def : public boost::msm::front::detail::state_base<BaseSta protected: // Default no-transition handler. Can be replaced in the Derived SM class. template <class FSM,class Event> - void no_transition(Event const& ,FSM&, int state) + void no_transition(Event const& ,FSM&, int ) { BOOST_ASSERT(false); } diff --git a/boost/msm/front/states.hpp b/boost/msm/front/states.hpp index 9d192c458f..a909f63f7b 100644 --- a/boost/msm/front/states.hpp +++ b/boost/msm/front/states.hpp @@ -49,6 +49,7 @@ struct state : public boost::msm::front::detail::state_base<BASE>, SMPtrPolicy // tags // default: no flag typedef ::boost::mpl::vector0<> flag_list; + typedef ::boost::mpl::vector0<> internal_flag_list; //default: no deferred events typedef ::boost::mpl::vector0<> deferred_events; }; @@ -59,7 +60,8 @@ template<class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr> struct terminate_state : public boost::msm::front::detail::state_base<BASE>, SMPtrPolicy { // tags - typedef ::boost::mpl::vector<boost::msm::TerminateFlag> flag_list; + typedef ::boost::mpl::vector0<> flag_list; + typedef ::boost::mpl::vector< boost::msm::TerminateFlag> internal_flag_list; //default: no deferred events typedef ::boost::mpl::vector0<> deferred_events; }; @@ -71,9 +73,10 @@ template <class EndInterruptEvent,class BASE = default_base_state,class SMPtrPol struct interrupt_state : public boost::msm::front::detail::state_base<BASE>, SMPtrPolicy { // tags + typedef ::boost::mpl::vector0<> flag_list; typedef ::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> > - flag_list; + internal_flag_list; //default: no deferred events typedef ::boost::mpl::vector0<> deferred_events; }; @@ -101,6 +104,7 @@ struct entry_pseudo_state typedef int explicit_entry_state; // default: no flag typedef ::boost::mpl::vector0<> flag_list; + typedef ::boost::mpl::vector0<> internal_flag_list; //default: no deferred events typedef ::boost::mpl::vector0<> deferred_events; }; @@ -117,7 +121,8 @@ struct exit_pseudo_state : public boost::msm::front::detail::state_base<BASE> , typedef int pseudo_exit; // default: no flag - typedef ::boost::mpl::vector< > flag_list; + typedef ::boost::mpl::vector0<> flag_list; + typedef ::boost::mpl::vector0<> internal_flag_list; //default: no deferred events typedef ::boost::mpl::vector0<> deferred_events; }; diff --git a/boost/msm/msm_grammar.hpp b/boost/msm/msm_grammar.hpp index 27f885468d..8f95e98684 100644 --- a/boost/msm/msm_grammar.hpp +++ b/boost/msm/msm_grammar.hpp @@ -11,6 +11,7 @@ #ifndef BOOST_MSM_GRAMMAR_H #define BOOST_MSM_GRAMMAR_H +#include <boost/proto/core.hpp> #include <boost/msm/common.hpp> @@ -41,6 +42,45 @@ struct msm_terminal {} }; +// grammar forbidding address of for terminals +struct terminal_grammar : proto::not_<proto::address_of<proto::_> > +{}; + +// Forward-declare an expression wrapper +template<typename Expr> +struct euml_terminal; + +struct sm_domain + : proto::domain< proto::generator<euml_terminal>, terminal_grammar, boost::msm::msm_domain > +{}; + +struct state_grammar : + proto::and_< + proto::not_<proto::address_of<proto::_> >, + proto::not_<proto::shift_right<proto::_,proto::_> >, + proto::not_<proto::shift_left<proto::_,proto::_> >, + proto::not_<proto::bitwise_and<proto::_,proto::_> > + > +{}; +struct state_domain + : proto::domain< proto::generator<euml_terminal>, boost::msm::state_grammar,boost::msm::sm_domain > +{}; + +template<typename Expr> +struct euml_terminal + : proto::extends<Expr, euml_terminal<Expr>, boost::msm::sm_domain> +{ + typedef + proto::extends<Expr, euml_terminal<Expr>, boost::msm::sm_domain> + base_type; + // Needs a constructor + euml_terminal(Expr const &e = Expr()) + : base_type(e) + {} + // Unhide Proto's overloaded assignment operator + using base_type::operator=; +}; + } } // boost::msm #endif //BOOST_MSM_GRAMMAR_H |