|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r70961 - trunk/boost/msm/back
From: christophe.j.henry_at_[hidden]
Date: 2011-04-03 15:24:35
Author: chenry
Date: 2011-04-03 15:24:33 EDT (Sun, 03 Apr 2011)
New Revision: 70961
URL: http://svn.boost.org/trac/boost/changeset/70961
Log:
added a start and stop method with an event parameter
Text files modified:
trunk/boost/msm/back/state_machine.hpp | 30 +++++++++++++++++++++++++-----
1 files changed, 25 insertions(+), 5 deletions(-)
Modified: trunk/boost/msm/back/state_machine.hpp
==============================================================================
--- trunk/boost/msm/back/state_machine.hpp (original)
+++ trunk/boost/msm/back/state_machine.hpp 2011-04-03 15:24:33 EDT (Sun, 03 Apr 2011)
@@ -1044,12 +1044,32 @@
eventless_helper.process_completion_event();
}
+ // start the state machine (calls entry of the initial state passing incomingEvent to on_entry's)
+ template <class Event>
+ void start(Event const& incomingEvent)
+ {
+ // call on_entry on this SM
+ (static_cast<Derived*>(this))->on_entry(incomingEvent,*this);
+ ::boost::mpl::for_each<initial_states, boost::msm::wrap<mpl::placeholders::_1> >
+ (call_init<Event>(incomingEvent,this));
+ // give a chance to handle an anonymous (eventless) transition
+ handle_eventless_transitions_helper<library_sm> eventless_helper(this,true);
+ eventless_helper.process_completion_event();
+ }
+
// stop the state machine (calls exit of the current state)
void stop()
{
do_exit(fsm_final_event(),*this);
}
+ // stop the state machine (calls exit of the current state passing finalEvent to on_exit's)
+ template <class Event>
+ void stop(Event const& finalEvent)
+ {
+ 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.
template<class Event>
@@ -2167,7 +2187,7 @@
};
// start for states machines which are themselves embedded in other state machines (composites)
template <class Event>
- void start(Event const& incomingEvent)
+ void internal_start(Event const& incomingEvent)
{
region_start_helper< ::boost::mpl::int_<0> >::do_start(this,incomingEvent);
// give a chance to handle an anonymous (eventless) transition
@@ -2205,7 +2225,7 @@
operator()(EventType const& evt,FsmType& fsm, ::boost::msm::back::dummy<0> = 0)
{
(static_cast<Derived*>(self))->on_entry(evt,fsm);
- self->start(evt);
+ self->internal_start(evt);
}
// this variant is for the direct entry case (just one entry, not a sequence of entries)
@@ -2227,7 +2247,7 @@
BOOST_STATIC_ASSERT(find_region_id<typename EventType::active_state::wrapped_entry>::region_index <= nr_regions::value);
// just set the correct zone, the others will be default/history initialized
self->m_states[find_region_id<typename EventType::active_state::wrapped_entry>::region_index] = state_id;
- self->start(evt.m_event);
+ self->internal_start(evt.m_event);
}
// this variant is for the fork entry case (a sequence on entries)
@@ -2248,7 +2268,7 @@
::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);
+ self->internal_start(evt.m_event);
}
// this variant is for the pseudo state entry case
@@ -2263,7 +2283,7 @@
int state_id = get_state_id<stt,typename EventType::active_state::wrapped_entry>::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->start(evt.m_event);
+ self->internal_start(evt.m_event);
// and we process the transition in the zone of the newly active state
// (entry pseudo states are, according to UML, a state connecting 1 transition outside to 1 inside
self->process_event(evt.m_event);
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