Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r58684 - sandbox/msm/boost/msm/back
From: christophe.j.henry_at_[hidden]
Date: 2010-01-04 14:56:25


Author: chenry
Date: 2010-01-04 14:56:25 EST (Mon, 04 Jan 2010)
New Revision: 58684
URL: http://svn.boost.org/trac/boost/changeset/58684

Log:
added internal rows
Text files modified:
   sandbox/msm/boost/msm/back/state_machine.hpp | 146 +++++++++++++++++++++++++++++++++++++--
   1 files changed, 137 insertions(+), 9 deletions(-)

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 2010-01-04 14:56:25 EST (Mon, 04 Jan 2010)
@@ -537,6 +537,111 @@
             return HANDLED_TRUE;
         }
     };
+ // "i" rows are rows for internal transitions
+ template<
+ typename ROW
+ >
+ struct irow_
+ {
+ typedef typename ROW::Source T1;
+ typedef typename ROW::Target T2;
+ typedef typename ROW::Evt Event;
+ typedef T1 current_state_type;
+ typedef T2 next_state_type;
+
+ // if a guard condition is here, call it to check that the event is accepted
+ static bool check_guard(library_sm& fsm,Event const& evt)
+ {
+ if ( ROW::guard_call(fsm,evt,
+ ::boost::fusion::at_key<current_state_type>(fsm.m_substate_list),
+ ::boost::fusion::at_key<next_state_type>(fsm.m_substate_list)) )
+ return true;
+ return false;
+ }
+ // Take the transition action and return the next state.
+ static HandledEnum execute(library_sm& fsm, int , 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));
+ BOOST_ASSERT(state == (current_state));
+ if (!check_guard(fsm,evt))
+ {
+ // guard rejected the event, we stay in the current one
+ return HANDLED_GUARD_REJECT;
+ }
+
+ // call the action method
+ ROW::action_call(fsm,evt,
+ ::boost::fusion::at_key<current_state_type>(fsm.m_substate_list),
+ ::boost::fusion::at_key<next_state_type>(fsm.m_substate_list) );
+ return HANDLED_TRUE;
+ }
+ };
+
+ // row having only a guard condition
+ template<
+ typename ROW
+ >
+ struct g_irow_
+ {
+ typedef typename ROW::Source T1;
+ typedef typename ROW::Target T2;
+ typedef typename ROW::Evt Event;
+ typedef T1 current_state_type;
+ typedef T2 next_state_type;
+
+ // if a guard condition is defined, call it to check that the event is accepted
+ static bool check_guard(library_sm& fsm,Event const& evt)
+ {
+ if ( ROW::guard_call(fsm,evt,
+ ::boost::fusion::at_key<current_state_type>(fsm.m_substate_list),
+ ::boost::fusion::at_key<next_state_type>(fsm.m_substate_list)) )
+ return true;
+ return false;
+ }
+ // Take the transition action and return the next state.
+ static HandledEnum execute(library_sm& fsm, int , 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));
+ BOOST_ASSERT(state == (current_state));
+ if (!check_guard(fsm,evt))
+ {
+ // guard rejected the event, we stay in the current one
+ return HANDLED_GUARD_REJECT;
+ }
+ return HANDLED_TRUE;
+ }
+ };
+
+ // row having only an action method
+ template<
+ typename ROW
+ >
+ struct a_irow_
+ {
+ typedef typename ROW::Source T1;
+ typedef typename ROW::Target T2;
+ typedef typename ROW::Evt Event;
+ typedef T1 current_state_type;
+ typedef T2 next_state_type;
+
+ // Take the transition action and return the next state.
+ 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));
+ BOOST_ASSERT(state == (current_state));
+
+ // call the action method
+ ROW::action_call(fsm,evt,
+ ::boost::fusion::at_key<current_state_type>(fsm.m_substate_list),
+ ::boost::fusion::at_key<next_state_type>(fsm.m_substate_list) );
+
+ return HANDLED_TRUE;
+ }
+ };
 
     // Template used to form forwarding rows in the transition table for every row of a composite SM
     template<
@@ -564,30 +669,46 @@
         typedef frow<Composite,Event> type;
     };
 
- template <class Tag, class Transition,int Dummy=0>
+ template <class Tag, class Transition>
     struct create_backend_stt
     {
     };
- template <class Transition,int Dummy>
- struct create_backend_stt<g_row_tag,Transition,Dummy>
+ template <class Transition>
+ struct create_backend_stt<g_row_tag,Transition>
     {
         typedef g_row_<Transition> type;
     };
- template <class Transition,int Dummy>
- struct create_backend_stt<a_row_tag,Transition,Dummy>
+ template <class Transition>
+ struct create_backend_stt<a_row_tag,Transition>
     {
         typedef a_row_<Transition> type;
     };
- template <class Transition,int Dummy>
- struct create_backend_stt<_row_tag,Transition,Dummy>
+ template <class Transition>
+ struct create_backend_stt<_row_tag,Transition>
     {
         typedef _row_<Transition> type;
     };
- template <class Transition,int Dummy>
- struct create_backend_stt<row_tag,Transition,Dummy>
+ template <class Transition>
+ struct create_backend_stt<row_tag,Transition>
         {
                 typedef row_<Transition> type;
         };
+ // internal transitions
+ template <class Transition>
+ struct create_backend_stt<g_irow_tag,Transition>
+ {
+ typedef g_irow_<Transition> type;
+ };
+ template <class Transition>
+ struct create_backend_stt<a_irow_tag,Transition>
+ {
+ typedef a_irow_<Transition> type;
+ };
+ template <class Transition>
+ struct create_backend_stt<irow_tag,Transition>
+ {
+ typedef irow_<Transition> type;
+ };
     template <class Transition>
     struct make_row_tag
     {
@@ -1570,6 +1691,8 @@
              //forward the event for handling by sub state machines
              ::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_));
+ region_start_helper
+ < ::boost::mpl::int_<region_id::value+1> >::template do_start(self_,incomingEvent);
          }
      };
      template <int Dummy>
@@ -1671,6 +1794,7 @@
              void operator()( ::boost::msm::wrap<StateType> const& )
              {
                  int state_id = get_state_id<stt,StateType>::value;
+ int index = StateType::zone_index;
                  BOOST_STATIC_ASSERT(StateType::zone_index >= 0);
                  BOOST_STATIC_ASSERT(StateType::zone_index <= nr_regions::value);
                  helper_self->m_states[StateType::zone_index] = state_id;
@@ -1690,12 +1814,16 @@
          {
              self_->m_states[region_id::value] =
                  self_->m_history.history_entry(incomingEvent)[region_id::value];
+ region_entry_exit_helper
+ < ::boost::mpl::int_<region_id::value+1> >::template do_entry(self_,incomingEvent);
          }
          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_));
+ region_entry_exit_helper
+ < ::boost::mpl::int_<region_id::value+1> >::template do_exit(self_,incomingEvent);
          }
      };
      template <int Dummy>


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