$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r77418 - in trunk/boost/msm: back front front/euml
From: christophe.j.henry_at_[hidden]
Date: 2012-03-19 17:06:51
Author: chenry
Date: 2012-03-19 17:06:50 EDT (Mon, 19 Mar 2012)
New Revision: 77418
URL: http://svn.boost.org/trac/boost/changeset/77418
Log:
bugfix (terminate/interrupt states not working if flags are provided in the state definition)
Text files modified: 
   trunk/boost/msm/back/metafunctions.hpp       |    13 ++++++++++++-                           
   trunk/boost/msm/back/state_machine.hpp       |     2 +-                                      
   trunk/boost/msm/front/euml/state_grammar.hpp |     5 +++++                                   
   trunk/boost/msm/front/state_machine_def.hpp  |     1 +                                       
   trunk/boost/msm/front/states.hpp             |    11 ++++++++---                             
   5 files changed, 27 insertions(+), 5 deletions(-)
Modified: trunk/boost/msm/back/metafunctions.hpp
==============================================================================
--- trunk/boost/msm/back/metafunctions.hpp	(original)
+++ trunk/boost/msm/back/metafunctions.hpp	2012-03-19 17:06:50 EDT (Mon, 19 Mar 2012)
@@ -632,11 +632,22 @@
         ::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 >, 
Modified: trunk/boost/msm/back/state_machine.hpp
==============================================================================
--- trunk/boost/msm/back/state_machine.hpp	(original)
+++ trunk/boost/msm/back/state_machine.hpp	2012-03-19 17:06:50 EDT (Mon, 19 Mar 2012)
@@ -2096,7 +2096,7 @@
         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;
 
Modified: trunk/boost/msm/front/euml/state_grammar.hpp
==============================================================================
--- trunk/boost/msm/front/euml/state_grammar.hpp	(original)
+++ trunk/boost/msm/front/euml/state_grammar.hpp	2012-03-19 17:06:50 EDT (Mon, 19 Mar 2012)
@@ -59,6 +59,7 @@
     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 @@
 
     // flags
     typedef Flags       flag_list;
+    typedef ::boost::mpl::vector0<> internal_flag_list;
     // deferred events
     typedef Defer       deferred_events;
 
@@ -135,6 +137,7 @@
     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 @@
 
     // flags
     typedef Flags       flag_list;
+    typedef ::boost::mpl::vector0<> internal_flag_list;
     // deferred events
     typedef Defer       deferred_events;
 
@@ -867,6 +871,7 @@
     // 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)
Modified: trunk/boost/msm/front/state_machine_def.hpp
==============================================================================
--- trunk/boost/msm/front/state_machine_def.hpp	(original)
+++ trunk/boost/msm/front/state_machine_def.hpp	2012-03-19 17:06:50 EDT (Mon, 19 Mar 2012)
@@ -31,6 +31,7 @@
     // 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)
Modified: trunk/boost/msm/front/states.hpp
==============================================================================
--- trunk/boost/msm/front/states.hpp	(original)
+++ trunk/boost/msm/front/states.hpp	2012-03-19 17:06:50 EDT (Mon, 19 Mar 2012)
@@ -49,6 +49,7 @@
     // 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 @@
 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 @@
 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 @@
     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 @@
     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;
 };