summaryrefslogtreecommitdiff
path: root/boost/msm
diff options
context:
space:
mode:
Diffstat (limited to 'boost/msm')
-rw-r--r--boost/msm/back/dispatch_table.hpp67
-rw-r--r--boost/msm/back/favor_compile_time.hpp2
-rw-r--r--boost/msm/back/metafunctions.hpp13
-rw-r--r--boost/msm/back/state_machine.hpp186
-rw-r--r--boost/msm/common.hpp2
-rw-r--r--boost/msm/event_traits.hpp36
-rw-r--r--boost/msm/front/euml/common.hpp143
-rw-r--r--boost/msm/front/euml/container.hpp102
-rw-r--r--boost/msm/front/euml/operator.hpp20
-rw-r--r--boost/msm/front/euml/state_grammar.hpp25
-rw-r--r--boost/msm/front/euml/transformation.hpp8
-rw-r--r--boost/msm/front/functor_row.hpp22
-rw-r--r--boost/msm/front/state_machine_def.hpp3
-rw-r--r--boost/msm/front/states.hpp11
-rw-r--r--boost/msm/msm_grammar.hpp40
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