|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r58461 - in sandbox/msm/boost/msm: . back front front/euml
From: christophe.j.henry_at_[hidden]
Date: 2009-12-18 17:28:00
Author: chenry
Date: 2009-12-18 17:27:59 EST (Fri, 18 Dec 2009)
New Revision: 58461
URL: http://svn.boost.org/trac/boost/changeset/58461
Log:
after review: started implementation of review issues:
- some SFINAE replaced by tag dispatching
- dispatch speed gain
- copy speed gain
- minor eUML cleanup
Added:
sandbox/msm/boost/msm/common.hpp (contents, props changed)
Text files modified:
sandbox/msm/boost/msm/back/common_types.hpp | 5
sandbox/msm/boost/msm/back/dispatch_table.hpp | 46 ++--
sandbox/msm/boost/msm/back/state_machine.hpp | 406 ++++++++++++++++++++++++++-------------
sandbox/msm/boost/msm/back/tools.hpp | 6
sandbox/msm/boost/msm/front/euml/common.hpp | 2
sandbox/msm/boost/msm/front/euml/operator.hpp | 1
sandbox/msm/boost/msm/front/euml/state_grammar.hpp | 45 ++++
sandbox/msm/boost/msm/front/functor_row.hpp | 10
8 files changed, 349 insertions(+), 172 deletions(-)
Modified: sandbox/msm/boost/msm/back/common_types.hpp
==============================================================================
--- sandbox/msm/boost/msm/back/common_types.hpp (original)
+++ sandbox/msm/boost/msm/back/common_types.hpp 2009-12-18 17:27:59 EST (Fri, 18 Dec 2009)
@@ -12,6 +12,7 @@
#define BOOST_MSM_COMMON_TYPES_H
#include <boost/tuple/tuple.hpp>
+#include <boost/msm/common.hpp>
namespace boost { namespace msm { namespace back
{
@@ -28,10 +29,6 @@
typedef HandledEnum execute_return;
-// wrapper for mpl::for_each as showed in the C++ Template Metaprogramming ch. 9
-template <class T>
-struct wrap{};
-
}}}
#endif //BOOST_MSM_COMMON_TYPES_H
Modified: sandbox/msm/boost/msm/back/dispatch_table.hpp
==============================================================================
--- sandbox/msm/boost/msm/back/dispatch_table.hpp (original)
+++ sandbox/msm/boost/msm/back/dispatch_table.hpp 2009-12-18 17:27:59 EST (Fri, 18 Dec 2009)
@@ -33,7 +33,7 @@
{
private:
// This is a table of these function pointers.
- typedef std::pair<int,HandledEnum> (*cell)(Fsm&, int,Event const&);
+ typedef HandledEnum (*cell)(Fsm&, int,int,Event const&);
typedef bool (*guard)(Fsm&, Event const&);
// class used to build a chain (or sequence) of transitions for a given event and start state
@@ -49,42 +49,44 @@
{
template <class Sequence>
static
- typename ::boost::enable_if<typename ::boost::mpl::empty<Sequence>::type,std::pair<int,HandledEnum> >::type
- execute(Fsm& , int state, Event const& ,
- ::boost::msm::back::dummy<0> = 0)
+ HandledEnum
+ execute(Fsm& , int, int, Event const& , ::boost::mpl::true_ const & )
{
// if at least one guard rejected, this will be ignored, otherwise will generate an error
- return std::make_pair(state,HANDLED_FALSE);
+ return HANDLED_FALSE;
}
template <class Sequence>
static
- typename ::boost::disable_if<typename ::boost::mpl::empty<Sequence>::type,std::pair<int,HandledEnum> >::type
- execute(Fsm& fsm, int state, Event const& evt,
- ::boost::msm::back::dummy<1> = 0)
+ HandledEnum
+ execute(Fsm& fsm, int region_index , int state, Event const& evt,
+ ::boost::mpl::false_ const & )
{
// try the first guard
typedef typename ::boost::mpl::front<Sequence>::type first_row;
- std::pair<int,HandledEnum> res = first_row::execute(fsm,state,evt);
- if (HANDLED_TRUE!=res.second)
+ HandledEnum res = first_row::execute(fsm,region_index,state,evt);
+ if (HANDLED_TRUE!=res)
{
// if the first rejected, move on to the next one
- std::pair<int,HandledEnum> sub_res =
- execute<typename ::boost::mpl::pop_front<Sequence>::type>(fsm,state,evt);
+ HandledEnum sub_res =
+ execute<typename ::boost::mpl::pop_front<Sequence>::type>(fsm,region_index,state,evt,
+ ::boost::mpl::bool_<
+ ::boost::mpl::empty<typename ::boost::mpl::pop_front<Sequence>::type>::type::value>());
// if at least one guards rejects, the event will not generate a call to no_transition
- HandledEnum handled = ((HANDLED_GUARD_REJECT==sub_res.second) ||
- (HANDLED_GUARD_REJECT==res.second))?
- HANDLED_GUARD_REJECT:sub_res.second;
- return std::make_pair(sub_res.first,handled);
+ HandledEnum handled = ((HANDLED_GUARD_REJECT==sub_res) ||
+ (HANDLED_GUARD_REJECT==res))?
+ HANDLED_GUARD_REJECT:sub_res;
+ return handled;
}
return res;
}
};
// Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(Fsm& fsm, int state, Event const& evt)
+ static HandledEnum execute(Fsm& fsm, int region_index, int state, Event const& evt)
{
// forward to helper
- return execute_helper::template execute<Seq>(fsm,state,evt);
+ return execute_helper::template execute<Seq>(fsm,region_index,state,evt,
+ ::boost::mpl::bool_< ::boost::mpl::empty<Seq>::type::value>());
}
};
// nullary metafunction whose only job is to prevent early evaluation of _1
@@ -138,7 +140,7 @@
{}
template <class State>
typename ::boost::enable_if<typename has_state_delayed_event<State,Event>::type,void>::type
- operator()(boost::msm::back::wrap<State> const&,boost::msm::back::dummy<0> = 0)
+ 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));
@@ -147,7 +149,7 @@
}
template <class State>
typename ::boost::disable_if<typename has_state_delayed_event<State,Event>::type,void >::type
- operator()(boost::msm::back::wrap<State> const&,boost::msm::back::dummy<0> = 0)
+ 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));
@@ -172,7 +174,7 @@
// this event is an automatic one (not a real one, just one for use in event-less transitions)
// Note this event cannot be used as deferred!
template <class State>
- void operator()(boost::msm::back::wrap<State> const&)
+ void operator()(boost::msm::wrap<State> const&)
{
typedef typename create_stt<Fsm>::type stt;
BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,State>::value));
@@ -190,7 +192,7 @@
{
// Initialize cells for no transition
::boost::mpl::for_each<typename generate_state_set<Stt>::type,
- boost::msm::back::wrap< ::boost::mpl::placeholders::_1> >
+ boost::msm::wrap< ::boost::mpl::placeholders::_1> >
(default_init_cell<Event>(this,entries));
// build chaining rows for rows coming from the same state and the current event
Modified: sandbox/msm/boost/msm/back/state_machine.hpp
==============================================================================
--- sandbox/msm/boost/msm/back/state_machine.hpp (original)
+++ sandbox/msm/boost/msm/back/state_machine.hpp 2009-12-18 17:27:59 EST (Fri, 18 Dec 2009)
@@ -166,6 +166,20 @@
visitors m_state_visitors;
};
+ template <class StateType,class Enable=void>
+ struct deferred_msg_queue_helper
+ {
+ };
+ template <class StateType>
+ struct deferred_msg_queue_helper<StateType,
+ typename ::boost::enable_if<
+ typename ::boost::msm::back::has_fsm_delayed_events<StateType>::type >::type>
+ {
+ public:
+ deferred_msg_queue_helper():m_deferred_events_queue(){}
+ deferred_events_queue_t m_deferred_events_queue;
+ };
+
public:
// tags
typedef int composite_tag;
@@ -302,7 +316,7 @@
return false;
}
// Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(library_sm& fsm, int state, Event const& evt)
+ static HandledEnum execute(library_sm& fsm, int region_index, int state, Event const& evt)
{
BOOST_STATIC_CONSTANT(int, current_state = (get_state_id<stt,current_state_type>::type::value));
@@ -312,12 +326,12 @@
if (!::boost::is_same<T1,current_state_type>::value &&
!is_exit_state_active<T1,get_owner<T1,library_sm> >(fsm))
{
- return std::make_pair(current_state,HANDLED_FALSE);
+ return HANDLED_FALSE;
}
if (!check_guard(fsm,evt))
{
// guard rejected the event, we stay in the current one
- return std::make_pair(current_state,HANDLED_GUARD_REJECT);
+ return HANDLED_GUARD_REJECT;
}
// the guard condition has already been checked
@@ -332,7 +346,8 @@
// and finally the entry method of the new current state
convert_event_and_execute_entry<next_state_type,T2>
(::boost::fusion::at_key<next_state_type>(fsm.m_substate_list),evt,fsm);
- return std::make_pair(next_state,HANDLED_TRUE);
+ fsm.m_states[region_index]=next_state;
+ return HANDLED_TRUE;
}
};
@@ -376,7 +391,7 @@
return false;
}
// Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(library_sm& fsm, int state, Event const& evt)
+ static HandledEnum execute(library_sm& fsm, int region_index, int state, Event const& evt)
{
BOOST_STATIC_CONSTANT(int, current_state = (get_state_id<stt,current_state_type>::type::value));
BOOST_STATIC_CONSTANT(int, next_state = (get_state_id<stt,next_state_type>::type::value));
@@ -385,12 +400,12 @@
if (!::boost::is_same<T1,current_state_type>::value &&
!is_exit_state_active<T1,get_owner<T1,library_sm> >(fsm))
{
- return std::make_pair(current_state,HANDLED_FALSE);
+ return HANDLED_FALSE;
}
if (!check_guard(fsm,evt))
{
// guard rejected the event, we stay in the current one
- return std::make_pair(current_state,HANDLED_GUARD_REJECT);
+ return HANDLED_GUARD_REJECT;
}
// the guard condition has already been checked
execute_exit<current_state_type>
@@ -400,7 +415,8 @@
convert_event_and_execute_entry<next_state_type,T2>
(::boost::fusion::at_key<next_state_type>(fsm.m_substate_list),evt,fsm);
- return std::make_pair(next_state,HANDLED_TRUE);
+ fsm.m_states[region_index]=next_state;
+ return HANDLED_TRUE;
}
};
@@ -435,7 +451,7 @@
>::type next_state_type;
// Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(library_sm& fsm, int state, Event const& evt)
+ static HandledEnum execute(library_sm& fsm, int region_index, int state, Event const& evt)
{
BOOST_STATIC_CONSTANT(int, current_state = (get_state_id<stt,current_state_type>::type::value));
BOOST_STATIC_CONSTANT(int, next_state = (get_state_id<stt,next_state_type>::type::value));
@@ -445,7 +461,7 @@
if (!::boost::is_same<T1,current_state_type>::value &&
!is_exit_state_active<T1,get_owner<T1,library_sm> >(fsm))
{
- return std::make_pair(current_state,HANDLED_FALSE);
+ return HANDLED_FALSE;
}
// no need to check the guard condition
// first call the exit method of the current state
@@ -461,7 +477,8 @@
convert_event_and_execute_entry<next_state_type,T2>
(::boost::fusion::at_key<next_state_type>(fsm.m_substate_list),evt,fsm);
- return std::make_pair(next_state,HANDLED_TRUE);
+ fsm.m_states[region_index]=next_state;
+ return HANDLED_TRUE;
}
};
@@ -496,7 +513,7 @@
>::type next_state_type;
// Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(library_sm& fsm, int state, Event const& evt)
+ static HandledEnum execute(library_sm& fsm, int region_index, int state, Event const& evt)
{
BOOST_STATIC_CONSTANT(int, current_state = (get_state_id<stt,current_state_type>::type::value));
BOOST_STATIC_CONSTANT(int, next_state = (get_state_id<stt,next_state_type>::type::value));
@@ -506,7 +523,7 @@
if (!::boost::is_same<T1,current_state_type>::value &&
!is_exit_state_active<T1,get_owner<T1,library_sm> >(fsm))
{
- return std::make_pair(current_state,HANDLED_FALSE);
+ return HANDLED_FALSE;
}
// first call the exit method of the current state
execute_exit<current_state_type>
@@ -516,7 +533,8 @@
convert_event_and_execute_entry<next_state_type,T2>
(::boost::fusion::at_key<next_state_type>(fsm.m_substate_list),evt,fsm);
- return std::make_pair(next_state,HANDLED_TRUE);
+ fsm.m_states[region_index]=next_state;
+ return HANDLED_TRUE;
}
};
@@ -532,11 +550,12 @@
typedef Evt Event;
// Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(library_sm& fsm, int state, Event const& evt)
+ static HandledEnum execute(library_sm& fsm, int region_index, int , Event const& evt)
{
execute_return res =
- (::boost::fusion::at_key<current_state_type>(fsm.m_substate_list)).process_event(evt);
- return std::make_pair(get_state_id<stt,T1>::type::value,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;
}
};
template <class Composite,class Event>
@@ -634,7 +653,7 @@
{
// call on_entry on this SM
(static_cast<Derived*>(this))->on_entry(InitEvent(),*this);
- ::boost::mpl::for_each<initial_states, boost::msm::back::wrap<mpl::placeholders::_1> >
+ ::boost::mpl::for_each<initial_states, boost::msm::wrap<mpl::placeholders::_1> >
(call_init<InitEvent>(InitEvent(),this));
// give a chance to handle an anonymous (eventless) transition
handle_eventless_transitions_helper<library_sm> eventless_helper(this,true);
@@ -652,10 +671,12 @@
HandledEnum ret_handled=HANDLED_FALSE;
// if the state machine has terminate or interrupt flags, check them, otherwise skip
- if (is_event_handling_blocked_helper<library_sm,Event>())
+ 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<library_sm,Event>(evt))
+ 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;
@@ -668,7 +689,8 @@
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<library_sm,Event>(evt);
+ HandledEnum handled = this->do_process_helper<Event>
+ (evt,::boost::mpl::bool_<is_no_exception_thrown<library_sm>::type::value>());
if (handled)
{
ret_handled = HANDLED_TRUE;
@@ -678,7 +700,7 @@
// 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<library_sm>();
+ do_post_msg_queue_helper(::boost::mpl::bool_<is_no_message_queue<library_sm>::type::value>());
// event can be handled, processing
// handle with lowest priority event-less transitions
@@ -702,7 +724,7 @@
result_state(res),searched_id(id),self(self_) {}
template <class StateType>
- void operator()(boost::msm::back::wrap<StateType> const&)
+ void operator()(boost::msm::wrap<StateType> const&)
{
// look for the state id until found
BOOST_STATIC_CONSTANT(int, id = (get_state_id<stt,StateType>::value));
@@ -722,7 +744,7 @@
{
const BaseState* result_state=0;
::boost::mpl::for_each<state_list,
- ::boost::msm::back::wrap< ::boost::mpl::placeholders::_1> > (get_state_id_helper(id,&result_state,this));
+ ::boost::msm::wrap< ::boost::mpl::placeholders::_1> > (get_state_id_helper(id,&result_state,this));
return result_state;
}
// true if the sm is used in another sm
@@ -800,7 +822,7 @@
// History initializer function object, used with mpl::for_each
template <class State>
- void operator()(::boost::msm::back::wrap<State> const&)
+ void operator()(::boost::msm::wrap<State> const&)
{
m_initial_states[++m_index]=get_state_id<stt,State>::type::value;
}
@@ -824,7 +846,7 @@
,m_substate_list()
{
// initialize our list of states with the ones defined in Derived::initial_state
- ::boost::mpl::for_each< seq_initial_states, ::boost::msm::back::wrap<mpl::placeholders::_1> >
+ ::boost::mpl::for_each< seq_initial_states, ::boost::msm::wrap<mpl::placeholders::_1> >
(init_states(m_states));
m_history.set_initial_states(m_states);
// create states
@@ -849,7 +871,7 @@
,m_visitors() \
,m_substate_list() \
{ \
- ::boost::mpl::for_each< seq_initial_states, ::boost::msm::back::wrap<mpl::placeholders::_1> > \
+ ::boost::mpl::for_each< seq_initial_states, ::boost::msm::wrap<mpl::placeholders::_1> > \
(init_states(m_states)); \
m_history.set_initial_states(m_states); \
fill_states(this); \
@@ -873,7 +895,7 @@
,m_visitors() \
,m_substate_list() \
{ \
- ::boost::mpl::for_each< seq_initial_states, ::boost::msm::back::wrap<mpl::placeholders::_1> > \
+ ::boost::mpl::for_each< seq_initial_states, ::boost::msm::wrap<mpl::placeholders::_1> > \
(init_states(m_states)); \
m_history.set_initial_states(m_states); \
fill_states(this); \
@@ -915,9 +937,8 @@
// the following 2 functions handle the terminate/interrupt states handling
// if one of these states is found, the first one is used
- template <class StateType,class Event>
- typename ::boost::enable_if<typename has_fsm_blocking_states<StateType>::type,bool >::type
- is_event_handling_blocked_helper( ::boost::msm::back::dummy<0> = 0)
+ template <class Event>
+ bool is_event_handling_blocked_helper( ::boost::mpl::true_ const &)
{
// if the state machine is terminated, do not handle any event
if (is_flag_active< ::boost::msm::TerminateFlag>())
@@ -930,24 +951,21 @@
return false;
}
// otherwise simple handling, no flag => continue
- template <class StateType,class Event>
- typename ::boost::disable_if<typename has_fsm_blocking_states<StateType>::type,bool >::type
- is_event_handling_blocked_helper( ::boost::msm::back::dummy<1> = 0)
+ template <class Event>
+ bool is_event_handling_blocked_helper( ::boost::mpl::false_ const &)
{
// no terminate/interrupt states detected
return false;
}
// the following functions handle pre/post-process handling of a message queue
template <class StateType,class EventType>
- typename ::boost::enable_if<typename is_no_message_queue<StateType>::type,bool >::type
- do_pre_msg_queue_helper(EventType const& evt, ::boost::msm::back::dummy<0> = 0)
+ bool do_pre_msg_queue_helper(EventType const& evt, ::boost::mpl::true_ const &)
{
// no message queue needed
return true;
}
template <class StateType,class EventType>
- typename ::boost::disable_if<typename is_no_message_queue<StateType>::type,bool >::type
- do_pre_msg_queue_helper(EventType const& evt, ::boost::msm::back::dummy<1> = 0)
+ bool do_pre_msg_queue_helper(EventType const& evt, ::boost::mpl::false_ const &)
{
execute_return (library_sm::*pf) (EventType const& evt) =
&library_sm::process_event;
@@ -956,36 +974,30 @@
{
// event has to be put into the queue
transition_fct f = ::boost::bind(pf,this,evt);
- m_events_queue.push(f);
+ m_events_queue.m_events_queue.push(f);
return false;
}
// event can be handled, processing
m_event_processing = true;
return true;
}
- template <class StateType>
- typename ::boost::enable_if<typename is_no_message_queue<StateType>::type,void >::type
- do_post_msg_queue_helper( ::boost::msm::back::dummy<0> = 0)
+ void do_post_msg_queue_helper( ::boost::mpl::true_ const &)
{
// no message queue needed
}
- template <class StateType>
- typename ::boost::disable_if<typename is_no_message_queue<StateType>::type,void >::type
- do_post_msg_queue_helper( ::boost::msm::back::dummy<1> = 0)
+ void do_post_msg_queue_helper( ::boost::mpl::false_ const &)
{
m_event_processing = false;
- process_message_queue();
+ process_message_queue(this);
}
// the following 2 functions handle the processing either with a try/catch protection or without
template <class StateType,class EventType>
- typename ::boost::enable_if<typename is_no_exception_thrown<StateType>::type,HandledEnum >::type
- do_process_helper(EventType const& evt, ::boost::msm::back::dummy<0> = 0)
+ HandledEnum do_process_helper(EventType const& evt, ::boost::mpl::true_ const &)
{
return this->do_process_event(evt);
}
template <class StateType,class EventType>
- typename ::boost::disable_if<typename is_no_exception_thrown<StateType>::type,HandledEnum >::type
- do_process_helper(EventType const& evt, ::boost::msm::back::dummy<1> = 0)
+ HandledEnum do_process_helper(EventType const& evt, ::boost::mpl::false_ const &)
{
try
{
@@ -1003,7 +1015,7 @@
template <class StateType, class Enable = void>
struct handle_defer_helper
{
- handle_defer_helper(deferred_events_queue_t& ){}
+ handle_defer_helper(deferred_msg_queue_helper<library_sm>& ){}
void do_pre_handle_deferred()
{
}
@@ -1017,13 +1029,14 @@
struct handle_defer_helper
<StateType, typename enable_if< typename ::boost::msm::back::has_fsm_delayed_events<StateType>::type >::type>
{
- handle_defer_helper(deferred_events_queue_t& a_queue):events_queue(a_queue),next_deferred_event(){}
+ handle_defer_helper(deferred_msg_queue_helper<library_sm>& a_queue):
+ events_queue(a_queue),next_deferred_event(){}
void do_pre_handle_deferred()
{
- if (!events_queue.empty())
+ if (!events_queue.m_deferred_events_queue.empty())
{
- next_deferred_event = events_queue.back();
- events_queue.pop_back();
+ next_deferred_event = events_queue.m_deferred_events_queue.back();
+ events_queue.m_deferred_events_queue.pop_back();
}
}
@@ -1032,7 +1045,7 @@
if (((handled & HANDLED_DEFERRED) == HANDLED_DEFERRED) && next_deferred_event )
{
// the event was already deferred, no reason to process another deferred event
- events_queue.push_back(next_deferred_event);
+ events_queue.m_deferred_events_queue.push_back(next_deferred_event);
return;
}
else if (next_deferred_event)
@@ -1042,8 +1055,8 @@
}
private:
- deferred_events_queue_t& events_queue;
- deferred_fct next_deferred_event;
+ deferred_msg_queue_helper<library_sm>& events_queue;
+ deferred_fct next_deferred_event;
};
// handling of eventless transitions
@@ -1078,6 +1091,69 @@
bool handled;
};
+ template <class StateType,class Enable=void>
+ struct region_processing_helper
+ {
+ public:
+ region_processing_helper(library_sm* self_,HandledEnum& result_)
+ :self(self_),result(result_){}
+ template<class Event>
+ void process(Event const& evt)
+ {
+ // use this table as if it came directly from the user
+ typedef dispatch_table<library_sm,complete_table,Event> table;
+ HandledEnum res =
+ table::instance.entries[self->m_states[0]](
+ *self, 0, self->m_states[0], evt);
+ result = (HandledEnum)((int)result | (int)res);
+ }
+ library_sm* self;
+ HandledEnum& result;
+ };
+ // version with visitors
+ template <class StateType>
+ struct region_processing_helper<StateType,typename ::boost::enable_if<
+ ::boost::mpl::is_sequence<typename StateType::initial_state> >::type>
+ {
+ private:
+ // process event in one region
+ template <class region_id,int Dummy=0>
+ struct In
+ {
+ template<class Event>
+ static void process(Event const& evt,library_sm* self_,HandledEnum& result_)
+ {
+ // use this table as if it came directly from the user
+ typedef dispatch_table<library_sm,complete_table,Event> table;
+ HandledEnum res =
+ table::instance.entries[self_->m_states[region_id::value]](
+ *self_, region_id::value , self_->m_states[region_id::value], evt);
+ result_ = (HandledEnum)((int)result_ | (int)res);
+ In< ::boost::mpl::int_<region_id::value+1> >::template process(evt,self_,result_);
+ }
+ };
+ template <int Dummy>
+ struct In< ::boost::mpl::int_<nr_regions::value>,Dummy>
+ {
+ // end of processing
+ template<class Event>
+ static void process(Event const& evt,library_sm*,HandledEnum&){}
+ };
+ public:
+ region_processing_helper(library_sm* self_,HandledEnum& result_)
+ :self(self_),result(result_){}
+ template<class Event>
+ void process(Event const& evt)
+ {
+ // use this table as if it came directly from the user
+ typedef dispatch_table<library_sm,complete_table,Event> table;
+ In< ::boost::mpl::int_<0> >::template process(evt,self,result);
+ }
+
+ library_sm* self;
+ HandledEnum& result;
+ };
+
// minimum event processing without exceptions, queues, etc.
template<class Event>
HandledEnum do_process_event(Event const& evt)
@@ -1087,14 +1163,9 @@
HandledEnum handled = HANDLED_FALSE;
// dispatch the event to every region
- for (int i=0; i<nr_regions::value;++i)
- {
- std::pair<int,HandledEnum> res =
- table::instance.entries[this->m_states[i]](
- *this, this->m_states[i], evt);
- this->m_states[i] = res.first;
- handled = (HandledEnum)((int)handled | (int)res.second);
- }
+ region_processing_helper<Derived> helper(this,handled);
+ helper.process(evt);
+
// 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
@@ -1144,7 +1215,7 @@
call_init(Event const& an_event,library_sm* self_):
evt(an_event),self(self_){}
template <class State>
- void operator()(boost::msm::back::wrap<State> const&)
+ void operator()(boost::msm::wrap<State> const&)
{
execute_entry(::boost::fusion::at_key<State>(self->m_substate_list),evt,*self);
}
@@ -1195,25 +1266,13 @@
private:
// helper function, helps hiding the forward function for non-state machines states.
template <class T>
- typename ::boost::enable_if<
- typename ::boost::mpl::and_<
- typename is_composite_state<T>::type,
- typename ::boost::mpl::not_<
- typename has_non_forwarding_flag<Flag>::type>::type >::type
- ,void >::type
- helper (flag_handler* an_entry,int offset,boost::msm::back::dummy<0> = 0 )
+ void helper (flag_handler* an_entry,int offset, ::boost::mpl::true_ const & )
{
// composite => forward
an_entry[offset] = &FlagHandler<T,Flag>::forward;
}
template <class T>
- typename ::boost::disable_if<
- typename ::boost::mpl::and_<
- typename is_composite_state<T>::type,
- typename ::boost::mpl::not_<
- typename has_non_forwarding_flag<Flag>::type>::type >::type
- ,void >::type
- helper (flag_handler* an_entry,int offset,boost::msm::back::dummy<1> = 0 )
+ void helper (flag_handler* an_entry,int offset, ::boost::mpl::false_ const & )
{
// default no flag
an_entry[offset] = &FlagHandler<T,Flag>::flag_false;
@@ -1228,7 +1287,7 @@
// Flags initializer function object, used with mpl::for_each
template <class StateType>
- void operator()( ::boost::msm::back::wrap<StateType> const& )
+ void operator()( ::boost::msm::wrap<StateType> const& )
{
typedef typename StateType::flag_list flags;
typedef typename ::boost::mpl::contains<flags,Flag >::type found;
@@ -1243,7 +1302,12 @@
else
{
// false or forward
- helper<StateType>(entries,state_id);
+ typedef typename ::boost::mpl::and_<
+ typename is_composite_state<StateType>::type,
+ typename ::boost::mpl::not_<
+ typename has_non_forwarding_flag<Flag>::type>::type >::type composite_no_forward;
+
+ helper<StateType>(entries,state_id,::boost::mpl::bool_<composite_no_forward::type::value>());
}
}
};
@@ -1255,7 +1319,7 @@
static flag_handler flags_entries[max_state];
// build a state list
- ::boost::mpl::for_each<state_list, boost::msm::back::wrap< ::boost::mpl::placeholders::_1> >
+ ::boost::mpl::for_each<state_list, boost::msm::wrap< ::boost::mpl::placeholders::_1> >
(init_flags<Flag>(flags_entries));
return flags_entries;
}
@@ -1369,20 +1433,19 @@
this->new_state_helper<State>(),
create_state_helper<State>::set_sm(self);
// create a visitor callback
- visitor_helper<State>(state_id,::boost::fusion::at_key<State>(self->m_substate_list));
+ visitor_helper(state_id,::boost::fusion::at_key<State>(self->m_substate_list),
+ ::boost::mpl::bool_<has_accept_sig<State>::type::value>());
}
private:
// support possible use of a visitor if accept_sig is defined
template <class StateType>
- typename ::boost::enable_if<typename has_accept_sig<StateType>::type,void >::type
- visitor_helper(int id,StateType& astate,::boost::msm::back::dummy<0> = 0) const
+ void visitor_helper(int id,StateType& astate, ::boost::mpl::true_ const & ) const
{
visitor_args<StateType,StateType::accept_sig::args_number>::
template helper<StateType>(self,id,astate);
}
template <class StateType>
- typename ::boost::disable_if<typename has_accept_sig<StateType>::type,void >::type
- visitor_helper(int ,StateType& ,::boost::msm::back::dummy<1> = 0) const
+ void visitor_helper(int ,StateType& , ::boost::mpl::false_ const &) const
{
// nothing to do
}
@@ -1397,7 +1460,7 @@
copy_helper(library_sm* sm):
m_sm(sm){}
template <class StateType>
- void operator()( ::boost::msm::back::wrap<StateType> const& )
+ void operator()( ::boost::msm::wrap<StateType> const& )
{
BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,StateType>::type::value));
// possibly also set the visitor
@@ -1422,16 +1485,28 @@
library_sm* m_sm;
};
-
+ // helper to copy the active states attribute
+ template <class region_id,int Dummy=0>
+ struct region_copy_helper
+ {
+ static void do_copy(library_sm* self_,library_sm const& rhs)
+ {
+ self_->m_states[region_id::value] = rhs.m_states[region_id::value];
+ region_copy_helper< ::boost::mpl::int_<region_id::value+1> >::do_copy(self_,rhs);
+ }
+ };
+ template <int Dummy>
+ struct region_copy_helper< ::boost::mpl::int_<nr_regions::value>,Dummy>
+ {
+ // end of processing
+ static void do_copy(library_sm*,library_sm const& ){}
+ };
// copy functions for deep copy (no need of a 2nd version for NoCopy as noncopyable handles it)
void do_copy (library_sm const& rhs,
::boost::msm::back::dummy<0> = 0)
{
// deep copy simply assigns the data
- for (int i=0; i<nr_regions::value;++i)
- {
- m_states[i] = rhs.m_states[i];
- }
+ region_copy_helper< ::boost::mpl::int_<0> >::do_copy(this,rhs);
m_events_queue = rhs.m_events_queue;
m_deferred_events_queue = rhs.m_deferred_events_queue;
m_history = rhs.m_history;
@@ -1440,7 +1515,7 @@
m_substate_list = rhs.m_substate_list;
// except for the states themselves, which get duplicated
- ::boost::mpl::for_each<state_list, ::boost::msm::back::wrap< ::boost::mpl::placeholders::_1> >
+ ::boost::mpl::for_each<state_list, ::boost::msm::wrap< ::boost::mpl::placeholders::_1> >
(copy_helper(this));
}
@@ -1475,7 +1550,7 @@
}
// iterates through all states to find the one to be activated
template <class State>
- void operator()( ::boost::msm::back::wrap<State> const&)
+ void operator()( ::boost::msm::wrap<State> const&)
{
entry_exit_helper<Event,is_entry>::template helper< ::boost::mpl::bool_<is_entry>,State >();
}
@@ -1484,16 +1559,31 @@
Event const& evt;
library_sm* self;
};
- // start for states machines which are themselves embedded in other state machines (composites)
- template <class Event>
- void start(Event const& incomingEvent)
+
+ // helper to start the fsm
+ template <class region_id,int Dummy=0>
+ struct region_start_helper
{
- for (int i=0; i<nr_regions::value;++i)
+ template<class Event>
+ static void do_start(library_sm* self_,Event const& incomingEvent)
{
//forward the event for handling by sub state machines
- ::boost::mpl::for_each<state_list, ::boost::msm::back::wrap< ::boost::mpl::placeholders::_1> >
- (entry_exit_helper<Event,true>(m_states[i],incomingEvent,this));
+ ::boost::mpl::for_each<state_list, ::boost::msm::wrap< ::boost::mpl::placeholders::_1> >
+ (entry_exit_helper<Event,true>(self_->m_states[region_id::value],incomingEvent,self_));
}
+ };
+ template <int Dummy>
+ struct region_start_helper< ::boost::mpl::int_<nr_regions::value>,Dummy>
+ {
+ // end of processing
+ template<class Event>
+ static void do_start(library_sm*,Event const& ){}
+ };
+ // start for states machines which are themselves embedded in other state machines (composites)
+ template <class Event>
+ void start(Event const& incomingEvent)
+ {
+ region_start_helper< ::boost::mpl::int_<0> >::template do_start(this,incomingEvent);
}
// helper used to set the correct state as active state upon entry into a fsm
@@ -1546,7 +1636,7 @@
{
(static_cast<Derived*>(self))->on_entry(evt,*self);
::boost::mpl::for_each<typename EventType::active_state,
- ::boost::msm::back::wrap< ::boost::mpl::placeholders::_1> >
+ ::boost::msm::wrap< ::boost::mpl::placeholders::_1> >
(fork_helper<EventType>(self,evt));
// set the correct zones, the others (if any) will be default/history initialized
self->start(evt.m_event);
@@ -1578,7 +1668,7 @@
fork_helper(library_sm* self_,EventType const& evt_):
helper_self(self_),helper_evt(evt_){}
template <class StateType>
- void operator()( ::boost::msm::back::wrap<StateType> const& )
+ void operator()( ::boost::msm::wrap<StateType> const& )
{
int state_id = get_state_id<stt,StateType>::value;
BOOST_STATIC_ASSERT(StateType::zone_index >= 0);
@@ -1591,33 +1681,52 @@
};
};
+ // helper for entry
+ template <class region_id,int Dummy=0>
+ struct region_entry_exit_helper
+ {
+ template<class Event>
+ static void do_entry(library_sm* self_,Event const& incomingEvent)
+ {
+ self_->m_states[region_id::value] =
+ self_->m_history.history_entry(incomingEvent)[region_id::value];
+ }
+ template<class Event>
+ static void do_exit(library_sm* self_,Event const& incomingEvent)
+ {
+ ::boost::mpl::for_each<state_list, ::boost::msm::wrap< ::boost::mpl::placeholders::_1> >
+ (entry_exit_helper<Event,false>(self_->m_states[region_id::value],incomingEvent,self_));
+ }
+ };
+ template <int Dummy>
+ struct region_entry_exit_helper< ::boost::mpl::int_<nr_regions::value>,Dummy>
+ {
+ // end of processing
+ template<class Event>
+ static void do_entry(library_sm*,Event const& ){}
+ template<class Event>
+ static void do_exit(library_sm*,Event const& ){}
+ };
// entry/exit for states machines which are themselves embedded in other state machines (composites)
template <class Event>
void do_entry(Event const& incomingEvent)
{
// by default we activate the history/init states, can be overwritten by direct_event_start_helper
- for (int i=0; i<nr_regions::value;++i)
- {
- this->m_states[i] = m_history.history_entry(incomingEvent)[i];
- }
+ region_entry_exit_helper< ::boost::mpl::int_<0> >::template do_entry(this,incomingEvent);
// block immediate handling of events
m_event_processing = true;
// if the event is generating a direct entry/fork, set the current state(s) to the direct state(s)
direct_event_start_helper(this)(incomingEvent);
// handle messages which were generated and blocked in the init calls
m_event_processing = false;
- process_message_queue();
+ process_message_queue(this);
}
template <class Event>
void do_exit(Event const& incomingEvent)
{
- for (int i=0; i<nr_regions::value;++i)
- {
- // first recursively exit the sub machines
- // forward the event for handling by sub state machines
- ::boost::mpl::for_each<state_list, ::boost::msm::back::wrap< ::boost::mpl::placeholders::_1> >
- (entry_exit_helper<Event,false>(m_states[i],incomingEvent,this));
- }
+ // first recursively exit the sub machines
+ // forward the event for handling by sub state machines
+ region_entry_exit_helper< ::boost::mpl::int_<0> >::template do_exit(this,incomingEvent);
// then call our own exit
(static_cast<Derived*>(this))->on_exit(incomingEvent,*this);
// give the history a chance to handle this (or not).
@@ -1626,45 +1735,52 @@
// no transition for event.
template <class Event>
- static std::pair<int,HandledEnum> call_no_transition(library_sm& , int state, Event const& )
+ static HandledEnum call_no_transition(library_sm& , int , int , Event const& )
{
- return std::make_pair(state,HANDLED_FALSE);
+ return HANDLED_FALSE;
}
// called for deferred events. Address set in the dispatch_table at init
template <class Event>
- static std::pair<int,HandledEnum> defer_transition(library_sm& fsm, int state, Event const& e)
+ static HandledEnum defer_transition(library_sm& fsm, int , int , Event const& e)
{
execute_return (library_sm::*pf) (Event const& evt)= &library_sm::process_event;
Event temp (e);
::boost::function<execute_return () > f= ::boost::bind(pf, ::boost::ref(fsm),temp);
fsm.post_deferred_event(f);
- return std::make_pair(state,HANDLED_DEFERRED);
+ return HANDLED_DEFERRED;
}
// called for automatic events. Default address set in the dispatch_table at init
// prevents no-transition detection for automatic events
template <class Event>
- static std::pair<int,HandledEnum> default_eventless_transition(library_sm& fsm, int state, Event const& e)
+ static HandledEnum default_eventless_transition(library_sm& fsm, int, int , Event const& e)
{
- return std::make_pair(state,HANDLED_FALSE);
+ return HANDLED_FALSE;
}
// puts a deferred event in the queue
void post_deferred_event(deferred_fct& deferred)
{
- m_deferred_events_queue.push_front(deferred);
+ m_deferred_events_queue.m_deferred_events_queue.push_front(deferred);
}
// removes one event from the message queue and processes it
- void process_message_queue()
+ template <class StateType>
+ typename ::boost::disable_if<typename is_no_message_queue<StateType>::type,void >::type
+ process_message_queue(StateType*)
{
- if (!m_events_queue.empty())
+ if (!m_events_queue.m_events_queue.empty())
{
- transition_fct to_call = m_events_queue.front();
- m_events_queue.pop();
+ transition_fct to_call = m_events_queue.m_events_queue.front();
+ m_events_queue.m_events_queue.pop();
to_call();
}
}
-
+ template <class StateType>
+ typename ::boost::enable_if<typename is_no_message_queue<StateType>::type,void >::type
+ process_message_queue(StateType*)
+ {
+ // nothing to process
+ }
// calls the entry/exit or on_entry/on_exit depending on the state type
// (avoids calling virtually)
// variant for FSMs
@@ -1753,20 +1869,32 @@
private:
+ template <class StateType,class Enable=void>
+ struct msg_queue_helper
+ {
+ public:
+ msg_queue_helper():m_events_queue(){}
+ events_queue_t m_events_queue;
+ };
+ template <class StateType>
+ struct msg_queue_helper<StateType,
+ typename ::boost::enable_if<typename is_no_message_queue<StateType>::type >::type>
+ {
+ };
+
template <class Fsm,class Stt, class Event>
friend struct dispatch_table;
// data members
- int m_states[nr_regions::value];
- events_queue_t m_events_queue;
- deferred_events_queue_t m_deferred_events_queue;
- concrete_history m_history;
- bool m_event_processing;
- bool m_is_included;
- visitor_fct_helper<BaseState>
- m_visitors;
-
- substate_list m_substate_list;
+ int m_states[nr_regions::value];
+ msg_queue_helper<library_sm> m_events_queue;
+ deferred_msg_queue_helper
+ <library_sm> m_deferred_events_queue;
+ concrete_history m_history;
+ bool m_event_processing;
+ bool m_is_included;
+ visitor_fct_helper<BaseState> m_visitors;
+ substate_list m_substate_list;
};
Modified: sandbox/msm/boost/msm/back/tools.hpp
==============================================================================
--- sandbox/msm/boost/msm/back/tools.hpp (original)
+++ sandbox/msm/boost/msm/back/tools.hpp 2009-12-18 17:27:59 EST (Fri, 18 Dec 2009)
@@ -28,7 +28,7 @@
{
fill_state_names(char const** names):m_names(names){}
template <class StateType>
- void operator()(boost::msm::back::wrap<StateType> const&)
+ void operator()(boost::msm::wrap<StateType> const&)
{
m_names[get_state_id<stt,StateType>::value]= typeid(StateType).name();
}
@@ -42,7 +42,7 @@
{
get_state_name(std::string& name_to_fill, int state_id):m_name(name_to_fill),m_state_id(state_id){}
template <class StateType>
- void operator()(boost::msm::back::wrap<StateType> const&)
+ void operator()(boost::msm::wrap<StateType> const&)
{
if (get_state_id<stt,StateType>::value == m_state_id)
{
@@ -58,7 +58,7 @@
struct display_type
{
template <class Type>
- void operator()(boost::msm::back::wrap<Type> const&)
+ void operator()(boost::msm::wrap<Type> const&)
{
std::cout << typeid(Type).name() << std::endl;
}
Added: sandbox/msm/boost/msm/common.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/common.hpp 2009-12-18 17:27:59 EST (Fri, 18 Dec 2009)
@@ -0,0 +1,25 @@
+// 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_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
+template <class T>
+struct wrap{};
+
+
+} } // boost::msm
+#endif //BOOST_MSM_COMMON_H
+
Modified: sandbox/msm/boost/msm/front/euml/common.hpp
==============================================================================
--- sandbox/msm/boost/msm/front/euml/common.hpp (original)
+++ sandbox/msm/boost/msm/front/euml/common.hpp 2009-12-18 17:27:59 EST (Fri, 18 Dec 2009)
@@ -11,6 +11,8 @@
#ifndef BOOST_MSM_FRONT_EUML_COMMON_H
#define BOOST_MSM_FRONT_EUML_COMMON_H
+#include <boost/config.hpp>
+
#ifdef BOOST_MPL_LIMIT_METAFUNCTION_ARITY
#undef BOOST_MPL_LIMIT_METAFUNCTION_ARITY
#endif
Modified: sandbox/msm/boost/msm/front/euml/operator.hpp
==============================================================================
--- sandbox/msm/boost/msm/front/euml/operator.hpp (original)
+++ sandbox/msm/boost/msm/front/euml/operator.hpp 2009-12-18 17:27:59 EST (Fri, 18 Dec 2009)
@@ -18,6 +18,7 @@
#include <boost/mpl/has_key.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/set.hpp>
+#include <boost/type_traits.hpp>
BOOST_MPL_HAS_XXX_TRAIT_DEF(reference)
BOOST_MPL_HAS_XXX_TRAIT_DEF(key_type)
Modified: sandbox/msm/boost/msm/front/euml/state_grammar.hpp
==============================================================================
--- sandbox/msm/boost/msm/front/euml/state_grammar.hpp (original)
+++ sandbox/msm/boost/msm/front/euml/state_grammar.hpp 2009-12-18 17:27:59 EST (Fri, 18 Dec 2009)
@@ -615,6 +615,7 @@
{};
template <class Expr1,class Expr2,class Attr,class Configure,class BASE>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -640,6 +641,7 @@
}
template <class Expr1,class Expr2,class Attr,class Configure>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -664,6 +666,7 @@
}
template <class Expr1,class Expr2,class Attr>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -684,6 +687,7 @@
}
template <class Expr1,class Expr2>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -702,6 +706,7 @@
}
template <class Expr1>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -714,6 +719,7 @@
typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
return func_state<entry_action,NoAction>();
}
+inline
func_state<
NoAction,
NoAction
@@ -785,6 +791,7 @@
};
template <class STT,class Init>
+inline
func_state_machine<
STT,
typename boost::result_of<BuildInit(Init)>::type
@@ -796,6 +803,7 @@
}
template <class STT,class Init,class Expr1>
+inline
func_state_machine<
STT,
typename boost::result_of<BuildInit(Init)>::type,
@@ -812,6 +820,7 @@
}
template <class STT,class Init,class Expr1,class Expr2>
+inline
func_state_machine<
STT,
typename boost::result_of<BuildInit(Init)>::type,
@@ -833,6 +842,7 @@
}
template <class STT,class Init,class Expr1,class Expr2,class Attr>
+inline
func_state_machine<
STT,
typename boost::result_of<BuildInit(Init)>::type,
@@ -856,6 +866,7 @@
}
template <class STT,class Init,class Expr1,class Expr2,class Attr,class Configure>
+inline
func_state_machine<
STT,
typename boost::result_of<BuildInit(Init)>::type,
@@ -887,6 +898,7 @@
}
template <class STT,class Init,class Expr1,class Expr2,class Attr,class Configure,class Expr3>
+inline
func_state_machine<
STT,
typename boost::result_of<BuildInit(Init)>::type,
@@ -922,6 +934,7 @@
}
template <class STT,class Init,class Expr1,class Expr2,class Attr,class Configure,class Expr3,class Expr4>
+inline
func_state_machine<
STT,
typename boost::result_of<BuildInit(Init)>::type,
@@ -962,6 +975,7 @@
}
template <class STT,class Init,class Expr1,class Expr2,class Attr,class Configure,class Expr3,class Expr4,class BASE>
+inline
func_state_machine<
STT,
typename boost::result_of<BuildInit(Init)>::type,
@@ -1003,6 +1017,7 @@
}
template <class Expr>
+inline
inherit_attributes<typename boost::result_of<BuildAttributes(Expr)>::type>
build_attributes (Expr const&)
{
@@ -1010,6 +1025,7 @@
}
template <class Expr1,class Expr2,class Attr,class Configure,class BASE>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -1038,6 +1054,7 @@
}
template <class Expr1,class Expr2,class Attr,class Configure>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -1066,6 +1083,7 @@
}
template <class Expr1,class Expr2,class Attr>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -1087,6 +1105,7 @@
}
template <class Expr1,class Expr2>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -1108,6 +1127,7 @@
}
template <class Expr1>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -1122,6 +1142,7 @@
typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
return func_state<entry_action,NoAction,::boost::fusion::vector<>,::boost::mpl::vector<boost::msm::TerminateFlag> >();
}
+inline
func_state<
NoAction,
NoAction,
@@ -1134,6 +1155,7 @@
}
template <class Expr1,class Expr2,class Attr,class Configure,class BASE,class EndInterruptEvent>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -1168,6 +1190,7 @@
}
template <class Expr1,class Expr2,class Attr,class Configure,class EndInterruptEvent>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -1203,6 +1226,7 @@
}
template <class Expr1,class Expr2,class Attr,class EndInterruptEvent>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -1225,6 +1249,7 @@
}
template <class Expr1,class Expr2,class EndInterruptEvent>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -1247,6 +1272,7 @@
}
template <class Expr1,class EndInterruptEvent>
+inline
func_state<
typename ::boost::mpl::eval_if<
typename proto::matches<Expr1,BuildActionSequence>::type,
@@ -1264,6 +1290,7 @@
}
template <class EndInterruptEvent>
+inline
func_state<
NoAction,
NoAction,
@@ -1277,6 +1304,7 @@
}
template <int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure,class BASE>
+inline
entry_func_state<
ZoneIndex,
typename ::boost::mpl::eval_if<
@@ -1303,6 +1331,7 @@
}
template <int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure>
+inline
entry_func_state<
ZoneIndex,
typename ::boost::mpl::eval_if<
@@ -1328,6 +1357,7 @@
}
template <int ZoneIndex,class Expr1,class Expr2,class Attr>
+inline
entry_func_state<
ZoneIndex,
typename ::boost::mpl::eval_if<
@@ -1349,6 +1379,7 @@
}
template <int ZoneIndex,class Expr1,class Expr2>
+inline
entry_func_state<
ZoneIndex,
typename ::boost::mpl::eval_if<
@@ -1368,6 +1399,7 @@
}
template <int ZoneIndex,class Expr1>
+inline
entry_func_state<
ZoneIndex,
typename ::boost::mpl::eval_if<
@@ -1383,6 +1415,7 @@
}
template <int ZoneIndex>
+inline
entry_func_state<
ZoneIndex,
NoAction,
@@ -1394,6 +1427,7 @@
}
template <class Event,class Expr1,class Expr2,class Attr,class Configure,class BASE>
+inline
exit_func_state<
Event,
typename ::boost::mpl::eval_if<
@@ -1420,6 +1454,7 @@
}
template <class Event,class Expr1,class Expr2,class Attr,class Configure>
+inline
exit_func_state<
Event,
typename ::boost::mpl::eval_if<
@@ -1445,6 +1480,7 @@
}
template <class Event,class Expr1,class Expr2,class Attr>
+inline
exit_func_state<
Event,
typename ::boost::mpl::eval_if<
@@ -1466,6 +1502,7 @@
}
template <class Event,class Expr1,class Expr2>
+inline
exit_func_state<
Event,
typename ::boost::mpl::eval_if<
@@ -1485,6 +1522,7 @@
}
template <class Event,class Expr1>
+inline
exit_func_state<
Event,
typename ::boost::mpl::eval_if<
@@ -1500,6 +1538,7 @@
}
template <class Event>
+inline
exit_func_state<
Event,
NoAction,
@@ -1511,6 +1550,7 @@
}
template <int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure,class BASE>
+inline
explicit_entry_func_state<
ZoneIndex,
typename ::boost::mpl::eval_if<
@@ -1537,6 +1577,7 @@
}
template <int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure>
+inline
explicit_entry_func_state<
ZoneIndex,
typename ::boost::mpl::eval_if<
@@ -1562,6 +1603,7 @@
}
template <int ZoneIndex,class Expr1,class Expr2,class Attr>
+inline
explicit_entry_func_state<
ZoneIndex,
typename ::boost::mpl::eval_if<
@@ -1583,6 +1625,7 @@
}
template <int ZoneIndex,class Expr1,class Expr2>
+inline
explicit_entry_func_state<
ZoneIndex,
typename ::boost::mpl::eval_if<
@@ -1602,6 +1645,7 @@
}
template <int ZoneIndex,class Expr1>
+inline
explicit_entry_func_state<
ZoneIndex,
typename ::boost::mpl::eval_if<
@@ -1617,6 +1661,7 @@
}
template <int ZoneIndex>
+inline
explicit_entry_func_state<
ZoneIndex,
NoAction,
Modified: sandbox/msm/boost/msm/front/functor_row.hpp
==============================================================================
--- sandbox/msm/boost/msm/front/functor_row.hpp (original)
+++ sandbox/msm/boost/msm/front/functor_row.hpp 2009-12-18 17:27:59 EST (Fri, 18 Dec 2009)
@@ -16,6 +16,8 @@
#include <boost/typeof/typeof.hpp>
+#include <boost/msm/row_tags.hpp>
+#include <boost/msm/common.hpp>
#include <boost/msm/front/automatic_event.hpp>
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
@@ -120,7 +122,7 @@
Call(EVT const& evt,FSM& fsm,STATE& state):
evt_(evt),fsm_(fsm),state_(state){}
template <class FCT>
- void operator()(::boost::msm::back::wrap<FCT> const& )
+ void operator()(::boost::msm::wrap<FCT> const& )
{
FCT()(evt_,fsm_,state_);
}
@@ -140,7 +142,7 @@
Call2(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt):
evt_(evt),fsm_(fsm),src_(src),tgt_(tgt){}
template <class FCT>
- void operator()(::boost::msm::back::wrap<FCT> const& )
+ void operator()(::boost::msm::wrap<FCT> const& )
{
FCT()(evt_,fsm_,src_,tgt_);
}
@@ -156,13 +158,13 @@
template <class EVT,class FSM,class STATE>
void operator()(EVT const& evt,FSM& fsm,STATE& state)
{
- mpl::for_each<Sequence,boost::msm::back::wrap< ::boost::mpl::placeholders::_1> >
+ mpl::for_each<Sequence,boost::msm::wrap< ::boost::mpl::placeholders::_1> >
(Call<EVT,FSM,STATE>(evt,fsm,state));
}
template <class EVT,class FSM,class SourceState,class TargetState>
void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)
{
- mpl::for_each<Sequence,boost::msm::back::wrap< ::boost::mpl::placeholders::_1> >
+ mpl::for_each<Sequence,boost::msm::wrap< ::boost::mpl::placeholders::_1> >
(Call2<EVT,FSM,SourceState,TargetState>(evt,fsm,src,tgt));
}
};
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk