Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r57528 - in sandbox/msm: boost/msm boost/msm/back boost/msm/front boost/msm/front/euml libs/msm/doc libs/msm/doc/index-Dateien
From: christophe.j.henry_at_[hidden]
Date: 2009-11-09 17:25:14


Author: chenry
Date: 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
New Revision: 57528
URL: http://svn.boost.org/trac/boost/changeset/57528

Log:
V2.0
Added:
   sandbox/msm/boost/msm/back/
   sandbox/msm/boost/msm/back/args.hpp (contents, props changed)
   sandbox/msm/boost/msm/back/bind_helpers.hpp (contents, props changed)
   sandbox/msm/boost/msm/back/common_types.hpp (contents, props changed)
   sandbox/msm/boost/msm/back/copy_policies.hpp (contents, props changed)
   sandbox/msm/boost/msm/back/dispatch_table.hpp (contents, props changed)
   sandbox/msm/boost/msm/back/history_policies.hpp (contents, props changed)
   sandbox/msm/boost/msm/back/metafunctions.hpp (contents, props changed)
   sandbox/msm/boost/msm/back/state_machine.hpp (contents, props changed)
   sandbox/msm/boost/msm/back/tools.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/
   sandbox/msm/boost/msm/front/automatic_event.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/common_states.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/
   sandbox/msm/boost/msm/front/euml/algorithm.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/common.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/container.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/euml.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/euml_typeof.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/guard_grammar.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/iteration.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/operator.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/querying.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/state_grammar.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/stl.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/stt_grammar.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/euml/transformation.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/functor_row.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/state_machine_def.hpp (contents, props changed)
   sandbox/msm/boost/msm/front/states.hpp (contents, props changed)
   sandbox/msm/boost/msm/row_tags.hpp (contents, props changed)
   sandbox/msm/libs/msm/doc/AnnexA.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/Anonymous.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/AnonymousTutorial.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/AnonymousTutorialEuml.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/AnonymousTutorialWithFunctors.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/CompilerStressTestEuml.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/CompositeTutorial.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/CompositeTutorial.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/CompositeTutorialEuml.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/DirectEntryAndConflicts.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/DirectEntryEuml.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/DirectEntryTutorial.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/EumlSimple.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/Flags.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/FlagsTutorial.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/FlagsTutorialEuml.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/HarelWithEntry.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/HarelWithoutEntry.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/History.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/HistoryEuml.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/HistoryTutorial.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/MsmComposite.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/MsmSession_Handout.pdf (contents, props changed)
   sandbox/msm/libs/msm/doc/MsmSimple.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/Orthogonal-deferred.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/Orthogonal-deferred.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/OrthogonalDeferredEuml.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/SC Composite.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/SC Simple.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/SM-2Arg.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/SimpleTimer.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/SimpleTutorial.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/SimpleTutorial.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/SimpleTutorialEuml.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/SimpleWithFunctors.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/Timer.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/Transition.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/alarm.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/clock.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/entry tutorial.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/iPodSearch.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/iPodSearch.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/iPodSearchEuml.cpp (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/
   sandbox/msm/libs/msm/doc/index-Dateien/colorschememapping.xml (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/filelist.xml (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image001.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image003.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image005.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image007.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image009.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image011.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image013.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image015.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image017.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image019.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image021.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image023.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image025.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image027.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image028.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image029.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image030.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image031.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image032.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image033.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image034.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image035.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image036.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image037.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image038.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/image039.jpg (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/item0032.xml (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/props0033.xml (contents, props changed)
   sandbox/msm/libs/msm/doc/index-Dateien/themedata.thmx (contents, props changed)
   sandbox/msm/libs/msm/doc/index.htm (contents, props changed)
   sandbox/msm/libs/msm/doc/logging_functors.h (contents, props changed)
Removed:
   sandbox/msm/boost/msm/args.hpp
   sandbox/msm/boost/msm/bind_helpers.hpp
   sandbox/msm/boost/msm/common_types.hpp
   sandbox/msm/boost/msm/copy_policies.hpp
   sandbox/msm/boost/msm/dispatch_table.hpp
   sandbox/msm/boost/msm/history_policies.hpp
   sandbox/msm/boost/msm/metafunctions.hpp
   sandbox/msm/boost/msm/state_machine.hpp
   sandbox/msm/boost/msm/states.hpp
   sandbox/msm/boost/msm/tools.hpp
   sandbox/msm/libs/msm/doc/HarelWithoutEntryNoTemplateSM.cpp
   sandbox/msm/libs/msm/doc/SM-0arg.cpp
   sandbox/msm/libs/msm/doc/SM-1arg.cpp
   sandbox/msm/libs/msm/doc/SM-3arg.cpp
   sandbox/msm/libs/msm/doc/SM.cpp
   sandbox/msm/libs/msm/doc/index.html
   sandbox/msm/libs/msm/doc/index_html_166e0165.jpg
   sandbox/msm/libs/msm/doc/index_html_2cb96cb.jpg
   sandbox/msm/libs/msm/doc/index_html_2cffc008.jpg
   sandbox/msm/libs/msm/doc/index_html_55a3569b.jpg
   sandbox/msm/libs/msm/doc/index_html_573c91b1.jpg
   sandbox/msm/libs/msm/doc/index_html_583f47ba.jpg
   sandbox/msm/libs/msm/doc/index_html_632a9e9a.jpg
   sandbox/msm/libs/msm/doc/index_html_64d3c88c.jpg
   sandbox/msm/libs/msm/doc/index_html_757a2a53.jpg
   sandbox/msm/libs/msm/doc/index_html_m15cfca99.jpg
   sandbox/msm/libs/msm/doc/index_html_m23e6b7d5.jpg
   sandbox/msm/libs/msm/doc/index_html_m26c048b0.jpg
   sandbox/msm/libs/msm/doc/index_html_m2ed87c03.jpg
   sandbox/msm/libs/msm/doc/index_html_m312ff8f2.jpg
   sandbox/msm/libs/msm/doc/index_html_m6fc8a34.jpg
   sandbox/msm/libs/msm/doc/index_html_m73d8a201.jpg
   sandbox/msm/libs/msm/doc/index_html_m743a147d.jpg

Deleted: sandbox/msm/boost/msm/args.hpp
==============================================================================
--- sandbox/msm/boost/msm/args.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,65 +0,0 @@
-// 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_ARGS_H
-#define BOOST_MSM_ARGS_H
-
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/arithmetic/sub.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
-#include <boost/preprocessor/control/expr_if.hpp>
-#include <boost/preprocessor/punctuation/comma.hpp>
-#include <boost/preprocessor/arithmetic/add.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/comparison/less.hpp>
-#include <boost/preprocessor/arithmetic/dec.hpp>
-#include <boost/function.hpp>
-
-#ifndef BOOST_MSM_VISITOR_ARG_SIZE
-#define BOOST_MSM_VISITOR_ARG_SIZE 2 // default max number of arguments
-#endif
-
-namespace boost { namespace msm
-{
-struct none {};
-#define MSM_ARGS_PRINT(z, n, data) data
-#define MSM_ARGS_NONE_PRINT(z, n, data) class data ## n = none \
- BOOST_PP_COMMA_IF( BOOST_PP_LESS(n, BOOST_PP_DEC(BOOST_MSM_VISITOR_ARG_SIZE) ) )
-
-#define MSM_VISITOR_MAIN_ARGS(n) \
- template <class RES, \
- BOOST_PP_REPEAT(BOOST_MSM_VISITOR_ARG_SIZE, MSM_ARGS_NONE_PRINT, ARG)> \
- struct args \
- { \
- typedef ::boost::function<RES(BOOST_PP_ENUM_PARAMS(n, ARG))> type; \
- enum {args_number=n}; \
- };
-
-#define MSM_VISITOR_ARGS(z, n, unused) \
- template <class RES BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class ARG)> \
- struct args<RES, \
- BOOST_PP_ENUM_PARAMS(n,ARG) \
- BOOST_PP_COMMA_IF(n) \
- BOOST_PP_ENUM(BOOST_PP_SUB(BOOST_MSM_VISITOR_ARG_SIZE,n), MSM_ARGS_PRINT, none) \
- > \
- { \
- typedef ::boost::function<RES(BOOST_PP_ENUM_PARAMS(n, ARG))> type; \
- enum {args_number=n}; \
- };
-MSM_VISITOR_MAIN_ARGS(BOOST_MSM_VISITOR_ARG_SIZE)
-BOOST_PP_REPEAT(BOOST_MSM_VISITOR_ARG_SIZE, MSM_VISITOR_ARGS, ~)
-
-#undef MSM_VISITOR_ARGS
-#undef MSM_ARGS_PRINT
-
-}}
-
-#endif //BOOST_MSM_ARGS_H
-

Added: sandbox/msm/boost/msm/back/args.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/back/args.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,68 @@
+// 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_BACK_ARGS_H
+#define BOOST_MSM_BACK_ARGS_H
+
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/control/expr_if.hpp>
+#include <boost/preprocessor/punctuation/comma.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/function.hpp>
+
+#ifndef BOOST_MSM_VISITOR_ARG_SIZE
+#define BOOST_MSM_VISITOR_ARG_SIZE 2 // default max number of arguments
+#endif
+
+namespace boost { namespace msm { namespace back
+{
+struct none {};
+#define MSM_ARGS_TYPEDEF_SUB(z, n, unused) typedef ARG ## n argument ## n ;
+#define MSM_ARGS_PRINT(z, n, data) data
+#define MSM_ARGS_NONE_PRINT(z, n, data) class data ## n = none \
+ BOOST_PP_COMMA_IF( BOOST_PP_LESS(n, BOOST_PP_DEC(BOOST_MSM_VISITOR_ARG_SIZE) ) )
+
+#define MSM_VISITOR_MAIN_ARGS(n) \
+ template <class RES, \
+ BOOST_PP_REPEAT(BOOST_MSM_VISITOR_ARG_SIZE, MSM_ARGS_NONE_PRINT, ARG)> \
+ struct args \
+ { \
+ typedef ::boost::function<RES(BOOST_PP_ENUM_PARAMS(n, ARG))> type; \
+ enum {args_number=n}; \
+ BOOST_PP_REPEAT(n, MSM_ARGS_TYPEDEF_SUB, ~ ) \
+ };
+
+#define MSM_VISITOR_ARGS(z, n, unused) \
+ template <class RES BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class ARG)> \
+ struct args<RES, \
+ BOOST_PP_ENUM_PARAMS(n,ARG) \
+ BOOST_PP_COMMA_IF(n) \
+ BOOST_PP_ENUM(BOOST_PP_SUB(BOOST_MSM_VISITOR_ARG_SIZE,n), MSM_ARGS_PRINT, none) \
+ > \
+ { \
+ typedef ::boost::function<RES(BOOST_PP_ENUM_PARAMS(n, ARG))> type; \
+ enum {args_number=n}; \
+ BOOST_PP_REPEAT(n, MSM_ARGS_TYPEDEF_SUB, ~ ) \
+ };
+MSM_VISITOR_MAIN_ARGS(BOOST_MSM_VISITOR_ARG_SIZE)
+BOOST_PP_REPEAT(BOOST_MSM_VISITOR_ARG_SIZE, MSM_VISITOR_ARGS, ~)
+
+#undef MSM_VISITOR_ARGS
+#undef MSM_ARGS_PRINT
+
+}}}
+
+#endif //BOOST_MSM_BACK_ARGS_H
+

Added: sandbox/msm/boost/msm/back/bind_helpers.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/back/bind_helpers.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,39 @@
+// 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_BACK_BIND_HELPERS_H
+#define BOOST_MSM_BACK_BIND_HELPERS_H
+
+#include <functional>
+
+namespace boost { namespace msm { namespace back
+{
+ // helper to replace std::plus as the lack of implicit conversion makes it not usable in one of our bind
+ template<class _Ty,class _Tz>
+ struct plus2
+ : public std::binary_function<_Ty, _Tz, _Ty>
+ { // functor for operator+
+ _Ty operator()( _Ty _Left, _Tz _Right) const
+ { // apply operator+ to operands
+ return (_Left + _Right);
+ }
+ };
+ // helper to dereference a pointer to a function pointer
+ template <class T>
+ struct deref
+ {
+ typedef T& result_type;
+ T& operator()(T* f) const
+ {
+ return *f;
+ }
+ };
+} } }//boost::msm::back
+#endif //BOOST_MSM_BACK_BIND_HELPERS_H

Added: sandbox/msm/boost/msm/back/common_types.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/back/common_types.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,37 @@
+// 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_TYPES_H
+#define BOOST_MSM_COMMON_TYPES_H
+
+#include <boost/tuple/tuple.hpp>
+
+namespace boost { namespace msm { namespace back
+{
+// used for disable_if
+template <int> struct dummy { dummy(int) {} };
+// return value for transition handling
+typedef enum
+{
+ HANDLED_FALSE=0,
+ HANDLED_TRUE =1,
+ HANDLED_GUARD_REJECT=2
+} HandledEnum;
+
+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
+

Added: sandbox/msm/boost/msm/back/copy_policies.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/back/copy_policies.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,30 @@
+// 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_BACK_COPY_POLICIES_H
+#define BOOST_MSM_BACK_COPY_POLICIES_H
+
+#include <boost/noncopyable.hpp>
+
+namespace boost { namespace msm { namespace back
+{
+ // deactivates copy
+ struct NoCopy : ::boost::noncopyable
+ {
+ };
+
+ // allows deep copy
+ struct DeepCopy
+ {
+ };
+} } }//boost::msm::back
+
+
+#endif //BOOST_MSM_BACK_COPY_POLICIES_H

Added: sandbox/msm/boost/msm/back/dispatch_table.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/back/dispatch_table.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,254 @@
+// 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_BACK_DISPATCH_TABLE_H
+#define BOOST_MSM_BACK_DISPATCH_TABLE_H
+
+#include <utility>
+
+#include <boost/mpl/reverse_fold.hpp>
+#include <boost/mpl/greater.hpp>
+#include <boost/mpl/filter_view.hpp>
+#include <boost/mpl/pop_front.hpp>
+#include <boost/mpl/for_each.hpp>
+
+#include <boost/msm/back/metafunctions.hpp>
+#include <boost/msm/back/common_types.hpp>
+
+namespace boost { namespace msm { namespace back
+{
+
+// Generates a singleton runtime lookup table that maps current state
+// to a function that makes the SM take its transition on the given
+// Event type.
+template <class Fsm,class Stt, class Event>
+struct dispatch_table
+{
+ private:
+ // This is a table of these function pointers.
+ typedef std::pair<int,HandledEnum> (*cell)(Fsm&, 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
+ // (like an UML diamond). Allows transition conflicts.
+ template< typename Seq,typename AnEvent,typename State >
+ struct chain_row
+ {
+ typedef State current_state_type;
+ typedef AnEvent event;
+
+ // helper for building a disable/enable_if-controlled execute function
+ struct execute_helper
+ {
+ 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)
+ {
+ // if at least one guard rejected, this will be ignored, otherwise will generate an error
+ return std::make_pair(state,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)
+ {
+ // 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)
+ {
+ // 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);
+ // 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);
+ }
+ return res;
+ }
+ };
+ // Take the transition action and return the next state.
+ static std::pair<int,HandledEnum> execute(Fsm& fsm, int state, Event const& evt)
+ {
+ // forward to helper
+ return execute_helper::template execute<Seq>(fsm,state,evt);
+ }
+ };
+ // nullary metafunction whose only job is to prevent early evaluation of _1
+ template< typename Entry >
+ struct make_chain_row_from_map_entry
+ {
+ typedef chain_row<typename Entry::second,Event,
+ typename Entry::first > type;
+ };
+ // Compute the maximum state value in the sm so we know how big
+ // to make the table
+ typedef typename generate_state_set<Stt>::type state_list;
+ BOOST_STATIC_CONSTANT(int, max_state = ( ::boost::mpl::size<state_list>::value));
+
+ // A function object for use with mpl::for_each that stuffs
+ // transitions into cells.
+ struct init_cell
+ {
+ init_cell(dispatch_table* self_)
+ : self(self_)
+ {}
+
+ // Cell initializer function object, used with mpl::for_each
+ template <class Transition>
+ typename ::boost::enable_if<typename has_not_real_row_tag<Transition>::type,void >::type
+ operator()(Transition const&,boost::msm::back::dummy<0> = 0) const
+ {
+ // version for not real rows. No problem because irrelevant for process_event
+ }
+ template <class Transition>
+ typename ::boost::disable_if<typename has_not_real_row_tag<Transition>::type,void >::type
+ operator()(Transition const&,boost::msm::back::dummy<1> = 0) 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] = &Transition::execute;
+ }
+
+ dispatch_table* self;
+ };
+
+ // Cell default-initializer function object, used with mpl::for_each
+ // initializes with call_no_transition, defer_transition or default_eventless_transition
+ // variant for non-anonymous transitions
+ template <class EventType,class Enable=void>
+ struct default_init_cell
+ {
+ default_init_cell(dispatch_table* self_,cell* tofill_entries_)
+ : self(self_),tofill_entries(tofill_entries_)
+ {}
+ 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)
+ {
+ typedef typename create_stt<Fsm>::type stt;
+ BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,State>::value));
+ cell call_no_transition = &Fsm::defer_transition;
+ tofill_entries[state_id] = call_no_transition;
+ }
+ 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)
+ {
+ typedef typename create_stt<Fsm>::type stt;
+ BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,State>::value));
+ cell call_no_transition = &Fsm::call_no_transition;
+ tofill_entries[state_id] = call_no_transition;
+ }
+
+ dispatch_table* self;
+ cell* tofill_entries;
+ };
+
+ // variant for anonymous transitions
+ template <class EventType>
+ struct default_init_cell<EventType,
+ typename ::boost::enable_if<
+ typename is_automatic_event<EventType>::type>::type>
+ {
+ default_init_cell(dispatch_table* self_,cell* tofill_entries_)
+ : self(self_),tofill_entries(tofill_entries_)
+ {}
+
+ // 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&)
+ {
+ typedef typename create_stt<Fsm>::type stt;
+ BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,State>::value));
+ cell call_no_transition = &Fsm::default_eventless_transition;
+ tofill_entries[state_id] = call_no_transition;
+ }
+
+ dispatch_table* self;
+ cell* tofill_entries;
+ };
+
+ public:
+ // initialize the dispatch table for a given Event and Fsm
+ dispatch_table()
+ {
+ // Initialize cells for no transition
+ ::boost::mpl::for_each<typename generate_state_set<Stt>::type,
+ boost::msm::back::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
+ // first we build a map of sequence for every source
+ // in reverse order so that the frow's are handled first (UML priority)
+ typedef typename ::boost::mpl::reverse_fold<
+ // filter on event
+ ::boost::mpl::filter_view
+ <Stt, ::boost::is_same<transition_event< ::boost::mpl::placeholders::_>, Event> >,
+ // build a map
+ ::boost::mpl::map<>,
+ ::boost::mpl::if_<
+ // if we already have a row on this source state
+ ::boost::mpl::has_key< ::boost::mpl::placeholders::_1,
+ transition_source_type< ::boost::mpl::placeholders::_2> >,
+ // insert a new element in the value type
+ ::boost::mpl::insert<
+ ::boost::mpl::placeholders::_1,
+ ::boost::mpl::pair<transition_source_type< ::boost::mpl::placeholders::_2>,
+ ::boost::mpl::push_back<
+ ::boost::mpl::at< ::boost::mpl::placeholders::_1,
+ transition_source_type< ::boost::mpl::placeholders::_2> >,
+ ::boost::mpl::placeholders::_2 >
+ > >,
+ // first row on this source state, make a vector with 1 element
+ ::boost::mpl::insert<
+ ::boost::mpl::placeholders::_1,
+ ::boost::mpl::pair<transition_source_type< ::boost::mpl::placeholders::_2>,
+ make_vector< ::boost::mpl::placeholders::_2> > >
+ >
+ >::type map_of_row_seq;
+ // and then build chaining rows for all source states having more than 1 row
+ typedef typename ::boost::mpl::fold<
+ map_of_row_seq,::boost::mpl::vector0<>,
+ ::boost::mpl::if_<
+ ::boost::mpl::greater< ::boost::mpl::size<
+ ::boost::mpl::second< ::boost::mpl::placeholders::_2> >,
+ ::boost::mpl::int_<1> >,
+ // we need row chaining
+ ::boost::mpl::push_back< ::boost::mpl::placeholders::_1,
+ make_chain_row_from_map_entry< ::boost::mpl::placeholders::_2> >,
+ // just one row, no chaining, we rebuild the row like it was before
+ ::boost::mpl::push_back< ::boost::mpl::placeholders::_1,
+ get_first_element_pair_second< ::boost::mpl::placeholders::_2> >
+ > >::type chained_rows;
+ // Go back and fill in cells for matching transitions.
+ ::boost::mpl::for_each<chained_rows>(init_cell(this));
+ }
+
+ // The singleton instance.
+ static const dispatch_table instance;
+
+ public: // data members
+ cell entries[max_state];
+};
+
+}}} // boost::msm::back
+
+
+#endif //BOOST_MSM_BACK_DISPATCH_TABLE_H
+

Added: sandbox/msm/boost/msm/back/history_policies.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/back/history_policies.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,163 @@
+// 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_BACK_HISTORY_POLICIES_H
+#define BOOST_MSM_BACK_HISTORY_POLICIES_H
+
+#include <boost/mpl/contains.hpp>
+
+namespace boost { namespace msm { namespace back
+{
+
+// policy classes
+
+// Default: no history used
+template <int NumberOfRegions>
+class NoHistoryImpl
+{
+public:
+ NoHistoryImpl(){}
+ ~NoHistoryImpl(){}
+ void set_initial_states(int* const initial_states)
+ {
+ for (int i=0;i<NumberOfRegions;++i)
+ m_initialStates[i] = initial_states[i];
+ }
+ void history_exit(int* const )
+ {
+ // ignore
+ }
+ // returns the state where the state machine should be at start
+ template <class Event>
+ int* const history_entry(Event const& )
+ {
+ // always come back to the original state
+ return m_initialStates;
+ }
+ NoHistoryImpl<NumberOfRegions>& operator=(NoHistoryImpl<NumberOfRegions> const& rhs)
+ {
+ for (int i=0; i<NumberOfRegions;++i)
+ {
+ m_initialStates[i] = rhs.m_initialStates[i];
+ }
+ return *this;
+ }
+private:
+ int m_initialStates[NumberOfRegions];
+};
+
+// not UML standard. Always activates history, no matter which event generated the transition
+template <int NumberOfRegions>
+class AlwaysHistoryImpl
+{
+public:
+ AlwaysHistoryImpl(){}
+ ~AlwaysHistoryImpl(){}
+ void set_initial_states(int* const initial_states)
+ {
+ for (int i=0;i<NumberOfRegions;++i)
+ m_initialStates[i] = initial_states[i];
+ }
+ void history_exit(int* const current_states)
+ {
+ for (int i=0;i<NumberOfRegions;++i)
+ m_initialStates[i] = current_states[i];
+ }
+ // returns the state where the state machine should be at start
+ template <class Event>
+ int* const history_entry(Event const& )
+ {
+ // always load back the last active state
+ return m_initialStates;
+ }
+ AlwaysHistoryImpl<NumberOfRegions>& operator=(AlwaysHistoryImpl<NumberOfRegions> const& rhs)
+ {
+ for (int i=0; i<NumberOfRegions;++i)
+ {
+ m_initialStates[i] = rhs.m_initialStates[i];
+ }
+ return *this;
+ }
+private:
+ int m_initialStates[NumberOfRegions];
+};
+
+// UML Shallow history. For deep history, just use this policy for all the contained state machines
+template <class Events,int NumberOfRegions>
+class ShallowHistoryImpl
+{
+public:
+ ShallowHistoryImpl(){}
+ ~ShallowHistoryImpl(){}
+ void set_initial_states(int* const initial_states)
+ {
+ for (int i=0;i<NumberOfRegions;++i)
+ {
+ m_currentStates[i] = initial_states[i];
+ m_initialStates[i] = initial_states[i];
+ }
+ }
+ void history_exit(int* const current_states)
+ {
+ for (int i=0;i<NumberOfRegions;++i)
+ m_currentStates[i] = current_states[i];
+ }
+ // returns the state where the state machine should be at start
+ template <class Event>
+ int* const history_entry(Event const&)
+ {
+ if ( ::boost::mpl::contains<Events,Event>::value)
+ {
+ return m_currentStates;
+ }
+ // not one of our events, no history
+ return m_initialStates;
+ }
+ ShallowHistoryImpl<Events,NumberOfRegions>& operator=(ShallowHistoryImpl<Events,NumberOfRegions> const& rhs)
+ {
+ for (int i=0; i<NumberOfRegions;++i)
+ {
+ m_initialStates[i] = rhs.m_initialStates[i];
+ m_currentStates[i] = rhs.m_currentStates[i];
+ }
+ return *this;
+ }
+private:
+ int m_initialStates[NumberOfRegions];
+ int m_currentStates[NumberOfRegions];
+};
+
+struct NoHistory
+{
+ template <int NumberOfRegions>
+ struct apply
+ {
+ typedef NoHistoryImpl<NumberOfRegions> type;
+ };
+};
+struct AlwaysHistory
+{
+ template <int NumberOfRegions>
+ struct apply
+ {
+ typedef AlwaysHistoryImpl<NumberOfRegions> type;
+ };
+};
+template <class Events>
+struct ShallowHistory
+{
+ template <int NumberOfRegions>
+ struct apply
+ {
+ typedef ShallowHistoryImpl<Events,NumberOfRegions> type;
+ };
+};
+} } }//boost::msm::back
+#endif //BOOST_MSM_BACK_HISTORY_POLICIES_H

Added: sandbox/msm/boost/msm/back/metafunctions.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/back/metafunctions.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,625 @@
+// 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_BACK_METAFUNCTIONS_H
+#define BOOST_MSM_BACK_METAFUNCTIONS_H
+
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/pair.hpp>
+#include <boost/mpl/map.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/find.hpp>
+#include <boost/mpl/count_if.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/has_key.hpp>
+#include <boost/mpl/insert.hpp>
+#include <boost/mpl/next_prior.hpp>
+#include <boost/mpl/map.hpp>
+#include <boost/mpl/push_back.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/is_sequence.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/transform.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/empty.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/insert_range.hpp>
+#include <boost/mpl/front.hpp>
+#include <boost/mpl/logical.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace mpl = boost::mpl;
+BOOST_MPL_HAS_XXX_TRAIT_DEF(explicit_creation)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(pseudo_entry)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(pseudo_exit)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(concrete_exit_state)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(composite_tag)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(not_real_row_tag)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(event_blocking_flag)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(explicit_entry_state)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(automatic_event)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(no_exception_thrown)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(no_message_queue)
+
+namespace boost { namespace msm { namespace back
+{
+
+// returns the current state type of a transition
+template <class Transition>
+struct transition_source_type
+{
+ typedef typename Transition::current_state_type type;
+};
+
+// returns the target state type of a transition
+template <class Transition>
+struct transition_target_type
+{
+ typedef typename Transition::next_state_type type;
+};
+
+// helper functions for generate_state_ids
+// create a pair of a state and a passed id for source and target states
+template <class Id,class Transition>
+struct make_pair_source_state_id
+{
+ typedef typename ::boost::mpl::pair<typename Transition::current_state_type,Id> type;
+};
+template <class Id,class Transition>
+struct make_pair_target_state_id
+{
+ typedef typename ::boost::mpl::pair<typename Transition::next_state_type,Id> type;
+};
+
+// iterates through a transition table and automatically generates ids starting at 0
+// first the source states, transition up to down
+// then the target states, up to down
+template <class stt>
+struct generate_state_ids
+{
+ typedef typename
+ ::boost::mpl::fold<
+ stt,::boost::mpl::pair< ::boost::mpl::map< >, ::boost::mpl::int_<0> >,
+ ::boost::mpl::pair<
+ ::boost::mpl::if_<
+ ::boost::mpl::has_key< ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
+ transition_source_type< ::boost::mpl::placeholders::_2> >,
+ ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
+ ::boost::mpl::insert< ::boost::mpl::first<mpl::placeholders::_1>,
+ make_pair_source_state_id< ::boost::mpl::second< ::boost::mpl::placeholders::_1 >,
+ ::boost::mpl::placeholders::_2> >
+ >,
+ ::boost::mpl::if_<
+ ::boost::mpl::has_key< ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
+ transition_source_type< ::boost::mpl::placeholders::_2> >,
+ ::boost::mpl::second< ::boost::mpl::placeholders::_1 >,
+ ::boost::mpl::next< ::boost::mpl::second<mpl::placeholders::_1 > >
+ >
+ > //pair
+ >::type source_state_ids;
+ typedef typename ::boost::mpl::first<source_state_ids>::type source_state_map;
+ typedef typename ::boost::mpl::second<source_state_ids>::type highest_state_id;
+
+
+ typedef typename
+ ::boost::mpl::fold<
+ stt,::boost::mpl::pair<source_state_map,highest_state_id >,
+ ::boost::mpl::pair<
+ ::boost::mpl::if_<
+ ::boost::mpl::has_key< ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
+ transition_target_type< ::boost::mpl::placeholders::_2> >,
+ ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
+ ::boost::mpl::insert< ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
+ make_pair_target_state_id< ::boost::mpl::second< ::boost::mpl::placeholders::_1 >,
+ ::boost::mpl::placeholders::_2> >
+ >,
+ ::boost::mpl::if_<
+ ::boost::mpl::has_key< ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
+ transition_target_type< ::boost::mpl::placeholders::_2> >,
+ ::boost::mpl::second< ::boost::mpl::placeholders::_1 >,
+ ::boost::mpl::next< ::boost::mpl::second< ::boost::mpl::placeholders::_1 > >
+ >
+ > //pair
+ >::type all_state_ids;
+ typedef typename ::boost::mpl::first<all_state_ids>::type type;
+};
+
+// returns the id of a given state
+template <class stt,class State>
+struct get_state_id
+{
+ typedef typename ::boost::mpl::at<typename generate_state_ids<stt>::type,State>::type type;
+ enum {value = type::value};
+};
+
+// returns a mpl::vector containing the init states of a state machine
+template <class States>
+struct get_initial_states
+{
+ typedef typename ::boost::mpl::if_<
+ ::boost::mpl::is_sequence<States>,
+ States,
+ typename ::boost::mpl::push_back< ::boost::mpl::vector0<>,States>::type >::type type;
+};
+
+// returns a mpl::int_ containing the size of a region. If the argument is not a sequence, returns 1
+template <class region>
+struct get_number_of_regions
+{
+ typedef typename mpl::if_<
+ ::boost::mpl::is_sequence<region>,
+ ::boost::mpl::size<region>,
+ ::boost::mpl::int_<1> >::type type;
+};
+
+// builds a mpl::vector of initial states
+template <class region>
+struct get_regions_as_sequence
+{
+ typedef typename ::boost::mpl::if_<
+ ::boost::mpl::is_sequence<region>,
+ region,
+ typename ::boost::mpl::push_back< ::boost::mpl::vector0<>,region>::type >::type type;
+};
+
+template <class ToCreateSeq>
+struct get_explicit_creation_as_sequence
+{
+ typedef typename ::boost::mpl::if_<
+ ::boost::mpl::is_sequence<ToCreateSeq>,
+ ToCreateSeq,
+ typename ::boost::mpl::push_back< ::boost::mpl::vector0<>,ToCreateSeq>::type >::type type;
+};
+
+// returns true if 2 transitions have the same source (used to remove duplicates in search of composite states)
+template <class stt,class Transition1,class Transition2>
+struct have_same_source
+{
+ enum {current_state1 = get_state_id<stt,typename Transition1::current_state_type >::type::value};
+ enum {current_state2 = get_state_id<stt,typename Transition2::current_state_type >::type::value};
+ enum {value = ((int)current_state1 == (int)current_state2) };
+};
+
+
+// A metafunction that returns the Event associated with a transition.
+template <class Transition>
+struct transition_event
+{
+ typedef typename Transition::Event type;
+};
+
+// returns true for composite states
+template <class State>
+struct is_composite_state
+{
+ enum {value = has_composite_tag<State>::type::value};
+ typedef typename has_composite_tag<State>::type type;
+};
+
+// transform a transition table in a container of source states
+template <class stt>
+struct keep_source_names
+{
+ // instead of the rows we want only the names of the states (from source)
+ typedef typename
+ ::boost::mpl::transform<
+ stt,transition_source_type< ::boost::mpl::placeholders::_1> >::type type;
+};
+
+// transform a transition table in a container of target states
+template <class stt>
+struct keep_target_names
+{
+ // instead of the rows we want only the names of the states (from source)
+ typedef typename
+ ::boost::mpl::transform<
+ stt,transition_target_type< ::boost::mpl::placeholders::_1> >::type type;
+};
+
+template <class stt>
+struct generate_state_set
+{
+ // keep in the original transition table only the source/target state types
+ typedef typename keep_source_names<stt>::type sources;
+ typedef typename keep_target_names<stt>::type targets;
+ typedef typename
+ ::boost::mpl::fold<
+ sources, ::boost::mpl::set<>,
+ ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::placeholders::_2>
+ >::type source_set;
+ typedef typename
+ ::boost::mpl::fold<
+ targets,source_set,
+ ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::placeholders::_2>
+ >::type type;
+};
+
+// iterates through the transition table and generate a mpl::set<> containing all the events
+template <class stt>
+struct generate_event_set
+{
+ typedef typename
+ ::boost::mpl::fold<
+ stt, ::boost::mpl::set<>,
+ ::boost::mpl::if_<
+ ::boost::mpl::has_key< ::boost::mpl::placeholders::_1,
+ transition_event< ::boost::mpl::placeholders::_2> >,
+ ::boost::mpl::placeholders::_1,
+ ::boost::mpl::insert< ::boost::mpl::placeholders::_1,
+ transition_event< ::boost::mpl::placeholders::_2> > >
+ >::type type;
+};
+
+// returns a mpl::bool_<true> if State has Event as delayed event
+template <class State, class Event>
+struct has_state_delayed_event
+{
+ typedef typename ::boost::mpl::find<typename State::deferred_events,Event>::type found;
+ typedef typename ::boost::mpl::if_<
+ ::boost::is_same<found,typename ::boost::mpl::end<typename State::deferred_events>::type >,
+ ::boost::mpl::bool_<false>,
+ ::boost::mpl::bool_<true> >::type type;
+};
+// returns a mpl::bool_<true> if State has any delayed event
+template <class State>
+struct has_state_delayed_events
+{
+ typedef typename ::boost::mpl::if_<
+ ::boost::mpl::empty<typename State::deferred_events>,
+ ::boost::mpl::bool_<false>,
+ ::boost::mpl::bool_<true> >::type type;
+};
+
+// Template used to create dummy entries for initial states not found in the stt.
+template< typename T1 >
+struct not_a_row
+{
+ typedef int not_real_row_tag;
+ struct dummy_event
+ {
+ };
+ typedef T1 current_state_type;
+ typedef T1 next_state_type;
+ typedef dummy_event Event;
+};
+
+// metafunctions used to find out if a state is entry, exit or something else
+template <class State>
+struct is_pseudo_entry
+{
+ typedef typename ::boost::mpl::if_< typename has_pseudo_entry<State>::type,
+ ::boost::mpl::bool_<true>,::boost::mpl::bool_<false>
+ >::type type;
+};
+// says if a state is an exit pseudo state
+template <class State>
+struct is_pseudo_exit
+{
+ typedef typename ::boost::mpl::if_< typename has_pseudo_exit<State>::type,
+ ::boost::mpl::bool_<true>, ::boost::mpl::bool_<false>
+ >::type type;
+};
+// says if a state is an exit pseudo state
+template <class State>
+struct is_direct_entry
+{
+ typedef typename ::boost::mpl::if_< typename has_explicit_entry_state<State>::type,
+ ::boost::mpl::bool_<true>, ::boost::mpl::bool_<false>
+ >::type type;
+};
+
+//converts a "fake" (simulated in a state_machine_ description )state into one which will really get created
+template <class StateType,class CompositeType>
+struct convert_fake_state
+{
+ // converts a state (explicit entry) into the state we really are going to create (explicit<>)
+ typedef typename ::boost::mpl::if_<
+ typename is_direct_entry<StateType>::type,
+ typename CompositeType::template direct<StateType>,
+ typename ::boost::mpl::identity<StateType>::type
+ >::type type;
+};
+
+template <class StateType>
+struct get_explicit_creation
+{
+ typedef typename StateType::explicit_creation type;
+};
+
+template <class Derived>
+struct create_stt
+{
+ //typedef typename Derived::transition_table stt;
+ typedef typename Derived::real_transition_table Stt;
+ // get the state set
+ typedef typename generate_state_set<Stt>::type states;
+ // transform the initial region(s) in a sequence
+ typedef typename get_regions_as_sequence<typename Derived::initial_state>::type init_states;
+ // iterate through the initial states and add them in the stt if not already there
+ typedef typename
+ ::boost::mpl::fold<
+ init_states,Stt,
+ ::boost::mpl::if_<
+ ::boost::mpl::has_key<states, ::boost::mpl::placeholders::_2>,
+ ::boost::mpl::placeholders::_1,
+ ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::end<mpl::placeholders::_1>,
+ not_a_row< ::boost::mpl::placeholders::_2 > >
+ >
+ >::type with_init;
+ // do the same for states marked as explicitly created
+ typedef typename get_explicit_creation_as_sequence<
+ typename ::boost::mpl::eval_if<
+ typename has_explicit_creation<Derived>::type,
+ get_explicit_creation<Derived>,
+ ::boost::mpl::vector0<> >::type
+ >::type fake_explicit_created;
+
+ typedef typename
+ ::boost::mpl::transform<
+ fake_explicit_created,convert_fake_state< ::boost::mpl::placeholders::_1,Derived> >::type explicit_created;
+
+ typedef typename
+ ::boost::mpl::fold<
+ explicit_created,with_init,
+ ::boost::mpl::if_<
+ ::boost::mpl::has_key<states, ::boost::mpl::placeholders::_2>,
+ ::boost::mpl::placeholders::_1,
+ ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::end<mpl::placeholders::_1>,
+ not_a_row< ::boost::mpl::placeholders::_2 > >
+ >
+ >::type type;
+};
+
+// returns the transition table of a Composite state
+template <class Composite>
+struct get_transition_table
+{
+ typedef typename create_stt<Composite>::type type;
+};
+// recursively get a transition table for a given composite state.
+// returns the transition table for this state + the tables of all composite sub states recursively
+template <class Composite>
+struct recursive_get_transition_table
+{
+ // get the transition table of the state if it's a state machine
+ typedef typename ::boost::mpl::eval_if<typename is_composite_state<Composite>::type,
+ get_transition_table<Composite>,
+ ::boost::mpl::vector0<> >::type org_table;
+
+ typedef typename generate_state_set<org_table>::type states;
+
+ // and for every substate, recursively get the transition table if it's a state machine
+ typedef typename ::boost::mpl::fold<
+ states,org_table,
+ ::boost::mpl::insert_range< ::boost::mpl::placeholders::_1, ::boost::mpl::end<mpl::placeholders::_1>,
+ recursive_get_transition_table< ::boost::mpl::placeholders::_2 > >
+ >::type type;
+
+};
+
+// metafunction used to say if a SM has pseudo exit states
+template <class Derived>
+struct has_fsm_delayed_events
+{
+ typedef typename create_stt<Derived>::type Stt;
+ typedef typename generate_state_set<Stt>::type state_list;
+
+ typedef ::boost::mpl::bool_< ::boost::mpl::count_if<
+ state_list,has_state_delayed_events< ::boost::mpl::placeholders::_1 > >::value != 0> type;
+};
+
+// returns a mpl::bool_<true> if State has any delayed event
+template <class Event>
+struct is_automatic_event
+{
+ typedef typename ::boost::mpl::if_<
+ has_automatic_event<Event>,
+ ::boost::mpl::bool_<true>,
+ ::boost::mpl::bool_<false> >::type type;
+};
+// metafunction used to say if a SM has eventless transitions
+template <class Derived>
+struct has_fsm_eventless_transition
+{
+ typedef typename create_stt<Derived>::type Stt;
+ typedef typename generate_event_set<Stt>::type event_list;
+
+ typedef ::boost::mpl::bool_< ::boost::mpl::count_if<
+ event_list,is_automatic_event< ::boost::mpl::placeholders::_1 > >::value != 0> type;
+};
+template <class Derived>
+struct find_automatic_events
+{
+ typedef typename create_stt<Derived>::type Stt;
+ typedef typename generate_event_set<Stt>::type event_list;
+
+ typedef typename ::boost::mpl::fold<
+ event_list, ::boost::mpl::set<>,
+ ::boost::mpl::if_<
+ is_automatic_event< ::boost::mpl::placeholders::_2>,
+ ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::placeholders::_2 >,
+ ::boost::mpl::placeholders::_1 >
+ >::type type;
+};
+
+template <class Transition>
+struct make_vector
+{
+ typedef ::boost::mpl::vector<Transition> type;
+};
+template< typename Entry >
+struct get_first_element_pair_second
+{
+ typedef typename ::boost::mpl::front<typename Entry::second>::type type;
+};
+
+ //returns the owner of an explicit_entry state
+ //which is the containing SM if the transition originates from outside the containing SM
+ //or else the explicit_entry state itself
+template <class State,class ContainingSM>
+struct get_owner
+{
+ typedef typename ::boost::mpl::if_<
+ typename ::boost::mpl::not_<typename ::boost::is_same<typename State::owner,
+ ContainingSM >::type>::type,
+ typename State::owner,
+ State >::type type;
+};
+
+template <class Sequence,class ContainingSM>
+struct get_fork_owner
+{
+ typedef typename ::boost::mpl::front<Sequence>::type seq_front;
+ typedef typename ::boost::mpl::if_<
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<typename seq_front::owner,ContainingSM>::type>::type,
+ typename seq_front::owner,
+ seq_front >::type type;
+};
+
+template <class StateType,class ContainingSM>
+struct make_exit
+{
+ typedef typename ::boost::mpl::if_<
+ typename is_pseudo_exit<StateType>::type ,
+ typename ContainingSM::template exit_pt<StateType>,
+ typename ::boost::mpl::identity<StateType>::type
+ >::type type;
+};
+
+template <class StateType,class ContainingSM>
+struct make_entry
+{
+ typedef typename ::boost::mpl::if_<
+ typename is_pseudo_entry<StateType>::type ,
+ typename ContainingSM::template entry_pt<StateType>,
+ typename ::boost::mpl::if_<
+ typename is_direct_entry<StateType>::type,
+ typename ContainingSM::template direct<StateType>,
+ typename ::boost::mpl::identity<StateType>::type
+ >::type
+ >::type type;
+};
+// metafunction used to say if a SM has pseudo exit states
+template <class StateType>
+struct has_exit_pseudo_states_helper
+{
+ typedef typename StateType::stt Stt;
+ typedef typename generate_state_set<Stt>::type state_list;
+
+ typedef ::boost::mpl::bool_< ::boost::mpl::count_if<
+ state_list,is_pseudo_exit< ::boost::mpl::placeholders::_1> >::value != 0> type;
+};
+template <class StateType>
+struct has_exit_pseudo_states
+{
+ typedef typename ::boost::mpl::eval_if<typename is_composite_state<StateType>::type,
+ has_exit_pseudo_states_helper<StateType>,
+ ::boost::mpl::bool_<false> >::type type;
+};
+
+template <class StateType>
+struct is_state_blocking
+{
+ typedef typename ::boost::mpl::fold<
+ typename StateType::flag_list, ::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 >,
+ ::boost::mpl::placeholders::_1 >
+ >::type blocking_flags;
+
+ typedef typename ::boost::mpl::if_<
+ ::boost::mpl::empty<blocking_flags>,
+ ::boost::mpl::bool_<false>,
+ ::boost::mpl::bool_<true> >::type type;
+};
+// returns a mpl::bool_<true> if fsm has an event blocking flag in one of its substates
+template <class StateType>
+struct has_fsm_blocking_states
+{
+ typedef typename create_stt<StateType>::type Stt;
+ typedef typename generate_state_set<Stt>::type state_list;
+
+ typedef typename ::boost::mpl::fold<
+ state_list, ::boost::mpl::set<>,
+ ::boost::mpl::if_<
+ is_state_blocking< ::boost::mpl::placeholders::_2>,
+ ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::placeholders::_2 >,
+ ::boost::mpl::placeholders::_1 >
+ >::type blocking_states;
+
+ typedef typename ::boost::mpl::if_<
+ ::boost::mpl::empty<blocking_states>,
+ ::boost::mpl::bool_<false>,
+ ::boost::mpl::bool_<true> >::type type;
+};
+
+template <class StateType>
+struct is_no_exception_thrown
+{
+ typedef ::boost::mpl::bool_< ::boost::mpl::count_if<
+ typename StateType::configuration,
+ has_no_exception_thrown< ::boost::mpl::placeholders::_1 > >::value != 0> found;
+
+ typedef typename ::boost::mpl::or_<
+ typename has_no_exception_thrown<StateType>::type,
+ found
+ >::type type;
+};
+
+template <class StateType>
+struct is_no_message_queue
+{
+ typedef ::boost::mpl::bool_< ::boost::mpl::count_if<
+ typename StateType::configuration,
+ has_no_message_queue< ::boost::mpl::placeholders::_1 > >::value != 0> found;
+
+ typedef typename ::boost::mpl::or_<
+ typename has_no_message_queue<StateType>::type,
+ found
+ >::type type;
+};
+
+// helper to find out if a SM has an active exit state and is therefore waiting for exiting
+template <class StateType,class OwnerFct,class FSM>
+inline
+typename ::boost::enable_if<typename ::boost::mpl::and_<typename is_composite_state<FSM>::type,
+ typename is_pseudo_exit<StateType>::type>,bool >::type
+is_exit_state_active(FSM& fsm)
+{
+ typedef typename OwnerFct::type Composite;
+ //typedef typename create_stt<Composite>::type stt;
+ typedef typename Composite::stt stt;
+ int state_id = get_state_id<stt,StateType>::type::value;
+ Composite& comp = fsm.template get_state<Composite&>();
+ return (std::find(comp.current_state(),comp.current_state()+Composite::nr_regions::value,state_id)
+ !=comp.current_state()+Composite::nr_regions::value);
+}
+template <class StateType,class OwnerFct,class FSM>
+inline
+typename ::boost::disable_if<typename ::boost::mpl::and_<typename is_composite_state<FSM>::type,
+ typename is_pseudo_exit<StateType>::type>,bool >::type
+is_exit_state_active(FSM& fsm)
+{
+ return false;
+}
+
+} } }//boost::msm::back
+
+#endif // BOOST_MSM_BACK_METAFUNCTIONS_H
+

Added: sandbox/msm/boost/msm/back/state_machine.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/back/state_machine.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,1712 @@
+// 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_BACK_STATEMACHINE_H
+#define BOOST_MSM_BACK_STATEMACHINE_H
+
+#include <vector>
+#include <queue>
+#include <functional>
+#include <numeric>
+#include <utility>
+
+#include <boost/mpl/contains.hpp>
+#include <boost/mpl/deref.hpp>
+
+#include <boost/fusion/container/vector/convert.hpp>
+#include <boost/fusion/include/as_vector.hpp>
+#include <boost/fusion/include/as_set.hpp>
+#include <boost/fusion/container/set.hpp>
+#include <boost/fusion/include/set.hpp>
+#include <boost/fusion/include/set_fwd.hpp>
+#include <boost/fusion/include/mpl.hpp>
+#include <boost/fusion/sequence/intrinsic/at_key.hpp>
+#include <boost/fusion/include/at_key.hpp>
+#include <boost/fusion/algorithm/iteration/for_each.hpp>
+#include <boost/fusion/include/for_each.hpp>
+
+#include <boost/assert.hpp>
+#include <boost/ref.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+#include <boost/bind.hpp>
+#include <boost/bind/apply.hpp>
+#include <boost/function.hpp>
+
+#include <boost/msm/row_tags.hpp>
+#include <boost/msm/back/metafunctions.hpp>
+#include <boost/msm/back/history_policies.hpp>
+#include <boost/msm/back/bind_helpers.hpp>
+#include <boost/msm/back/common_types.hpp>
+#include <boost/msm/back/args.hpp>
+#include <boost/msm/back/dispatch_table.hpp>
+
+BOOST_MPL_HAS_XXX_TRAIT_DEF(accept_sig)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(no_automatic_create)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(non_forwarding_flag)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(direct_entry)
+
+namespace boost { namespace msm { namespace back
+{
+// event used internally for wrapping a direct entry
+template <class StateType,class Event>
+struct direct_entry_event
+{
+ typedef int direct_entry;
+ typedef StateType active_state;
+
+ direct_entry_event(Event const& evt):m_event(evt){}
+ Event const& m_event;
+};
+
+// This declares the statically-initialized dispatch_table instance.
+template <class Fsm,class Stt, class Event>
+const boost::msm::back::dispatch_table<Fsm,Stt, Event>
+dispatch_table<Fsm,Stt, Event>::instance;
+
+// library-containing class for state machines. Pass the actual FSM class as
+// the Concrete parameter.
+template<class Derived,class HistoryPolicy=NoHistory
+#ifdef BOOST_MSVC
+,class WorkaroundVC9=void
+#endif
+>
+class state_machine : public Derived
+{
+private:
+ typedef boost::msm::back::state_machine<Derived,
+ HistoryPolicy
+#ifdef BOOST_MSVC
+ ,WorkaroundVC9
+#endif
+ > library_sm;
+
+ typedef ::boost::function<
+ execute_return ()> transition_fct;
+ typedef ::boost::function<
+ execute_return () > deferred_fct;
+ typedef std::queue<deferred_fct > deferred_events_queue_t;
+ typedef std::queue<transition_fct > events_queue_t;
+ typedef bool (*flag_handler)(library_sm&);
+
+ // all state machines are friend with each other to allow embedding any of them in another fsm
+ template <class ,class
+#ifdef BOOST_MSVC
+ ,class
+#endif
+ > friend class boost::msm::back::state_machine;
+
+ // helper to add, if needed, visitors to all states
+ // version without visitors
+ template <class StateType,class Enable=void>
+ struct visitor_fct_helper
+ {
+ public:
+ visitor_fct_helper(){}
+ void fill_visitors(int)
+ {
+ }
+ template <class FCT>
+ void insert(int,FCT)
+ {
+ }
+ template <class VISITOR>
+ void execute(int,VISITOR)
+ {
+ }
+ };
+ // version with visitors
+ template <class StateType>
+ struct visitor_fct_helper<StateType,typename ::boost::enable_if<has_accept_sig<StateType> >::type>
+ {
+ public:
+ visitor_fct_helper():m_state_visitors(){}
+ void fill_visitors(int number_of_states)
+ {
+ m_state_visitors.resize(number_of_states);
+ }
+ template <class FCT>
+ void insert(int index,FCT fct)
+ {
+ m_state_visitors[index]=fct;
+ }
+ void execute(int index)
+ {
+ m_state_visitors[index]();
+ }
+
+#define MSM_VISITOR_HELPER_EXECUTE_SUB(z, n, unused) ARG ## n vis ## n
+#define MSM_VISITOR_HELPER_EXECUTE(z, n, unused) \
+ template <BOOST_PP_ENUM_PARAMS(n, class ARG)> \
+ void execute(int index BOOST_PP_COMMA_IF(n) \
+ BOOST_PP_ENUM(n, MSM_VISITOR_HELPER_EXECUTE_SUB, ~ ) ) \
+ { \
+ m_state_visitors[index](BOOST_PP_ENUM_PARAMS(n,vis)); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_VISITOR_HELPER_EXECUTE, ~)
+#undef MSM_VISITOR_HELPER_EXECUTE
+#undef MSM_VISITOR_HELPER_EXECUTE_SUB
+ private:
+ typedef typename StateType::accept_sig::type visitor_fct;
+ typedef std::vector<visitor_fct> visitors;
+
+ visitors m_state_visitors;
+ };
+
+ public:
+ // tags
+ typedef int composite_tag;
+
+ // in case someone needs to know
+ typedef HistoryPolicy history_policy;
+
+ struct InitEvent { };
+ // flag handling
+ struct Flag_AND
+ {
+ typedef std::logical_and<bool> type;
+ };
+ struct Flag_OR
+ {
+ typedef std::logical_or<bool> type;
+ };
+ typedef typename Derived::BaseAllStates BaseState;
+ typedef Derived ConcreteSM;
+
+ template <class ExitPoint>
+ struct exit_pt : public ExitPoint
+ {
+ // tags
+ typedef ExitPoint wrapped_exit;
+ typedef int pseudo_exit;
+ typedef library_sm owner;
+ typedef int no_automatic_create;
+ typedef typename
+ ExitPoint::event Event;
+ typedef ::boost::function<execute_return (Event const&)>
+ forwarding_function;
+ // forward event to the higher-level FSM
+ template <class ForwardEvent>
+ void forward_event(ForwardEvent const& incomingEvent)
+ {
+ // use helper to forward or not
+ ForwardHelper< ::boost::is_convertible<ForwardEvent,Event>::value>::helper(incomingEvent,m_forward);
+ }
+ void set_forward_fct(::boost::function<execute_return (Event const&)> fct)
+ {
+ m_forward = fct;
+ }
+ exit_pt():m_forward(){}
+ // by assignments, we keep our forwarding functor unchanged as our containing SM did not change
+ template <class RHS>
+ exit_pt(RHS& rhs):m_forward(){}
+ exit_pt<ExitPoint>& operator= (const exit_pt<ExitPoint>& )
+ {
+ return *this;
+ }
+ private:
+ forwarding_function m_forward;
+
+ // using partial specialization instead of enable_if because of VC8 bug
+ template <bool OwnEvent, int Dummy=0>
+ struct ForwardHelper
+ {
+ template <class ForwardEvent>
+ static void helper(ForwardEvent const& ,forwarding_function& )
+ {
+ // Not our event, ignore
+ }
+ };
+ template <int Dummy>
+ struct ForwardHelper<true,Dummy>
+ {
+ template <class ForwardEvent>
+ static void helper(ForwardEvent const& incomingEvent,forwarding_function& forward_fct)
+ {
+ // call if handler set, if not, this state is simply a terminate state
+ if (forward_fct)
+ forward_fct(incomingEvent);
+ }
+ };
+
+ };
+ template <class EntryPoint>
+ struct entry_pt : public EntryPoint
+ {
+ // tags
+ typedef EntryPoint wrapped_exit;
+ typedef int pseudo_entry;
+ typedef library_sm owner;
+ typedef int no_automatic_create;
+ };
+ template <class EntryPoint>
+ struct direct : public EntryPoint
+ {
+ // tags
+ typedef EntryPoint wrapped_entry;
+ typedef int explicit_entry_state;
+ typedef library_sm owner;
+ typedef int no_automatic_create;
+ };
+ typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
+ // Template used to form rows in the transition table
+ template<
+ typename ROW
+ >
+ struct row_
+ {
+ //typedef typename ROW::Source T1;
+ typedef typename make_entry<typename ROW::Source,library_sm>::type T1;
+ typedef typename make_exit<typename ROW::Target,library_sm>::type T2;
+ typedef typename ROW::Evt Event;
+ // if the source has no automatic creation (i.e. is an exit pseudo state), then
+ // current_state_type becomes the result of get_owner
+ // meaning the containing SM from which the exit occurs
+ typedef typename ::boost::mpl::eval_if<
+ typename has_no_automatic_create<T1>::type,
+ get_owner<T1,library_sm>,
+ ::boost::mpl::identity<T1> >::type current_state_type;
+
+ // if Target is a sequence, then we have a fork and expect a sequence of explicit_entry
+ // else if Target is an explicit_entry, next_state_type becomes the result of get_owner
+ // meaning the containing SM if the row is "outside" the containing SM or else the explicit_entry state itself
+ typedef typename ::boost::mpl::eval_if<
+ typename ::boost::mpl::is_sequence<T2>::type,
+ get_fork_owner<T2,library_sm>,
+ ::boost::mpl::eval_if<
+ typename has_no_automatic_create<T2>::type,
+ get_owner<T2,library_sm>,
+ ::boost::mpl::identity<T2> >
+ >::type 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 std::pair<int,HandledEnum> execute(library_sm& fsm, 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 T1 is an exit pseudo state, then take the transition only if the pseudo exit state is active
+ 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);
+ }
+ if (!check_guard(fsm,evt))
+ {
+ // guard rejected the event, we stay in the current one
+ return std::make_pair(current_state,HANDLED_GUARD_REJECT);
+ }
+
+ // the guard condition has already been checked
+ execute_exit<current_state_type>
+ (::boost::fusion::at_key<current_state_type>(fsm.m_substate_list),evt,fsm);
+
+ // then 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) );
+
+ // 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);
+ }
+ };
+
+ // row having only a guard condition
+ template<
+ typename ROW
+ >
+ struct g_row_
+ {
+ //typedef typename ROW::Source T1;
+ typedef typename make_entry<typename ROW::Source,library_sm>::type T1;
+ typedef typename make_exit<typename ROW::Target,library_sm>::type T2;
+ typedef typename ROW::Evt Event;
+ // if the source has no automatic creation (i.e. is an exit pseudo state), then
+ // current_state_type becomes the result of get_owner
+ // meaning the containing SM from which the exit occurs
+ typedef typename ::boost::mpl::eval_if<
+ typename has_no_automatic_create<T1>::type,
+ get_owner<T1,library_sm>,
+ ::boost::mpl::identity<T1> >::type current_state_type;
+
+ // if Target is a sequence, then we have a fork and expect a sequence of explicit_entry
+ // else if Target is an explicit_entry, next_state_type becomes the result of get_owner
+ // meaning the containing SM if the row is "outside" the containing SM or else the explicit_entry state itself
+ typedef typename ::boost::mpl::eval_if<
+ typename ::boost::mpl::is_sequence<T2>::type,
+ get_fork_owner<T2,library_sm>,
+ ::boost::mpl::eval_if<
+ typename has_no_automatic_create<T2>::type,
+ get_owner<T2,library_sm>,
+ ::boost::mpl::identity<T2> >
+ >::type 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 std::pair<int,HandledEnum> execute(library_sm& fsm, 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 T1 is an exit pseudo state, then take the transition only if the pseudo exit state is active
+ 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);
+ }
+ if (!check_guard(fsm,evt))
+ {
+ // guard rejected the event, we stay in the current one
+ return std::make_pair(current_state,HANDLED_GUARD_REJECT);
+ }
+ // the guard condition has already been checked
+ execute_exit<current_state_type>
+ (::boost::fusion::at_key<current_state_type>(fsm.m_substate_list),evt,fsm);
+
+ // 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);
+ }
+ };
+
+ // row having only an action method
+ template<
+ typename ROW
+ >
+ struct a_row_
+ {
+ //typedef typename ROW::Source T1;
+ typedef typename make_entry<typename ROW::Source,library_sm>::type T1;
+ typedef typename make_exit<typename ROW::Target,library_sm>::type T2;
+ typedef typename ROW::Evt Event;
+ // if the source has no automatic creation (i.e. is an exit pseudo state), then
+ // current_state_type becomes the result of get_owner
+ // meaning the containing SM from which the exit occurs
+ typedef typename ::boost::mpl::eval_if<
+ typename has_no_automatic_create<T1>::type,
+ get_owner<T1,library_sm>,
+ ::boost::mpl::identity<T1> >::type current_state_type;
+
+ // if Target is a sequence, then we have a fork and expect a sequence of explicit_entry
+ // else if Target is an explicit_entry, next_state_type becomes the result of get_owner
+ // meaning the containing SM if the row is "outside" the containing SM or else the explicit_entry state itself
+ typedef typename ::boost::mpl::eval_if<
+ typename ::boost::mpl::is_sequence<T2>::type,
+ get_fork_owner<T2,library_sm>,
+ ::boost::mpl::eval_if<
+ typename has_no_automatic_create<T2>::type,
+ get_owner<T2,library_sm>,
+ ::boost::mpl::identity<T2> >
+ >::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)
+ {
+ 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 T1 is an exit pseudo state, then take the transition only if the pseudo exit state is active
+ 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);
+ }
+ // no need to check the guard condition
+ // first call the exit method of the current state
+ execute_exit<current_state_type>
+ (::boost::fusion::at_key<current_state_type>(fsm.m_substate_list),evt,fsm);
+
+ // then 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) );
+
+ // 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);
+ }
+ };
+
+ // row having no guard condition or action, simply transitions
+ template<
+ typename ROW
+ >
+ struct _row_
+ {
+ //typedef typename ROW::Source T1;
+ typedef typename make_entry<typename ROW::Source,library_sm>::type T1;
+ typedef typename make_exit<typename ROW::Target,library_sm>::type T2;
+ typedef typename ROW::Evt Event;
+ // if the source has no automatic creation (i.e. is an exit pseudo state), then
+ // current_state_type becomes the result of get_owner
+ // meaning the containing SM from which the exit occurs
+ typedef typename ::boost::mpl::eval_if<
+ typename has_no_automatic_create<T1>::type,
+ get_owner<T1,library_sm>,
+ ::boost::mpl::identity<T1> >::type current_state_type;
+
+ // if Target is a sequence, then we have a fork and expect a sequence of explicit_entry
+ // else if Target is an explicit_entry, next_state_type becomes the result of get_owner
+ // meaning the containing SM if the row is "outside" the containing SM or else the explicit_entry state itself
+ typedef typename ::boost::mpl::eval_if<
+ typename ::boost::mpl::is_sequence<T2>::type,
+ get_fork_owner<T2,library_sm>,
+ ::boost::mpl::eval_if<
+ typename has_no_automatic_create<T2>::type,
+ get_owner<T2,library_sm>,
+ ::boost::mpl::identity<T2> >
+ >::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)
+ {
+ 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 T1 is an exit pseudo state, then take the transition only if the pseudo exit state is active
+ 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);
+ }
+ // first call the exit method of the current state
+ execute_exit<current_state_type>
+ (::boost::fusion::at_key<current_state_type>(fsm.m_substate_list),evt,fsm);
+
+ // 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);
+ }
+ };
+
+ // Template used to form forwarding rows in the transition table for every row of a composite SM
+ template<
+ typename T1
+ , class Evt
+ >
+ struct frow
+ {
+ typedef T1 current_state_type;
+ typedef T1 next_state_type;
+ 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)
+ {
+ 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);
+ }
+ };
+ template <class Composite,class Event>
+ struct make_frow
+ {
+ typedef frow<Composite,Event> type;
+ };
+
+ template <class Tag, class Transition,int Dummy=0>
+ struct create_backend_stt
+ {
+ };
+ template <class Transition,int Dummy>
+ struct create_backend_stt<g_row_tag,Transition,Dummy>
+ {
+ typedef g_row_<Transition> type;
+ };
+ template <class Transition,int Dummy>
+ struct create_backend_stt<a_row_tag,Transition,Dummy>
+ {
+ typedef a_row_<Transition> type;
+ };
+ template <class Transition,int Dummy>
+ struct create_backend_stt<_row_tag,Transition,Dummy>
+ {
+ typedef _row_<Transition> type;
+ };
+ template <class Transition,int Dummy>
+ struct create_backend_stt<row_tag,Transition,Dummy>
+ {
+ typedef row_<Transition> type;
+ };
+ template <class Transition>
+ struct make_row_tag
+ {
+ typedef typename create_backend_stt<typename Transition::row_type_tag,Transition>::type type;
+ };
+
+ // add to the stt the initial states which could be missing (if not being involved in a transition)
+ template <class BaseType>
+ struct create_real_stt
+ {
+ typedef typename BaseType::transition_table stt_simulated;
+ typedef typename ::boost::mpl::fold<
+ stt_simulated,mpl::vector0<>,
+ ::boost::mpl::push_back< ::boost::mpl::placeholders::_1,
+ make_row_tag< ::boost::mpl::placeholders::_2> >
+ >::type type;
+ };
+
+ // gets the transition table from a composite and make from it a forwarding row
+ template <class Composite>
+ struct get_transition_table_as_frow
+ {
+ // first get the table of a composite
+ typedef typename recursive_get_transition_table<Composite>::type original_table;
+ // and add for every event a forwarding row
+ typedef typename generate_event_set<original_table>::type all_events;
+ typedef typename ::boost::mpl::fold<
+ all_events, ::boost::mpl::vector0<>,
+ ::boost::mpl::push_back< ::boost::mpl::placeholders::_1,
+ frow<Composite, ::boost::mpl::placeholders::_2> > >::type type;
+ };
+ typedef typename create_real_stt<Derived>::type real_transition_table;
+ typedef typename create_stt<library_sm>::type stt;
+ typedef typename get_initial_states<typename Derived::initial_state>::type initial_states;
+ typedef typename generate_state_set<stt>::type state_list;
+ typedef typename HistoryPolicy::template apply<nr_regions::value>::type concrete_history;
+
+ typedef typename ::boost::fusion::result_of::as_set<state_list>::type substate_list;
+
+ // extends the transition table with rows from composite states
+ template <class Composite>
+ struct extend_table
+ {
+ // add the init states
+ //typedef typename create_stt<Composite>::type stt;
+ typedef typename Composite::stt Stt;
+ // for every state, add its transition table (if any)
+ // transformed as frow
+ typedef typename ::boost::mpl::fold<state_list,Stt,
+ ::boost::mpl::insert_range< ::boost::mpl::placeholders::_1,
+ ::boost::mpl::end< ::boost::mpl::placeholders::_1>,
+ get_transition_table_as_frow< ::boost::mpl::placeholders::_2> >
+ >::type type;
+ };
+ // extend the table with tables from composite states
+ typedef typename extend_table<library_sm>::type complete_table;
+ // build a sequence of regions
+ typedef typename get_regions_as_sequence<typename Derived::initial_state>::type seq_initial_states;
+ // Member functions
+
+ // start the state machine (calls entry of the initial state)
+ void start()
+ {
+ // 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> >
+ (call_init<InitEvent>(InitEvent(),this));
+ // give a chance to handle an anonymous (eventless) transition
+ handle_eventless_transitions_helper<library_sm> eventless_helper(this,true);
+ eventless_helper.process_automatic_event();
+
+ }
+
+ // 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>
+ execute_return process_event(Event const& evt)
+ {
+ // use this table as if it came directly from the user
+ typedef dispatch_table<library_sm,complete_table,Event> table;
+
+ 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>())
+ 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))
+ {
+ // 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
+ bool handled = this->do_process_helper<library_sm,Event>(evt);
+ if (handled)
+ {
+ ret_handled = HANDLED_TRUE;
+ }
+ // after handling, take care of the deferred events
+ defer_helper.do_post_handle_deferred();
+
+ // 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>();
+
+ // event can be handled, processing
+ // handle with lowest priority event-less transitions
+ handle_eventless_transitions_helper<library_sm> eventless_helper(this,handled);
+ eventless_helper.process_automatic_event();
+
+ return ret_handled;
+ }
+ }
+
+ // Getter that returns the current state of the FSM
+ const int* current_state() const
+ {
+ return this->m_states;
+ }
+
+ // linearly search for the state with the given id
+ struct get_state_id_helper
+ {
+ get_state_id_helper(int id,const BaseState** res,const library_sm* self_):
+ result_state(res),searched_id(id),self(self_) {}
+
+ template <class StateType>
+ void operator()(boost::msm::back::wrap<StateType> const&)
+ {
+ // look for the state id until found
+ BOOST_STATIC_CONSTANT(int, id = (get_state_id<stt,StateType>::value));
+ if (!*result_state && (id == searched_id))
+ {
+ *result_state = &::boost::fusion::at_key<StateType>(self->m_substate_list);
+ }
+ }
+ const BaseState** result_state;
+ int searched_id;
+ const library_sm* self;
+ };
+ // return the state whose id is passed or 0 if not found
+ // caution if you need this, you probably need polymorphic states
+ // complexity: O(number of states)
+ const BaseState* get_state_by_id(int id) const
+ {
+ 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));
+ return result_state;
+ }
+ // true if the sm is used in another sm
+ bool is_contained() const
+ {
+ return m_is_included;
+ }
+ // get a state
+ // as a pointer
+ template <class State>
+ typename ::boost::enable_if<typename ::boost::is_pointer<State>::type,State >::type
+ get_state(::boost::msm::back::dummy<0> = 0)
+ {
+ return &(static_cast<typename boost::add_reference<typename ::boost::remove_pointer<State>::type>::type >
+ (::boost::fusion::at_key<typename ::boost::remove_pointer<State>::type>(m_substate_list)));
+ }
+ // as a reference
+ template <class State>
+ typename ::boost::enable_if<typename ::boost::is_reference<State>::type,State >::type
+ get_state(::boost::msm::back::dummy<1> = 0)
+ {
+ return ::boost::fusion::at_key<typename ::boost::remove_reference<State>::type>(m_substate_list);
+ }
+
+ // checks if a flag is active using the BinaryOp as folding function
+ template <class Flag,class BinaryOp>
+ bool is_flag_active()
+ {
+ flag_handler* flags_entries = get_entries_for_flag<Flag>();
+
+ return std::accumulate(m_states,
+ m_states+nr_regions::value,false,
+ ::boost::bind(typename BinaryOp::type(),
+ ::boost::bind(::boost::apply<bool>(),
+ ::boost::bind(::boost::msm::back::deref<flag_handler>(),
+ ::boost::bind(::boost::msm::back::plus2<flag_handler*,int>(),
+ flags_entries, _2)),
+ ::boost::ref(*this)), _1));
+ }
+ // checks if a flag is active using no binary op if 1 region, or OR if > 1 regions
+ template <class Flag>
+ bool is_flag_active()
+ {
+ return FlagHelper<Flag,(nr_regions::value>1)>::helper(*this,get_entries_for_flag<Flag>());
+ }
+ // visit the currently active states (if these are defined as visitable
+ // by implementing accept)
+ void visit_current_states()
+ {
+ for (int i=0; i<nr_regions::value;++i)
+ {
+ m_visitors.execute(m_states[i]);
+ }
+ }
+#define MSM_VISIT_STATE_SUB(z, n, unused) ARG ## n vis ## n
+#define MSM_VISIT_STATE_EXECUTE(z, n, unused) \
+ template <BOOST_PP_ENUM_PARAMS(n, class ARG)> \
+ void visit_current_states(BOOST_PP_ENUM(n, MSM_VISIT_STATE_SUB, ~ ) ) \
+ { \
+ for (int i=0; i<nr_regions::value;++i) \
+ { \
+ m_visitors.execute(m_states[i],BOOST_PP_ENUM_PARAMS(n,vis)); \
+ } \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_VISIT_STATE_EXECUTE, ~)
+#undef MSM_VISIT_STATE_EXECUTE
+#undef MSM_VISIT_STATE_SUB
+
+ protected: // interface for the derived class
+
+ // helper used to fill the initial states
+ struct init_states
+ {
+ init_states(int* const init):m_initial_states(init),m_index(-1){}
+
+ // History initializer function object, used with mpl::for_each
+ template <class State>
+ void operator()(::boost::msm::back::wrap<State> const&)
+ {
+ m_initial_states[++m_index]=get_state_id<stt,State>::type::value;
+ }
+ int* const m_initial_states;
+ int m_index;
+ };
+ public:
+ // Construct with the default initial states
+ state_machine<Derived,HistoryPolicy
+#ifdef BOOST_MSVC
+ ,WorkaroundVC9
+#endif
+ >()
+ :Derived()
+ ,m_events_queue()
+ ,m_deferred_events_queue()
+ ,m_history()
+ ,m_event_processing(false)
+ ,m_is_included(false)
+ ,m_visitors()
+ ,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> >
+ (init_states(m_states));
+ m_history.set_initial_states(m_states);
+ // create states
+ fill_states(this);
+ }
+
+ // assignment operator using the copy policy to decide if non_copyable, shallow or deep copying is necessary
+ library_sm& operator= (library_sm const& rhs)
+ {
+ if (this != &rhs)
+ {
+ Derived::operator=(rhs);
+ // initialize our list of states with the ones defined in Derived::initial_state
+ fill_states(this);
+ do_copy(rhs);
+ }
+ return *this;
+ }
+ state_machine<Derived,HistoryPolicy
+#ifdef BOOST_MSVC
+ ,WorkaroundVC9
+#endif
+ >
+ (library_sm const& rhs)
+ : Derived(rhs)
+ {
+ if (this != &rhs)
+ {
+ // initialize our list of states with the ones defined in Derived::initial_state
+ fill_states(this);
+ do_copy(rhs);
+ }
+ }
+
+ // 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)
+ {
+ // if the state machine is terminated, do not handle any event
+ if (is_flag_active< ::boost::msm::TerminateFlag>())
+ return true;
+ // if the state machine is interrupted, do not handle any event
+ // unless the event is the end interrupt event
+ if ( is_flag_active< ::boost::msm::InterruptedFlag>() &&
+ !is_flag_active< ::boost::msm::EndInterruptFlag<Event> >())
+ return true;
+ 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)
+ {
+ // 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)
+ {
+ // 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)
+ {
+ execute_return (library_sm::*pf) (EventType const& evt) =
+ &library_sm::process_event;
+ // if we are already processing an event
+ if (m_event_processing)
+ {
+ // event has to be put into the queue
+ transition_fct f = ::boost::bind(pf,this,evt);
+ 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)
+ {
+ // 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)
+ {
+ m_event_processing = false;
+ process_message_queue();
+ }
+ // 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,bool >::type
+ do_process_helper(EventType const& evt, ::boost::msm::back::dummy<0> = 0)
+ {
+ return this->do_process_event(evt);
+ }
+ template <class StateType,class EventType>
+ typename ::boost::disable_if<typename is_no_exception_thrown<StateType>::type,bool >::type
+ do_process_helper(EventType const& evt, ::boost::msm::back::dummy<1> = 0)
+ {
+ try
+ {
+ return this->do_process_event(evt);
+ }
+ catch (std::exception& e)
+ {
+ // give a chance to the concrete state machine to handle
+ this->exception_caught(evt,*this,e);
+ }
+ return false;
+ }
+ // handling of deferred events
+ // if none is found in the SM, take the following empty main version
+ template <class StateType, class Enable = void>
+ struct handle_defer_helper
+ {
+ handle_defer_helper(deferred_events_queue_t& ){}
+ void do_pre_handle_deferred()
+ {
+ }
+
+ void do_post_handle_deferred()
+ {
+ }
+ };
+ // otherwise the standard version handling the deferred events
+ template <class StateType>
+ 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(){}
+ void do_pre_handle_deferred()
+ {
+ if (!events_queue.empty())
+ {
+ next_deferred_event = events_queue.front();
+ events_queue.pop();
+ }
+ }
+
+ void do_post_handle_deferred()
+ {
+ if (next_deferred_event)
+ {
+ next_deferred_event();
+ }
+ }
+
+ private:
+ deferred_events_queue_t& events_queue;
+ deferred_fct next_deferred_event;
+ };
+
+ // handling of eventless transitions
+ // if none is found in the SM, nothing to do
+ template <class StateType, class Enable = void>
+ struct handle_eventless_transitions_helper
+ {
+ handle_eventless_transitions_helper(library_sm* , bool ){}
+ void process_automatic_event(){}
+ };
+ // otherwise
+ template <class StateType>
+ struct handle_eventless_transitions_helper
+ <StateType, typename enable_if< typename ::boost::msm::back::has_fsm_eventless_transition<StateType>::type >::type>
+ {
+ handle_eventless_transitions_helper(library_sm* self_, bool handled_):self(self_),handled(handled_){}
+ void process_automatic_event()
+ {
+ typedef typename ::boost::mpl::deref<
+ typename ::boost::mpl::begin<
+ typename find_automatic_events<StateType>::type
+ >::type
+ >::type first_automatic_event;
+ if (handled)
+ {
+ self->process_event(first_automatic_event() );
+ }
+ }
+
+ private:
+ library_sm* self;
+ bool handled;
+ };
+
+ // minimum event processing without exceptions, queues, etc.
+ template<class Event>
+ bool do_process_event(Event const& evt)
+ {
+ // use this table as if it came directly from the user
+ typedef dispatch_table<library_sm,complete_table,Event> table;
+
+ bool 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 = (handled || res.second);
+ }
+ // 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
+ // automatic events do not produce an error
+ if (!handled && !is_contained() && !is_automatic_event<Event>::type::value)
+ {
+ for (int i=0; i<nr_regions::value;++i)
+ {
+ no_transition(evt,*this,this->m_states[i]);
+ }
+ }
+ return handled;
+ }
+
+ // default row arguments for the compilers which accept this
+ template <class Event>
+ bool no_guard(Event const&){return true;}
+ template <class Event>
+ void no_action(Event const&){}
+
+
+private:
+ // composite accept implementation. First calls accept on the composite, then accept on all its active states.
+ void composite_accept()
+ {
+ this->accept();
+ this->visit_current_states();
+ }
+
+#define MSM_COMPOSITE_ACCEPT_SUB(z, n, unused) ARG ## n 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)); \
+ }
+ 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
+
+ // helper used to call the init states at the start of the state machine
+ template <class Event>
+ struct call_init
+ {
+ 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&)
+ {
+ execute_entry(::boost::fusion::at_key<State>(self->m_substate_list),evt,*self);
+ }
+ private:
+ Event const& evt;
+ library_sm* self;
+ };
+ // helper for flag handling. Uses OR by default on orthogonal zones.
+ template <class Flag,bool orthogonalStates>
+ struct FlagHelper
+ {
+ static bool helper(library_sm& sm,flag_handler* )
+ {
+ // by default we use OR to accumulate the flags
+ return sm.is_flag_active<Flag,Flag_OR>();
+ }
+ };
+ template <class Flag>
+ struct FlagHelper<Flag,false>
+ {
+ static bool helper(library_sm& sm,flag_handler* flags_entries)
+ {
+ // just one active state, so we can call operator[] with 0
+ return flags_entries[sm.current_state()[0]](sm);
+ }
+ };
+ // handling of flag
+ // defines a true and false functions plus a forwarding one for composite states
+ template <class StateType,class Flag>
+ struct FlagHandler
+ {
+ static bool flag_true(library_sm& )
+ {
+ return true;
+ }
+ static bool flag_false(library_sm& )
+ {
+ return false;
+ }
+ static bool forward(library_sm& fsm)
+ {
+ return ::boost::fusion::at_key<StateType>(fsm.m_substate_list).is_flag_active<Flag>();
+ }
+ };
+ template <class Flag>
+ struct init_flags
+ {
+ 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 )
+ {
+ // 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 )
+ {
+ // default no flag
+ an_entry[offset] = &FlagHandler<T,Flag>::flag_false;
+ }
+ // attributes
+ flag_handler* entries;
+
+ public:
+ init_flags(flag_handler* entries_)
+ : entries(entries_)
+ {}
+
+ // Flags initializer function object, used with mpl::for_each
+ template <class StateType>
+ void operator()( ::boost::msm::back::wrap<StateType> const& )
+ {
+ typedef typename StateType::flag_list flags;
+ typedef typename ::boost::mpl::contains<flags,Flag >::type found;
+ typedef typename is_composite_state<StateType>::type composite;
+
+ BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,StateType>::type::value));
+ if (found::type::value)
+ {
+ // the type defined the flag => true
+ entries[state_id] = &FlagHandler<StateType,Flag>::flag_true;
+ }
+ else
+ {
+ // false or forward
+ helper<StateType>(entries,state_id);
+ }
+ }
+ };
+ // maintains for every flag a static array containing the flag value for every state
+ template <class Flag>
+ flag_handler* get_entries_for_flag()
+ {
+ BOOST_STATIC_CONSTANT(int, max_state = (mpl::size<state_list>::value));
+
+ 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> >
+ (init_flags<Flag>(flags_entries));
+ return flags_entries;
+ }
+
+ // helper used to create a state using the correct constructor
+ template <class State, class Enable=void>
+ struct create_state_helper
+ {
+ static void set_sm(library_sm* )
+ {
+ // state doesn't need its sm
+ }
+ };
+ // create a state requiring a pointer to the state machine
+ template <class State>
+ struct create_state_helper<State,typename boost::enable_if<typename State::needs_sm >::type>
+ {
+ static void set_sm(library_sm* sm)
+ {
+ // create and set the fsm
+ ::boost::fusion::at_key<State>(sm->m_substate_list).set_sm_ptr(sm);
+ }
+ };
+ // main unspecialized helper class
+ template <class StateType,int ARGS>
+ struct visitor_args;
+
+#define MSM_VISITOR_ARGS_SUB(z, n, unused) BOOST_PP_CAT(_,BOOST_PP_ADD(n,1))
+#define MSM_VISITOR_ARGS_TYPEDEF_SUB(z, n, unused) typename StateType::accept_sig::argument ## n
+
+#define MSM_VISITOR_ARGS_EXECUTE(z, n, unused) \
+ template <class StateType> \
+ struct visitor_args<StateType,n> \
+ { \
+ template <class State> \
+ static typename enable_if_c<!is_composite_state<State>::value,void >::type \
+ helper (library_sm* sm, \
+ int id,StateType& astate) \
+ { \
+ sm->m_visitors.insert(id, boost::bind(&StateType::accept, \
+ ::boost::ref(astate) BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, MSM_VISITOR_ARGS_SUB, ~) )); \
+ } \
+ template <class State> \
+ static typename enable_if_c<is_composite_state<State>::value,void >::type \
+ helper (library_sm* sm, \
+ int id,StateType& astate) \
+ { \
+ void (StateType::*caccept)(BOOST_PP_ENUM(n, MSM_VISITOR_ARGS_TYPEDEF_SUB, ~ ) ) \
+ = &StateType::composite_accept; \
+ sm->m_visitors.insert(id, boost::bind(caccept, \
+ ::boost::ref(astate) BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, MSM_VISITOR_ARGS_SUB, ~) )); \
+ } \
+};
+BOOST_PP_REPEAT(BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_VISITOR_ARGS_EXECUTE, ~)
+#undef MSM_VISITOR_ARGS_EXECUTE
+#undef MSM_VISITOR_ARGS_SUB
+
+ template<class ContainingSM>
+ void set_containing_sm(ContainingSM* sm)
+ {
+ m_is_included=true;
+ ::boost::fusion::for_each(m_substate_list,add_state<ContainingSM>(this,sm));
+ }
+ // A function object for use with mpl::for_each that stuffs
+ // states into the state list.
+ template<class ContainingSM>
+ struct add_state
+ {
+ add_state(library_sm* self_,ContainingSM* sm)
+ : self(self_),containing_sm(sm){}
+
+ // State is a sub fsm with exit pseudo states and gets a pointer to this fsm, so it can build a callback
+ template <class StateType>
+ typename ::boost::enable_if<
+ typename has_exit_pseudo_states<StateType>::type,void >::type
+ new_state_helper(boost::msm::back::dummy<0> = 0) const
+ {
+ ::boost::fusion::at_key<StateType>(self->m_substate_list).set_containing_sm(containing_sm);
+ }
+ // State is a sub fsm without exit pseudo states and does not get a callback to this fsm
+ // or state is a normal state and needs nothing except creation
+ template <class StateType>
+ typename ::boost::enable_if<
+ typename boost::mpl::and_<typename boost::mpl::not_
+ <typename has_exit_pseudo_states<StateType>::type>::type,
+ typename boost::mpl::not_
+ <typename is_pseudo_exit<StateType>::type>::type
+ >::type,void>::type
+ new_state_helper( ::boost::msm::back::dummy<1> = 0) const
+ {
+ //nothing to do
+ }
+ // state is exit pseudo state and gets callback to target fsm
+ template <class StateType>
+ typename ::boost::enable_if<typename is_pseudo_exit<StateType>::type,void >::type
+ new_state_helper( ::boost::msm::back::dummy<2> = 0) const
+ {
+ execute_return (ContainingSM::*pf) (typename StateType::event const& evt)=
+ &ContainingSM::process_event;
+ ::boost::function<execute_return (typename StateType::event const&)> fct =
+ ::boost::bind(pf,containing_sm,_1);
+ ::boost::fusion::at_key<StateType>(self->m_substate_list).set_forward_fct(fct);
+ }
+ // for every defined state in the sm
+ template <class State>
+ void operator()( State const&) const
+ {
+ //create a new state with the defined id and type
+ BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,State>::value));
+
+ 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));
+ }
+ 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
+ {
+ 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
+ {
+ // nothing to do
+ }
+
+ library_sm* self;
+ ContainingSM* containing_sm;
+ };
+
+ // helper used to copy every state if needed
+ struct copy_helper
+ {
+ copy_helper(library_sm* sm):
+ m_sm(sm){}
+ template <class StateType>
+ void operator()( ::boost::msm::back::wrap<StateType> const& )
+ {
+ BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,StateType>::type::value));
+ // possibly also set the visitor
+ visitor_helper<StateType>(state_id);
+
+ // and for states that keep a pointer to the fsm, reset the pointer
+ create_state_helper<StateType>::set_sm(m_sm);
+ }
+ template <class StateType>
+ typename ::boost::enable_if<typename has_accept_sig<StateType>::type,void >::type
+ visitor_helper(int id) const
+ {
+ visitor_args<StateType,StateType::accept_sig::args_number>::template helper<StateType>
+ (m_sm,id,::boost::fusion::at_key<StateType>(m_sm->m_substate_list));
+ }
+ template <class StateType>
+ typename ::boost::disable_if<typename has_accept_sig<StateType>::type,void >::type
+ visitor_helper(int id) const
+ {
+ // nothing to do
+ }
+
+ library_sm* m_sm;
+ };
+
+ // 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];
+ }
+ m_events_queue = rhs.m_events_queue;
+ m_deferred_events_queue = rhs.m_deferred_events_queue;
+ m_history = rhs.m_history;
+ m_event_processing = rhs.m_event_processing;
+ m_is_included = rhs.m_is_included;
+ 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> >
+ (copy_helper(this));
+ }
+
+ // helper used to call the correct entry/exit method
+ // unfortunately in O(number of states in the sub-sm) but should be better than a virtual call
+ template<class Event,bool is_entry>
+ struct entry_exit_helper
+ {
+ entry_exit_helper(int id,Event const& e,library_sm* self_):
+ state_id(id),evt(e),self(self_){}
+ // helper for entry actions
+ template <class IsEntry,class State>
+ typename ::boost::enable_if<typename IsEntry::type,void >::type
+ helper( ::boost::msm::back::dummy<0> = 0)
+ {
+ BOOST_STATIC_CONSTANT(int, id = (get_state_id<stt,State>::value));
+ if (id == state_id)
+ {
+ execute_entry<State>(::boost::fusion::at_key<State>(self->m_substate_list),evt,*self);
+ }
+ }
+ // helper for exit actions
+ template <class IsEntry,class State>
+ typename boost::disable_if<typename IsEntry::type,void >::type
+ helper( ::boost::msm::back::dummy<1> = 0)
+ {
+ BOOST_STATIC_CONSTANT(int, id = (get_state_id<stt,State>::value));
+ if (id == state_id)
+ {
+ execute_exit<State>(::boost::fusion::at_key<State>(self->m_substate_list),evt,*self);
+ }
+ }
+ // iterates through all states to find the one to be activated
+ template <class State>
+ void operator()( ::boost::msm::back::wrap<State> const&)
+ {
+ entry_exit_helper<Event,is_entry>::template helper< ::boost::mpl::bool_<is_entry>,State >();
+ }
+ private:
+ int state_id;
+ 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)
+ {
+ for (int i=0; i<nr_regions::value;++i)
+ {
+ //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));
+ }
+ }
+
+ // helper used to set the correct state as active state upon entry into a fsm
+ struct direct_event_start_helper
+ {
+ direct_event_start_helper(library_sm* self_):self(self_){}
+ // this variant is for the standard case, entry due to activation of the containing FSM
+ template <class EventType>
+ typename ::boost::disable_if<typename has_direct_entry<EventType>::type,void>::type
+ operator()(EventType const& evt, ::boost::msm::back::dummy<0> = 0)
+ {
+ (static_cast<Derived*>(self))->on_entry(evt,*self);
+ self->start(evt);
+ }
+
+ // this variant is for the direct entry case (just one entry, not a sequence of entries)
+ template <class EventType>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::mpl::not_< typename is_pseudo_entry<
+ typename EventType::active_state>::type >::type,
+ typename ::boost::mpl::and_<typename has_direct_entry<EventType>::type,
+ typename ::boost::mpl::not_<typename ::boost::mpl::is_sequence
+ <typename EventType::active_state>::type >::type
+ >::type>::type,void
+ >::type
+ operator()(EventType const& evt, ::boost::msm::back::dummy<1> = 0)
+ {
+ (static_cast<Derived*>(self))->on_entry(evt,*self);
+ int state_id = get_state_id<stt,typename EventType::active_state>::value;
+ BOOST_STATIC_ASSERT(EventType::active_state::zone_index >= 0);
+ BOOST_STATIC_ASSERT(EventType::active_state::zone_index <= nr_regions::value);
+ // just set the correct zone, the others will be default/history initialized
+ self->m_states[EventType::active_state::zone_index] = state_id;
+ self->start(evt.m_event);
+ }
+
+ // this variant is for the fork entry case (a sequence on entries)
+ template <class EventType>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::mpl::not_<
+ typename is_pseudo_entry<typename EventType::active_state>::type >::type,
+ typename ::boost::mpl::and_<typename has_direct_entry<EventType>::type,
+ typename ::boost::mpl::is_sequence<
+ typename EventType::active_state>::type
+ >::type>::type,void
+ >::type
+ operator()(EventType const& evt, ::boost::msm::back::dummy<2> = 0)
+ {
+ (static_cast<Derived*>(self))->on_entry(evt,*self);
+ ::boost::mpl::for_each<typename EventType::active_state,
+ ::boost::msm::back::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);
+ }
+
+ // this variant is for the pseudo state entry case
+ template <class EventType>
+ typename ::boost::enable_if<
+ typename is_pseudo_entry<typename EventType::active_state >::type,void
+ >::type
+ operator()(EventType const& evt, ::boost::msm::back::dummy<3> = 0)
+ {
+ // entry on the FSM
+ (static_cast<Derived*>(self))->on_entry(evt,*self);
+ int state_id = get_state_id<stt,typename EventType::active_state>::value;
+ // given region starts with the entry pseudo state as active state
+ self->m_states[EventType::active_state::zone_index] = state_id;
+ self->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);
+ }
+ private:
+ // helper for the fork case, does almost like the direct entry
+ library_sm* self;
+ template <class EventType>
+ struct fork_helper
+ {
+ 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& )
+ {
+ int state_id = get_state_id<stt,StateType>::value;
+ 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;
+ }
+ private:
+ library_sm* helper_self;
+ EventType const& helper_evt;
+ };
+ };
+
+ // 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];
+ }
+ // 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();
+ }
+ 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));
+ }
+ // then call our own exit
+ (static_cast<Derived*>(this))->on_exit(incomingEvent,*this);
+ // give the history a chance to handle this (or not).
+ m_history.history_exit(this->m_states);
+ }
+
+ // no transition for event.
+ template <class Event>
+ static std::pair<int,HandledEnum> call_no_transition(library_sm& , int state, Event const& )
+ {
+ return std::make_pair(state,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)
+ {
+ 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_TRUE);
+ }
+
+ // 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)
+ {
+ return std::make_pair(state,HANDLED_FALSE);
+ }
+
+ // puts a deferred event in the queue
+ void post_deferred_event(deferred_fct& deferred)
+ {
+ m_deferred_events_queue.push(deferred);
+ }
+ // removes one event from the message queue and processes it
+ void process_message_queue()
+ {
+ if (!m_events_queue.empty())
+ {
+ transition_fct to_call = m_events_queue.front();
+ m_events_queue.pop();
+ to_call();
+ }
+ }
+
+ // calls the entry/exit or on_entry/on_exit depending on the state type
+ // (avoids calling virtually)
+ // variant for FSMs
+ template <class StateType,class EventType,class FsmType>
+ static
+ typename boost::enable_if<typename is_composite_state<StateType>::type,void >::type
+ execute_entry(StateType& astate,EventType const& evt,FsmType& fsm,boost::msm::back::dummy<0> = 0)
+ {
+ // calls on_entry on the fsm then handles direct entries, fork, entry pseudo state
+ astate.do_entry(evt);
+ }
+ // variant for states
+ template <class StateType,class EventType,class FsmType>
+ static
+ typename ::boost::disable_if<
+ typename ::boost::mpl::or_<typename is_composite_state<StateType>::type,
+ typename is_pseudo_exit<StateType>::type >::type,void >::type
+ execute_entry(StateType& astate,EventType const& evt,FsmType& fsm, ::boost::msm::back::dummy<1> = 0)
+ {
+ // simple call to on_entry
+ astate.on_entry(evt,fsm);
+ }
+ // variant for exit pseudo states
+ template <class StateType,class EventType,class FsmType>
+ static
+ typename ::boost::enable_if<typename is_pseudo_exit<StateType>::type,void >::type
+ execute_entry(StateType& astate,EventType const& evt,FsmType& fsm, ::boost::msm::back::dummy<2> = 0)
+ {
+ // calls on_entry on the state then forward the event to the transition which should be defined inside the
+ // contained fsm
+ astate.on_entry(evt,fsm);
+ astate.forward_event(evt);
+ }
+ template <class StateType,class EventType,class FsmType>
+ static
+ typename ::boost::enable_if<typename is_composite_state<StateType>::type,void >::type
+ execute_exit(StateType& astate,EventType const& evt,FsmType& , ::boost::msm::back::dummy<0> = 0)
+ {
+ astate.do_exit(evt);
+ }
+ template <class StateType,class EventType,class FsmType>
+ static
+ typename ::boost::disable_if<typename is_composite_state<StateType>::type,void >::type
+ execute_exit(StateType& astate,EventType const& evt,FsmType& fsm, ::boost::msm::back::dummy<1> = 0)
+ {
+ // simple call to on_exit
+ astate.on_exit(evt,fsm);
+ }
+
+ // helper allowing special handling of direct entries / fork
+ template <class StateType,class TargetType,class EventType,class FsmType>
+ static
+ typename ::boost::disable_if<
+ typename ::boost::mpl::or_<typename has_explicit_entry_state<TargetType>::type,
+ ::boost::mpl::is_sequence<TargetType> >::type,void>::type
+ convert_event_and_execute_entry(StateType& astate,EventType const& evt, FsmType& fsm, ::boost::msm::back::dummy<1> = 0)
+ {
+ // if the target is a normal state, do the standard entry handling
+ execute_entry<StateType>(astate,evt,fsm);
+ }
+ template <class StateType,class TargetType,class EventType,class FsmType>
+ static
+ typename ::boost::enable_if<
+ typename ::boost::mpl::or_<typename has_explicit_entry_state<TargetType>::type,
+ ::boost::mpl::is_sequence<TargetType> >::type,void >::type
+ convert_event_and_execute_entry(StateType& astate,EventType const& evt, FsmType& fsm, ::boost::msm::back::dummy<0> = 0)
+ {
+ // for the direct entry, pack the event in a wrapper so that we handle it differently during fsm entry
+ execute_entry(astate,msm::back::direct_entry_event<TargetType,EventType>(evt),fsm);
+ }
+
+ // creates all the states
+ template <class ContainingSM>
+ void fill_states(ContainingSM* containing_sm=0)
+ {
+ BOOST_STATIC_CONSTANT(int, max_state = (mpl::size<state_list>::value));
+ // allocate the place without reallocation
+ m_visitors.fill_visitors(max_state);
+ ::boost::fusion::for_each(m_substate_list,add_state<ContainingSM>(this,containing_sm));
+
+ }
+
+
+public:
+
+
+
+private:
+ 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;
+
+
+};
+
+} } }// boost::msm::back
+#endif //BOOST_MSM_BACK_STATEMACHINE_H
+

Added: sandbox/msm/boost/msm/back/tools.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/back/tools.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,68 @@
+// 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_BACK_TOOLS_H
+#define BOOST_MSM_BACK_TOOLS_H
+
+
+#include <string>
+#include <iostream>
+#include <boost/msm/back/common_types.hpp>
+#include <boost/msm/back/metafunctions.hpp>
+
+namespace boost { namespace msm { namespace back
+{
+
+// fills the array passed in with the state names in the correct order
+// the array must be big enough. To know the needed size, use mpl::size
+// on fsm::generate_state_set
+template <class stt>
+struct fill_state_names
+{
+ fill_state_names(char const** names):m_names(names){}
+ template <class StateType>
+ void operator()(boost::msm::back::wrap<StateType> const&)
+ {
+ m_names[get_state_id<stt,StateType>::value]= typeid(StateType).name();
+ }
+private:
+ char const** m_names;
+};
+
+// fills the typeid-generated name of the given state in the string passed as argument
+template <class stt>
+struct get_state_name
+{
+ 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&)
+ {
+ if (get_state_id<stt,StateType>::value == m_state_id)
+ {
+ m_name = typeid(StateType).name();
+ }
+ }
+private:
+ std::string& m_name;
+ int m_state_id;
+};
+
+// displays the typeid of the given Type
+struct display_type
+{
+ template <class Type>
+ void operator()(boost::msm::back::wrap<Type> const&)
+ {
+ std::cout << typeid(Type).name() << std::endl;
+ }
+};
+
+} } }//boost::msm::back
+#endif //BOOST_MSM_BACK_TOOLS_H

Deleted: sandbox/msm/boost/msm/bind_helpers.hpp
==============================================================================
--- sandbox/msm/boost/msm/bind_helpers.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,39 +0,0 @@
-// 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_BIND_HELPERS_H
-#define BOOST_MSM_BIND_HELPERS_H
-
-#include <functional>
-
-namespace boost { namespace msm
-{
- // helper to replace std::plus as the lack of implicit conversion makes it not usable in one of our bind
- template<class _Ty,class _Tz>
- struct plus2
- : public std::binary_function<_Ty, _Tz, _Ty>
- { // functor for operator+
- _Ty operator()( _Ty _Left, _Tz _Right) const
- { // apply operator+ to operands
- return (_Left + _Right);
- }
- };
- // helper to dereference a pointer to a function pointer
- template <class T>
- struct deref
- {
- typedef T& result_type;
- T& operator()(T* f) const
- {
- return *f;
- }
- };
-} } //boost::msm
-#endif //BOOST_MSM_BIND_HELPERS_H

Deleted: sandbox/msm/boost/msm/common_types.hpp
==============================================================================
--- sandbox/msm/boost/msm/common_types.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,38 +0,0 @@
-// 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_TYPES_H
-#define BOOST_MSM_COMMON_TYPES_H
-
-#include <vector>
-#include <boost/tuple/tuple.hpp>
-#include <boost/function.hpp>
-
-namespace boost { namespace msm
-{
-// used for disable_if
-template <int> struct dummy { dummy(int) {} };
-// return value for transition handling
-typedef enum
-{
- HANDLED_FALSE=0,
- HANDLED_TRUE =1,
- HANDLED_GUARD_REJECT=2
-} HandledEnum;
-typedef ::boost::tuple<HandledEnum,const std::vector<int>*> 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
-

Deleted: sandbox/msm/boost/msm/copy_policies.hpp
==============================================================================
--- sandbox/msm/boost/msm/copy_policies.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,41 +0,0 @@
-// 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_COPY_POLICIES_H
-#define BOOST_MSM_COPY_POLICIES_H
-
-#include <boost/utility.hpp>
-#include <boost/mpl/bool.hpp>
-
-namespace boost { namespace msm
-{
- // deactivates copy
- struct NoCopy : ::boost::noncopyable
- {
- // tags
- typedef ::boost::mpl::bool_<false> shallow_copy;
- };
-
- // activate the shallow copy flag
- struct ShallowCopy
- {
- // tags
- typedef ::boost::mpl::bool_<true> shallow_copy;
- };
- // deactivate the shallow copy flag
- struct DeepCopy
- {
- // tags
- typedef ::boost::mpl::bool_<false> shallow_copy;
- };
-} } //boost::msm
-
-
-#endif //BOOST_MSM_COPY_POLICIES_H

Deleted: sandbox/msm/boost/msm/dispatch_table.hpp
==============================================================================
--- sandbox/msm/boost/msm/dispatch_table.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,238 +0,0 @@
-// 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_DISPATCH_TABLE_H
-#define BOOST_MSM_DISPATCH_TABLE_H
-
-#include <utility>
-
-#include <boost/utility/enable_if.hpp>
-#include <boost/mpl/empty.hpp>
-#include <boost/mpl/reverse_fold.hpp>
-#include <boost/mpl/greater.hpp>
-#include <boost/mpl/size.hpp>
-#include <boost/mpl/filter_view.hpp>
-#include <boost/mpl/pop_front.hpp>
-#include <boost/mpl/for_each.hpp>
-#include <boost/mpl/map.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/pair.hpp>
-#include <boost/mpl/int.hpp>
-#include <boost/mpl/push_back.hpp>
-
-#include <boost/msm/metafunctions.hpp>
-#include <boost/msm/common_types.hpp>
-#include <boost/msm/states.hpp>
-
-namespace boost { namespace msm
-{
-
-// forward declaration
-template<class Derived,class HistoryPolicy,class BaseState,class CopyPolicy>
-class state_machine;
-
-// Generates a singleton runtime lookup table that maps current state
-// to a function that makes the SM take its transition on the given
-// Event type.
-template <class Fsm, class HistoryPolicy,class BaseState, class CopyPolicy,class Stt, class Event>
-struct dispatch_table
-{
- private:
- // This is a table of these function pointers.
- typedef typename Fsm::pBaseState pstate_base;
- typedef std::pair<int,HandledEnum> (*cell)(Fsm&, int, pstate_base*,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
- // (like an UML diamond). Allows transition conflicts.
- template< typename Seq,typename AnEvent,typename State >
- struct chain_row
- {
- typedef State current_state_type;
- typedef AnEvent event;
-
- // helper for building a disable/enable_if-controlled execute function
- struct execute_helper
- {
- template <class Sequence>
- static
- typename ::boost::enable_if<typename ::boost::mpl::empty<Sequence>::type,std::pair<int,HandledEnum> >::type
- execute(Fsm& fsm, int state, pstate_base* all_states, Event const& evt,
- ::boost::msm::dummy<0> = 0)
- {
- // if at least one guard rejected, this will be ignored, otherwise will generate an error
- return std::make_pair(state,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, pstate_base* all_states, Event const& evt,
- ::boost::msm::dummy<1> = 0)
- {
- // try the first guard
- typedef typename ::boost::mpl::front<Sequence>::type first_row;
- std::pair<int,HandledEnum> res = first_row::execute(fsm,state,all_states,evt);
- if (HANDLED_TRUE!=res.second)
- {
- // 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,all_states,evt);
- // 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);
- }
- return res;
- }
- };
- // Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(Fsm& fsm, int state, pstate_base* all_states, Event const& evt)
- {
- // forward to helper
- return execute_helper::template execute<Seq>(fsm,state,all_states,evt);
- }
- };
- // nullary metafunction whose only job is to prevent early evaluation of _1
- template< typename Entry >
- struct make_chain_row_from_map_entry
- {
- typedef chain_row<typename Entry::second,Event,
- typename Entry::first > type;
- };
- // Compute the maximum state value in the sm so we know how big
- // to make the table
- typedef typename generate_state_set<Stt>::type state_list;
- BOOST_STATIC_CONSTANT(int, max_state = ( ::boost::mpl::size<state_list>::value));
-
- // A function object for use with mpl::for_each that stuffs
- // transitions into cells.
- struct init_cell
- {
- init_cell(dispatch_table* self_)
- : self(self_)
- {}
-
- // Cell initializer function object, used with mpl::for_each
- template <class Transition>
- typename ::boost::enable_if<typename has_not_real_row_tag<Transition>::type,void >::type
- operator()(Transition const&,boost::msm::dummy<0> = 0) const
- {
- // version for not real rows. No problem because irrelevant for process_event
- }
- template <class Transition>
- typename ::boost::disable_if<typename has_not_real_row_tag<Transition>::type,void >::type
- operator()(Transition const&,boost::msm::dummy<1> = 0) 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] = &Transition::execute;
- }
-
- dispatch_table* self;
- };
- struct default_init_cell
- {
- default_init_cell(dispatch_table* self_,cell* tofill_entries_)
- : self(self_),tofill_entries(tofill_entries_)
- {}
- // Cell default-initializer function object, used with mpl::for_each
- // initializes with call_no_transition or defer_transition
- template <class State>
- typename ::boost::disable_if<typename has_state_delayed_event<State,Event>::type,void >::type
- operator()(boost::msm::wrap<State> const&,boost::msm::dummy<0> = 0)
- {
- typedef typename create_stt<Fsm>::type stt;
- BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,State>::value));
- cell call_no_transition = &state_machine<Fsm,HistoryPolicy,BaseState,CopyPolicy>::call_no_transition;
- tofill_entries[state_id] = call_no_transition;
- }
- template <class State>
- typename ::boost::enable_if<typename has_state_delayed_event<State,Event>::type,void >::type
- operator()(boost::msm::wrap<State> const&,boost::msm::dummy<1> = 0)
- {
- typedef typename create_stt<Fsm>::type stt;
- BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,State>::value));
- cell call_no_transition = &state_machine<Fsm,HistoryPolicy,BaseState,CopyPolicy>::defer_transition;
- tofill_entries[state_id] = call_no_transition;
- }
- dispatch_table* self;
- cell* tofill_entries;
- };
- public:
- // initialize the dispatch table for a given Event and Fsm
- dispatch_table()
- {
- // Initialize cells for no transition
- ::boost::mpl::for_each<typename generate_state_set<Stt>::type,
- boost::msm::wrap< ::boost::mpl::placeholders::_1> >
- (default_init_cell(this,entries));
-
- // build chaining rows for rows coming from the same state and the current event
- // first we build a map of sequence for every source
- // in reverse order so that the frow's are handled first (UML priority)
- typedef typename ::boost::mpl::reverse_fold<
- // filter on event
- ::boost::mpl::filter_view
- <Stt, ::boost::is_same<transition_event< ::boost::mpl::placeholders::_>, Event> >,
- // build a map
- ::boost::mpl::map<>,
- ::boost::mpl::if_<
- // if we already have a row on this source state
- ::boost::mpl::has_key< ::boost::mpl::placeholders::_1,
- transition_source_type< ::boost::mpl::placeholders::_2> >,
- // insert a new element in the value type
- ::boost::mpl::insert<
- ::boost::mpl::placeholders::_1,
- ::boost::mpl::pair<transition_source_type< ::boost::mpl::placeholders::_2>,
- ::boost::mpl::push_back<
- ::boost::mpl::at< ::boost::mpl::placeholders::_1,
- transition_source_type< ::boost::mpl::placeholders::_2> >,
- ::boost::mpl::placeholders::_2 >
- > >,
- // first row on this source state, make a vector with 1 element
- ::boost::mpl::insert<
- ::boost::mpl::placeholders::_1,
- ::boost::mpl::pair<transition_source_type< ::boost::mpl::placeholders::_2>,
- make_vector< ::boost::mpl::placeholders::_2> > >
- >
- >::type map_of_row_seq;
- // and then build chaining rows for all source states having more than 1 row
- typedef typename ::boost::mpl::fold<
- map_of_row_seq,::boost::mpl::vector<>,
- ::boost::mpl::if_<
- ::boost::mpl::greater< ::boost::mpl::size<
- ::boost::mpl::second< ::boost::mpl::placeholders::_2> >,
- ::boost::mpl::int_<1> >,
- // we need row chaining
- ::boost::mpl::push_back< ::boost::mpl::placeholders::_1,
- make_chain_row_from_map_entry< ::boost::mpl::placeholders::_2> >,
- // just one row, no chaining, we rebuild the row like it was before
- ::boost::mpl::push_back< ::boost::mpl::placeholders::_1,
- get_first_element_pair_second< ::boost::mpl::placeholders::_2> >
- > >::type chained_rows;
- // Go back and fill in cells for matching transitions.
- ::boost::mpl::for_each<chained_rows>(init_cell(this));
- }
-
- // The singleton instance.
- static const dispatch_table instance;
-
- public: // data members
- cell entries[max_state];
-};
-
-}} // boost::msm
-
-
-#endif //BOOST_MSM_DISPATCH_TABLE_H
-

Added: sandbox/msm/boost/msm/front/automatic_event.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/automatic_event.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 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_FRONT_COMMON_AUTOMATIC_EVENT_H
+#define BOOST_MSM_FRONT_COMMON_AUTOMATIC_EVENT_H
+
+namespace boost { namespace msm { namespace front
+{
+
+ struct none
+ {
+ typedef int automatic_event;
+ };
+
+}}}
+
+#endif //BOOST_MSM_FRONT_COMMON_AUTOMATIC_EVENT_H
+

Added: sandbox/msm/boost/msm/front/common_states.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/common_states.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,83 @@
+// 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_FRONT_COMMON_STATES_H
+#define BOOST_MSM_FRONT_COMMON_STATES_H
+
+#include <boost/mpl/int.hpp>
+
+#include <boost/fusion/container/vector.hpp>
+#include <boost/fusion/include/at_c.hpp>
+
+#include <boost/type_traits/add_const.hpp>
+
+namespace boost { namespace msm { namespace front
+{
+// default base: non-polymorphic, not visitable
+struct default_base_state
+{
+ ~default_base_state(){}
+};
+// default polymorphic base state. Derive all states from it to get polymorphic behavior
+struct polymorphic_state
+{
+ virtual ~polymorphic_state() {}
+};
+
+template <class Attributes= ::boost::fusion::vector<> >
+struct inherit_attributes
+{
+ // on the fly attribute creation capability
+ typedef Attributes attributes_type;
+ template <int Index>
+ typename ::boost::fusion::result_of::at<attributes_type,
+ ::boost::mpl::int_<Index> >::type
+ get_attribute()
+ {
+ return ::boost::fusion::at_c<Index>(m_attributes);
+ }
+
+ template <int Index>
+ typename ::boost::add_const<
+ typename ::boost::fusion::result_of::at<attributes_type,
+ ::boost::mpl::int_<Index> >::type>::type
+ get_attribute()const
+ {
+ return const_cast<
+ typename ::boost::add_const<
+ typename ::boost::fusion::result_of::at< attributes_type,
+ ::boost::mpl::int_<Index> >::type>::type>
+ (::boost::fusion::at_c<Index>(m_attributes));
+ }
+
+private:
+ // attributes
+ Attributes m_attributes;
+};
+
+// the interface for all states. Defines entry and exit functions. Overwrite to implement for any state needing it.
+template<class USERBASE,class Attributes= ::boost::fusion::vector<> >
+struct state_base : public inherit_attributes<Attributes>, USERBASE
+{
+ typedef USERBASE user_state_base;
+ typedef Attributes attributes_type;
+
+ // empty implementation for the states not wishing to define an entry condition
+ // will not be called polymorphic way
+ template <class Event,class FSM>
+ void on_entry(Event const& ,FSM&){}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ){}
+};
+
+}}}
+
+#endif //BOOST_MSM_FRONT_COMMON_STATES_H
+

Added: sandbox/msm/boost/msm/front/euml/algorithm.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/algorithm.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,19 @@
+// 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_FRONT_EUML_ALGORITHM_H
+#define BOOST_MSM_FRONT_EUML_ALGORITHM_H
+
+#include <boost/msm/front/euml/iteration.hpp>
+#include <boost/msm/front/euml/querying.hpp>
+#include <boost/msm/front/euml/transformation.hpp>
+
+
+#endif //BOOST_MSM_FRONT_EUML_ALGORITHM_H

Added: sandbox/msm/boost/msm/front/euml/common.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/common.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,2054 @@
+// 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_FRONT_EUML_COMMON_H
+#define BOOST_MSM_FRONT_EUML_COMMON_H
+
+#ifdef BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+#undef BOOST_MPL_LIMIT_METAFUNCTION_ARITY
+#endif
+
+#ifdef BOOST_PROTO_MAX_ARITY
+#undef BOOST_PROTO_MAX_ARITY
+#endif
+
+#ifndef BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
+#endif
+
+#ifdef BOOST_MSVC
+#define BOOST_MPL_LIMIT_METAFUNCTION_ARITY 7
+#define BOOST_PROTO_MAX_ARITY 7
+#else
+#define BOOST_MPL_LIMIT_METAFUNCTION_ARITY 6
+#define BOOST_PROTO_MAX_ARITY 6
+#endif
+
+#include <iterator>
+#include <utility>
+
+#include <boost/proto/core.hpp>
+
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/add_const.hpp>
+
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/has_key.hpp>
+#include <boost/mpl/int.hpp>
+
+#if BOOST_VERSION >= 104000
+#include <boost/mpl/string.hpp>
+#endif
+
+#include <boost/fusion/container/vector.hpp>
+#include <boost/fusion/include/at_c.hpp>
+
+#include <boost/msm/front/functor_row.hpp>
+
+namespace proto = boost::proto;
+
+BOOST_MPL_HAS_XXX_TRAIT_DEF(tag_type)
+
+namespace boost { namespace msm { namespace front { namespace euml
+{
+template <class T>
+struct get_iterator
+{
+ typedef typename T::iterator type;
+};
+template <class T>
+struct get_reverse_iterator
+{
+ typedef typename T::reverse_iterator type;
+};
+template <class T>
+struct get_reference
+{
+ typedef typename T::reference type;
+};
+template <class T>
+struct get_size_type
+{
+ typedef typename T::size_type type;
+};
+template <class T>
+struct get_value_type
+{
+ typedef typename T::value_type type;
+};
+template <class T>
+struct get_first_type
+{
+ typedef typename T::first_type type;
+};
+template <class T>
+struct get_second_type
+{
+ typedef typename T::second_type type;
+};
+template <class T>
+struct get_action_tag_type
+{
+ typedef typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type type;
+};
+template <class T>
+struct get_state_action_tag_type
+{
+ typedef typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type type;
+};
+
+template <class T,class EVT,class FSM,class SourceState,class TargetState>
+struct get_result_type
+{
+ typedef typename T::template transition_action_result<EVT,FSM,SourceState,TargetState>::type type;
+};
+template <class T,class Event,class FSM,class STATE>
+struct get_result_type2
+{
+ typedef typename T::template state_action_result<Event,FSM,STATE>::type type;
+};
+template<class SEQ>
+struct get_sequence
+{
+ typedef typename SEQ::sequence type;
+};
+
+template <class T>
+struct get_attributes_type
+{
+ typedef typename T::attributes_type type;
+};
+
+template <class T>
+struct get_euml_tag_type
+{
+ typedef typename T::euml_tag_type type;
+};
+
+template <class T,class Arg1=void,class Arg2=void,class Arg3=void,class Arg4=void,class Arg5=void
+#ifdef BOOST_MSVC
+,class Arg6=void
+#endif
+>
+struct get_fct
+{
+ typedef typename T::template In<Arg1,Arg2,Arg3,Arg4,Arg5
+#ifdef BOOST_MSVC
+,Arg6
+#endif
+>::type 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 >
+{};
+
+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>
+{
+ typedef event_tag euml_tag_type;
+ using proto::extends<typename proto::terminal<event_tag>::type, EVT, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef EVT type;
+ };
+};
+template <class STATE>
+struct euml_state: proto::extends<typename proto::terminal<state_tag>::type, STATE, sm_domain>
+{
+ typedef state_tag euml_tag_type;
+ using proto::extends<typename proto::terminal<state_tag>::type, STATE, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef STATE type;
+ };
+};
+template <class ACTION>
+struct euml_action: proto::extends<typename proto::terminal<action_tag>::type, ACTION, sm_domain>
+{
+ typedef action_tag euml_tag_type;
+ using proto::extends<typename proto::terminal<action_tag>::type, ACTION, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef ACTION type;
+ };
+};
+template <class FLAG>
+struct euml_flag: proto::extends<typename proto::terminal<flag_tag>::type, FLAG, sm_domain>
+{
+ typedef flag_tag euml_tag_type;
+ using proto::extends<typename proto::terminal<flag_tag>::type, FLAG, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef FLAG type;
+ };
+};
+
+template <class CONFIG>
+struct euml_config: proto::extends<typename proto::terminal<config_tag>::type, CONFIG, sm_domain>
+{
+ typedef config_tag euml_tag_type;
+ using proto::extends<typename proto::terminal<config_tag>::type, CONFIG, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef CONFIG type;
+ };
+};
+
+struct no_exception : euml_config<no_exception>
+{
+ typedef int no_exception_thrown;
+};
+struct no_msg_queue : euml_config<no_msg_queue>
+{
+ typedef int no_message_queue;
+};
+
+struct invalid_type{};
+struct make_invalid_type
+{
+ typedef invalid_type type;
+};
+
+template <class ROW>
+struct make_vector_one_row
+{
+ typedef boost::mpl::vector<ROW> type;
+};
+template <class T>
+T make_T(T t) {return t;}
+
+struct make_vector_no_row
+{
+ typedef boost::mpl::vector0<> type;
+};
+
+struct NoAction : euml_action<NoAction>
+{
+ // return value if used inside a state action (entry/exit)
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ // return value if used inside a transition (action/guard)
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ // this functor can be used in both modes, state action and transition action
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const&,FSM&,STATE& )
+ {
+ // does nothing
+ return true;
+ }
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt ,FSM& ,SourceState& ,TargetState&)const
+ {
+ // does nothing
+ return true;
+ }
+};
+
+struct GetSource_ : euml_action<GetSource_ >
+{
+ using euml_action<GetSource_ >::operator=;
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef SourceState& type;
+ };
+ typedef ::boost::mpl::set<action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ operator()(EVT const& , FSM&,SourceState& src,TargetState& )const
+ {
+ return src;
+ }
+};
+struct get_source_tag {};
+struct GetSource_Helper: proto::extends< proto::terminal<get_source_tag>::type, GetSource_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef GetSource_ type;
+ };
+};
+GetSource_Helper const source_;
+
+struct GetTarget_ : euml_action<GetTarget_ >
+{
+ using euml_action<GetTarget_ >::operator=;
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef TargetState& type;
+ };
+ typedef ::boost::mpl::set<action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ operator()(EVT const& , FSM&,SourceState& ,TargetState& tgt)const
+ {
+ return tgt;
+ }
+};
+struct get_target_tag {};
+struct GetTarget_Helper: proto::extends< proto::terminal<get_target_tag>::type, GetTarget_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef GetTarget_ type;
+ };
+};
+GetTarget_Helper const target_;
+
+struct GetState_ : euml_action<GetState_ >
+{
+ using euml_action<GetState_ >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef STATE& type;
+ };
+ typedef ::boost::mpl::set<state_action_tag> tag_type;
+
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const&,FSM& ,STATE& state )
+ {
+ return state;
+ }
+};
+struct get_state_tag {};
+struct GetState_Helper: proto::extends< proto::terminal<get_state_tag>::type, GetState_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef GetState_ type;
+ };
+};
+GetState_Helper const state_;
+
+struct GetEvent_ : euml_action<GetEvent_ >
+{
+ using euml_action<GetEvent_ >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef Event const& type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef EVT const& type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& ,STATE& )
+ {
+ return evt;
+ }
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ operator()(EVT const& evt ,FSM& ,SourceState& ,TargetState&)const
+ {
+ return evt;
+ }
+};
+struct get_event_tag {};
+struct GetEvent_Helper: proto::extends< proto::terminal<get_event_tag>::type, GetEvent_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef GetEvent_ type;
+ };
+};
+GetEvent_Helper const event_;
+
+struct GetFsm_ : euml_action<GetFsm_>
+{
+ using euml_action<GetFsm_>::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef FSM& type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef FSM& type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const&,FSM& fsm,STATE& )
+ {
+ return fsm;
+ }
+ 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
+ {
+ return fsm;
+ }
+};
+struct get_fsm_tag {};
+struct GetFsm_Helper: proto::extends< proto::terminal<get_fsm_tag>::type, GetFsm_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef GetFsm_ type;
+ };
+};
+GetFsm_Helper const fsm_;
+
+template <class StateName,class Param1=void, class Enable=void >
+struct SubState_ : euml_action<SubState_<StateName,Param1,Enable> > {};
+
+template <class StateName,class Param1>
+struct SubState_ <StateName,Param1
+ , typename ::boost::enable_if<typename ::boost::is_same<Param1,void>::type >::type>
+ : euml_action<SubState_<StateName, Param1 > >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef StateName& type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef StateName& type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ StateName& operator()(EVT const&,FSM& fsm,SourceState& ,TargetState& )const
+ {
+ return fsm.template get_state<StateName&>();
+ }
+ template <class Event,class FSM,class STATE>
+ StateName& operator()(Event const& ,FSM& fsm,STATE& )const
+ {
+ return fsm.template get_state<StateName&>();
+ }
+};
+
+template <class StateName,class Param1>
+struct SubState_ <StateName,Param1
+ , typename ::boost::disable_if<
+ typename ::boost::is_same<Param1,void>::type
+ >::type>
+ : euml_action<SubState_<StateName, Param1> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef StateName& type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef StateName& type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ StateName& operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Param1()(evt,fsm,src,tgt)).template get_state<StateName&>();
+ }
+ template <class Event,class FSM,class STATE>
+ StateName& operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ return (Param1()(evt,fsm,state)).template get_state<StateName&>();
+ }
+};
+struct substate_tag {};
+struct SubState_Helper: proto::extends< proto::terminal<substate_tag>::type, SubState_Helper, sm_domain>
+{
+ using proto::extends< proto::terminal<substate_tag>::type, SubState_Helper, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef SubState_<Arg1,Arg2> type;
+ };
+};
+SubState_Helper const substate_;
+
+template <class Target,class Index>
+struct GetAttribute_ : euml_action<GetAttribute_<Target, Index> >
+{
+ using euml_action<GetAttribute_<Target,Index> >::operator=;
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename
+ ::boost::fusion::result_of::at<
+ typename get_attributes_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Target,Event,FSM,STATE>::type>::type>::type,
+ typename Index::value_type >::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename
+ ::boost::fusion::result_of::at<
+ typename get_attributes_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<Target,EVT,FSM,SourceState,TargetState>::type>::type>::type,
+ typename Index::value_type >::type type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Target::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Target()(evt,fsm,src,tgt)).template get_attribute<Index::value_type::value>();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Target::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Target()(evt,fsm,state)).template get_attribute<Index::value_type::value>();
+ }
+};
+
+struct get_attribute_tag
+{
+};
+struct GetAttribute_Helper: proto::extends< proto::terminal<get_attribute_tag>::type, GetAttribute_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef GetAttribute_<Arg1,Arg2> type;
+ };
+};
+GetAttribute_Helper const attribute_;
+
+template <int Index>
+struct Source_ : euml_action<Source_<Index> >
+{
+ using euml_action<Source_<Index> >::operator=;
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename
+ ::boost::fusion::result_of::at<typename SourceState::attributes_type,
+ ::boost::mpl::int_<Index> >::type type;
+ };
+ typedef ::boost::mpl::set<action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ operator()(EVT const& , FSM&,SourceState& src,TargetState& )const
+ {
+ return src.template get_attribute<Index>();
+ }
+};
+template <int Index>
+struct Target_ : euml_action<Target_<Index> >
+{
+ using euml_action<Target_<Index> >::operator=;
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename
+ ::boost::fusion::result_of::at<typename TargetState::attributes_type,
+ ::boost::mpl::int_<Index> >::type type;
+ };
+ typedef ::boost::mpl::set<action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ operator()(EVT const& ,FSM& ,SourceState& ,TargetState& tgt)const
+ {
+ return tgt.template get_attribute<Index>();
+ }
+};
+template <int Index>
+struct State_ : euml_action<State_<Index> >
+{
+ using euml_action<State_<Index> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename
+ ::boost::fusion::result_of::at<typename STATE::attributes_type,
+ ::boost::mpl::int_<Index> >::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag> tag_type;
+
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const&,FSM& ,STATE& state )
+ {
+ return state.template get_attribute<Index>();
+ }
+};
+template <int Index>
+struct Event_ : euml_action<Event_<Index> >
+{
+ using euml_action<Event_<Index> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::add_const<
+ typename ::boost::fusion::result_of::at<typename Event::attributes_type,
+ ::boost::mpl::int_<Index> >::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::add_const<
+ typename ::boost::fusion::result_of::at<typename EVT::attributes_type,
+ ::boost::mpl::int_<Index> >::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& ,STATE& )
+ {
+ return evt.template get_attribute<Index>();
+ }
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ operator()(EVT const& evt ,FSM& ,SourceState& ,TargetState&)const
+ {
+ return evt.template get_attribute<Index>();
+ }
+};
+template <class StateType,int Index>
+struct State_Attribute_ : euml_action<State_Attribute_<StateType,Index> >
+{
+ using euml_action<State_Attribute_<StateType,Index> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename
+ ::boost::fusion::result_of::at<typename StateType::attributes_type,
+ ::boost::mpl::int_<Index> >::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag> tag_type;
+
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const&,FSM& fsm,STATE& )
+ {
+ return fsm.template get_state<StateType&>().template get_attribute<Index>();
+ }
+};
+
+template <int Index>
+struct Fsm_ : euml_action<Fsm_<Index> >
+{
+ using euml_action<Fsm_<Index> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename
+ ::boost::fusion::result_of::at<typename FSM::attributes_type,
+ ::boost::mpl::int_<Index> >::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename
+ ::boost::fusion::result_of::at<typename FSM::attributes_type,
+ ::boost::mpl::int_<Index> >::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const&,FSM& fsm,STATE& )
+ {
+ return fsm.template get_attribute<Index>();;
+ }
+ 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
+ {
+ return fsm.template get_attribute<Index>();
+ }
+};
+
+struct True_ : euml::euml_action<True_>
+{
+ using euml_action<True_>::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt,FSM&,SourceState& ,TargetState& )
+ {
+ return true;
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const&,FSM&,STATE& )
+ {
+ return true;
+ }
+};
+struct False_ : euml::euml_action<False_>
+{
+ using euml_action<False_>::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt,FSM&,SourceState& ,TargetState& )
+ {
+ return false;
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const&,FSM&,STATE& )
+ {
+ return false;
+ }
+};
+template <int Val>
+struct Int_ : euml_action<Int_<Val> >
+{
+ using euml_action<Int_<Val> >::operator=;
+ typedef ::boost::mpl::int_<Val> value_type;
+ enum {value = Val};
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef int type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef int type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ int operator()(EVT const& , FSM& ,SourceState& ,TargetState& )
+ {
+ return Val;
+ }
+ template <class Event,class FSM,class STATE>
+ int operator()(Event const& ,FSM& ,STATE& )
+ {
+ return Val;
+ }
+};
+
+template <char Val>
+struct Char_ : euml_action<Char_<Val> >
+{
+ using euml_action<Char_<Val> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef char type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef char type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ char operator()(EVT const& , FSM& ,SourceState& ,TargetState& )
+ {
+ return Val;
+ }
+ template <class Event,class FSM,class STATE>
+ char operator()(Event const& ,FSM& ,STATE& )
+ {
+ return Val;
+ }
+};
+
+template <size_t Val>
+struct Size_t_ : euml_action<Size_t_<Val> >
+{
+ using euml_action<Size_t_<Val> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef size_t type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef size_t type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ size_t operator()(EVT const& , FSM& ,SourceState& ,TargetState& )
+ {
+ return Val;
+ }
+ template <class Event,class FSM,class STATE>
+ size_t operator()(Event const& ,FSM& ,STATE& )
+ {
+ return Val;
+ }
+};
+
+#if BOOST_VERSION >= 104000
+
+template <class T>
+struct String_ : euml_action<String_<T> >
+{
+ using euml_action<String_<T> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef char const* type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef char const* type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ char const* operator()(EVT const& , FSM& ,SourceState& ,TargetState& )
+ {
+ return ::boost::mpl::c_str<T>::value;
+ }
+ template <class Event,class FSM,class STATE>
+ char const* operator()(Event const& ,FSM& ,STATE& )
+ {
+ return ::boost::mpl::c_str<T>::value;
+ }
+};
+#endif
+
+
+template <class T>
+struct Predicate_ : euml_action<Predicate_<T> >
+{
+ using euml_action<Predicate_<T> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef T type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef T type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ T operator()(EVT const& , FSM& ,SourceState& ,TargetState& )
+ {
+ return T();
+ }
+ template <class Event,class FSM,class STATE>
+ T operator()(Event const& ,FSM& ,STATE& )
+ {
+ return T();
+ }
+};
+
+template <class ToProcessEvt,class Param1=void, class Param2=void, class Param3=void, class Param4=void, class Enable=void >
+struct Process_ : euml_action<Process_<ToProcessEvt,Param1,Param2,Param3,Param4,Enable> > {};
+
+template <class ToProcessEvt,class Param1, class Param2, class Param3, class Param4>
+struct Process_ <ToProcessEvt,Param1,Param2,Param3,Param4
+ , typename ::boost::enable_if<typename ::boost::is_same<Param1,void>::type >::type>
+ : euml_action<Process_<ToProcessEvt, Param1, Param2, Param3, Param4 > >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const&,FSM& fsm,SourceState& ,TargetState& )const
+ {
+ fsm.process_event(ToProcessEvt());
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& ,FSM& fsm,STATE& )const
+ {
+ fsm.process_event(ToProcessEvt());
+ }
+};
+
+template <class ToProcessEvt,class Param1, class Param2, class Param3, class Param4>
+struct Process_ <ToProcessEvt,Param1,Param2,Param3,Param4
+ , typename ::boost::disable_if<
+ typename ::boost::mpl::or_<
+ typename ::boost::is_same<Param1,void>::type,
+ typename ::boost::mpl::not_<typename ::boost::is_same<Param2,void>::type>::type
+ >::type
+ >::type>
+ : euml_action<Process_<ToProcessEvt, Param1, Param2, Param3, Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ (Param1()(evt,fsm,state)).process_event(ToProcessEvt());
+ }
+};
+
+template <class ToProcessEvt,class Param1, class Param2, class Param3, class Param4>
+struct Process_ <ToProcessEvt,Param1,Param2,Param3,Param4
+ , typename ::boost::disable_if<
+ typename ::boost::mpl::or_<
+ typename ::boost::is_same<Param2,void>::type,
+ typename ::boost::mpl::not_<typename ::boost::is_same<Param3,void>::type>::type
+ >::type
+ >::type>
+ : euml_action<Process_<ToProcessEvt, Param1, Param2, Param3, Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
+ (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ (Param1()(evt,fsm,state)).process_event(ToProcessEvt());
+ (Param2()(evt,fsm,state)).process_event(ToProcessEvt());
+ }
+};
+
+template <class ToProcessEvt,class Param1, class Param2, class Param3, class Param4>
+struct Process_ <ToProcessEvt,Param1,Param2,Param3,Param4
+ , typename ::boost::disable_if<
+ typename ::boost::mpl::or_<
+ typename ::boost::is_same<Param3,void>::type,
+ typename ::boost::mpl::not_<typename ::boost::is_same<Param4,void>::type>::type
+ >::type
+ >::type>
+ : euml_action<Process_<ToProcessEvt, Param1, Param2, Param3, Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
+ (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
+ (Param3()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ (Param1()(evt,fsm,state)).process_event(ToProcessEvt());
+ (Param2()(evt,fsm,state)).process_event(ToProcessEvt());
+ (Param3()(evt,fsm,state)).process_event(ToProcessEvt());
+ }
+};
+
+template <class ToProcessEvt,class Param1, class Param2, class Param3, class Param4>
+struct Process_ <ToProcessEvt,Param1,Param2,Param3,Param4
+ , typename ::boost::disable_if<
+ typename ::boost::is_same<Param4,void>::type
+ >::type>
+ : euml_action<Process_<ToProcessEvt, Param1, Param2, Param3, Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
+ (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
+ (Param3()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
+ (Param4()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ (Param1()(evt,fsm,state)).process_event(ToProcessEvt());
+ (Param2()(evt,fsm,state)).process_event(ToProcessEvt());
+ (Param3()(evt,fsm,state)).process_event(ToProcessEvt());
+ (Param4()(evt,fsm,state)).process_event(ToProcessEvt());
+ }
+};
+struct process_tag {};
+struct Process_Helper: proto::extends< proto::terminal<process_tag>::type, Process_Helper, sm_domain>
+{
+ using proto::extends< proto::terminal<process_tag>::type, Process_Helper, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Process_<Arg1,Arg2,Arg3,Arg4,Arg5> type;
+ };
+};
+Process_Helper const process_;
+
+template <class ToProcessEvt,class Value,class Param1=void, class Param2=void, class Param3=void, class Enable=void >
+struct Process2_ : euml_action<Process2_<ToProcessEvt,Value,Param1,Param2,Param3,Enable> > {};
+
+template <class ToProcessEvt,class Value,class Param1, class Param2, class Param3>
+struct Process2_ <ToProcessEvt,Value,Param1,Param2,Param3
+ , typename ::boost::enable_if<typename ::boost::is_same<Param1,void>::type >::type>
+ : euml_action<Process2_<ToProcessEvt,Value, Param1, Param2, Param3 > >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ fsm.process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ fsm.process_event(ToProcessEvt(Value()(evt,fsm,state)));
+ }
+};
+
+template <class ToProcessEvt,class Value,class Param1, class Param2, class Param3>
+struct Process2_ <ToProcessEvt,Value,Param1,Param2,Param3
+ , typename ::boost::disable_if<
+ typename ::boost::mpl::or_<
+ typename ::boost::is_same<Param1,void>::type,
+ typename ::boost::mpl::not_<typename ::boost::is_same<Param2,void>::type>::type
+ >::type
+ >::type>
+ : euml_action<Process2_<ToProcessEvt,Value, Param1, Param2, Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ (Param1()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
+ }
+};
+
+template <class ToProcessEvt,class Value,class Param1, class Param2, class Param3>
+struct Process2_ <ToProcessEvt,Value,Param1,Param2,Param3
+ , typename ::boost::disable_if<
+ typename ::boost::mpl::or_<
+ typename ::boost::is_same<Param2,void>::type,
+ typename ::boost::mpl::not_<typename ::boost::is_same<Param3,void>::type>::type
+ >::type
+ >::type>
+ : euml_action<Process2_<ToProcessEvt,Value, Param1, Param2, Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
+ (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ (Param1()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
+ (Param2()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
+ }
+};
+
+
+template <class ToProcessEvt,class Value,class Param1, class Param2, class Param3>
+struct Process2_ <ToProcessEvt,Value,Param1,Param2,Param3
+ , typename ::boost::disable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type>
+ : euml_action<Process2_<ToProcessEvt,Value, Param1, Param2, Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
+ (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
+ (Param3()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ (Param1()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
+ (Param2()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
+ (Param3()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
+ }
+};
+
+struct process2_tag {};
+struct Process2_Helper : proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, sm_domain>
+{
+ using proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Process2_<Arg1,Arg2,Arg3,Arg4,Arg5> type;
+ };
+};
+Process2_Helper const process2_;
+
+template <class Flag,class Param1=void, class Enable=void >
+struct Get_Flag_ : euml_action<Get_Flag_<Flag,Param1,Enable> > {};
+
+template <class Flag,class Param1>
+struct Get_Flag_ <Flag,Param1
+ , typename ::boost::enable_if<typename ::boost::is_same<Param1,void>::type >::type>
+ : euml_action<Get_Flag_<Flag, Param1> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const&,FSM& fsm,SourceState& ,TargetState& )const
+ {
+ return fsm.template is_flag_active<Flag>();
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& ,FSM& fsm,STATE& )const
+ {
+ return fsm.template is_flag_active<Flag>();
+ }
+};
+
+template <class Flag,class Param1>
+struct Get_Flag_ <Flag,Param1
+ , typename ::boost::disable_if<
+ typename ::boost::is_same<Param1,void>::type
+ >::type>
+ : euml_action<Get_Flag_<Flag, Param1> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Param1()(evt,fsm,src,tgt)).template is_flag_active<Flag>();
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ return (Param1()(evt,fsm,state)).template is_flag_active<Flag>();
+ }
+};
+
+struct get_flag_tag
+{
+};
+struct Get_Flag_Helper: proto::extends< proto::terminal<get_flag_tag>::type, Get_Flag_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Get_Flag_<Arg1,Arg2> type;
+ };
+};
+Get_Flag_Helper const is_flag_;
+
+#ifdef BOOST_MSVC
+#define MSM_EUML_FUNCTION(functor,function,function_name,result_trans,result_state) \
+ template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \
+ class Param5=void,class Param6=void,class Enable=void > \
+ struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6,Enable> > {}; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::enable_if<typename ::boost::is_same<Param1,void>::type>::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type \
+ operator()(EVT const& , FSM& ,SourceState& ,TargetState& )const { \
+ return function ();} \
+ template <class Event,class FSM,class STATE> \
+ typename state_action_result<Event,FSM,STATE>::type \
+ operator()(Event const& ,FSM& ,STATE& )const { \
+ return function ();} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param1,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param2,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(evt,fsm,src,tgt),Param2()(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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
+ ,Param4()(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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
+ ,Param4()(evt,fsm,state));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param5,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param6,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
+ ,Param4()(evt,fsm,src,tgt),Param5()(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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
+ ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::is_same<Param6,void>::type>::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
+ ,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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state),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> { 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 ;
+
+#define MSM_EUML_METHOD(functor,function,function_name,result_trans,result_state) \
+ template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \
+ class Param5=void,class Param6=void,class Enable=void > \
+ struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6,Enable> > {}; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::enable_if<typename ::boost::is_same<Param2,void>::type>::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function();} \
+ 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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return (Param1()(evt,fsm,state)).function();} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function(Param2()(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 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));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(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 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));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
+ ,Param4()(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 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));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param5,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param6,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
+ ,Param4()(evt,fsm,src,tgt),Param5()(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 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));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
+ struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
+ typename ::boost::disable_if<typename ::boost::is_same<Param6,void>::type>::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
+ ,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 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> { 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 ;
+
+#else
+
+#define MSM_EUML_FUNCTION(functor,function,function_name,result_trans,result_state) \
+ template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \
+ class Param5=void,class Enable=void > \
+ struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Enable> > {}; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5> \
+ struct functor<Param1,Param2,Param3,Param4,Param5, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param1,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param2,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5> \
+ struct functor<Param1,Param2,Param3,Param4,Param5, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(evt,fsm,src,tgt),Param2()(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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5> \
+ struct functor<Param1,Param2,Param3,Param4,Param5, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5> \
+ struct functor<Param1,Param2,Param3,Param4,Param5, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
+ ,Param4()(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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
+ ,Param4()(evt,fsm,state));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5> \
+ struct functor<Param1,Param2,Param3,Param4,Param5, \
+ typename ::boost::disable_if<typename ::boost::is_same<Param5,void>::type>::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
+ ,Param4()(evt,fsm,src,tgt),Param5()(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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
+ ,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> { 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 ;
+
+#define MSM_EUML_METHOD(functor,function,function_name,result_trans,result_state) \
+ template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \
+ class Param5=void,class Enable=void > \
+ struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Enable> > {}; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5> \
+ struct functor<Param1,Param2,Param3,Param4,Param5, \
+ typename ::boost::enable_if<typename ::boost::is_same<Param2,void>::type>::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function();} \
+ 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 state_action_result<Event,FSM,STATE>::type >::type \
+ operator()(Event const& evt,FSM& fsm,STATE& state )const { \
+ return (Param1()(evt,fsm,state)).function();} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5> \
+ struct functor<Param1,Param2,Param3,Param4,Param5, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function(Param2()(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 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));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5> \
+ struct functor<Param1,Param2,Param3,Param4,Param5, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(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 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));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5> \
+ struct functor<Param1,Param2,Param3,Param4,Param5, \
+ typename ::boost::disable_if<typename ::boost::mpl::or_< \
+ typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \
+ typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
+ ,Param4()(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 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));} }; \
+ template <class Param1, class Param2, class Param3, class Param4, class Param5> \
+ struct functor<Param1,Param2,Param3,Param4,Param5, \
+ typename ::boost::disable_if<typename ::boost::is_same<Param5,void>::type>::type> \
+ : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
+ template <class Event,class FSM,class STATE > struct state_action_result { \
+ typedef result_state type;} ; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ struct transition_action_result { typedef result_trans type;}; \
+ typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
+ template <class EVT,class FSM,class SourceState,class TargetState> \
+ typename ::boost::enable_if<typename ::boost::mpl::has_key< \
+ typename Param1::tag_type,boost::msm::front::action_tag>::type, \
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
+ return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
+ ,Param4()(evt,fsm,src,tgt),Param5()(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 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));} }; \
+ struct function_name ## tag{}; \
+ struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \
+ functor ## Helper , sm_domain> { 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 ;
+
+#endif
+
+#define RESULT_TYPE2_PARAM1 typename get_result_type2<Param1,Event,FSM,STATE>::type
+#define RESULT_TYPE_PARAM1 typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type
+#define RESULT_TYPE2_PARAM2 typename get_result_type2<Param2,Event,FSM,STATE>::type
+#define RESULT_TYPE_PARAM2 typename get_result_type<Param2,EVT,FSM,SourceState,TargetState>::type
+#define RESULT_TYPE2_PARAM3 typename get_result_type2<Param3,Event,FSM,STATE>::type
+#define RESULT_TYPE_PARAM3 typename get_result_type<Param3,EVT,FSM,SourceState,TargetState>::type
+#define RESULT_TYPE2_PARAM4 typename get_result_type2<Param4,Event,FSM,STATE>::type
+#define RESULT_TYPE_PARAM4 typename get_result_type<Param4,EVT,FSM,SourceState,TargetState>::type
+#define RESULT_TYPE2_PARAM5 typename get_result_type2<Param5,Event,FSM,STATE>::type
+#define RESULT_TYPE_PARAM5 typename get_result_type<Param5,EVT,FSM,SourceState,TargetState>::type
+#define RESULT_TYPE2_PARAM6 typename get_result_type2<Param6,Event,FSM,STATE>::type
+#define RESULT_TYPE_PARAM6 typename get_result_type<Param6,EVT,FSM,SourceState,TargetState>::type
+
+
+#define RESULT_TYPE2_DIFF_TYPE_ITER_TRAITS_PARAM1 typename std::iterator_traits<typename get_result_type2<Param1,Event,FSM,STATE>::type>::difference_type
+#define RESULT_TYPE_DIFF_TYPE_ITER_TRAITS_PARAM1 typename std::iterator_traits<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::difference_type
+
+#define RESULT_TYPE2_REMOVE_REF_PARAM1 typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type
+#define RESULT_TYPE_REMOVE_REF_PARAM1 typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type
+
+#define RESULT_TYPE2_PAIR_REMOVE_REF_PARAM1 std::pair<RESULT_TYPE2_REMOVE_REF_PARAM1,RESULT_TYPE2_REMOVE_REF_PARAM1>
+#define RESULT_TYPE_PAIR_REMOVE_REF_PARAM1 std::pair<RESULT_TYPE_REMOVE_REF_PARAM1,RESULT_TYPE_REMOVE_REF_PARAM1>
+
+#define RESULT_TYPE2_GET_REF_REMOVE_REF_PARAM1 typename get_reference<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type
+#define RESULT_TYPE_GET_REF_REMOVE_REF_PARAM1 typename get_reference<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type
+
+#define RESULT_TYPE2_GET_ITERATOR_REMOVE_REF_PARAM1 typename get_iterator<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type
+#define RESULT_TYPE_GET_ITERATOR_REMOVE_REF_PARAM1 typename get_iterator<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type
+
+#define RESULT_TYPE2_GET_REV_ITERATOR_REMOVE_REF_PARAM1 typename get_reverse_iterator<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type
+#define RESULT_TYPE_GET_REV_ITERATOR_REMOVE_REF_PARAM1 typename get_reverse_iterator<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type
+
+#define RESULT_TYPE2_GET_SIZE_TYPE_REMOVE_REF_PARAM1 typename get_size_type<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type
+#define RESULT_TYPE_GET_SIZE_TYPE_REMOVE_REF_PARAM1 typename get_size_type<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type
+
+}}}} // boost::msm::front::euml
+
+#endif // BOOST_MSM_FRONT_EUML_COMMON_H

Added: sandbox/msm/boost/msm/front/euml/container.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/container.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,4210 @@
+// 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_FRONT_EUML_CONTAINER_H
+#define BOOST_MSM_FRONT_EUML_CONTAINER_H
+
+#include <utility>
+#include <boost/utility/enable_if.hpp>
+#include <boost/mpl/has_key.hpp>
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/proto/core.hpp>
+#include <boost/msm/front/euml/common.hpp>
+#include <boost/msm/front/euml/operator.hpp>
+#include <boost/type_traits.hpp>
+
+BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator_category)
+
+namespace boost { namespace msm { namespace front { namespace euml
+{
+
+template <class T>
+struct Front_ : euml_action<Front_<T> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_reference<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_reference<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).front();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).front();
+ }
+};
+
+struct front_tag {};
+struct Front_Helper: proto::extends< proto::terminal<front_tag>::type, Front_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Front_<Arg1> type;
+ };
+};
+Front_Helper const front_;
+
+template <class T>
+struct Back_ : euml_action<Back_<T> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_reference<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_reference<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).back();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).back();
+ }
+};
+
+struct back_tag {};
+struct Back_Helper: proto::extends< proto::terminal<back_tag>::type, Back_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Back_<Arg1> type;
+ };
+};
+Back_Helper const back_;
+
+template <class T>
+struct Begin_ : euml_action<Begin_<T> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).begin();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).begin();
+ }
+};
+
+struct begin_tag {};
+struct Begin_Helper: proto::extends< proto::terminal<begin_tag>::type, Begin_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Begin_<Arg1> type;
+ };
+};
+Begin_Helper const begin_;
+
+template <class T>
+struct End_ : euml_action<End_<T> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).end();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).end();
+ }
+};
+struct end_tag {};
+struct End_Helper: proto::extends< proto::terminal<end_tag>::type, End_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef End_<Arg1> type;
+ };
+};
+End_Helper const end_;
+
+template <class T>
+struct RBegin_ : euml_action<RBegin_<T> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_reverse_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_reverse_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).rbegin();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).rbegin();
+ }
+};
+
+struct rbegin_tag {};
+struct RBegin_Helper: proto::extends< proto::terminal<rbegin_tag>::type, RBegin_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef RBegin_<Arg1> type;
+ };
+};
+RBegin_Helper const rbegin_;
+
+template <class T>
+struct REnd_ : euml_action<REnd_<T> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_reverse_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_reverse_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).rend();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).rend();
+ }
+};
+struct rend_tag {};
+struct REnd_Helper: proto::extends< proto::terminal<rend_tag>::type, REnd_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef REnd_<Arg1> type;
+ };
+};
+REnd_Helper const rend_;
+
+template <class Container,class Element>
+struct Push_Back_ : euml_action<Push_Back_<Container,Element> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).push_back(Element()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).push_back(Element()(evt,fsm,state));
+ }
+};
+struct push_back_tag {};
+struct Push_Back_Helper: proto::extends< proto::terminal<push_back_tag>::type, Push_Back_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Push_Back_<Arg1,Arg2> type;
+ };
+};
+Push_Back_Helper const push_back_;
+
+template <class Container>
+struct Pop_Back_ : euml_action<Pop_Back_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).pop_back();
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).pop_back();
+ }
+};
+struct pop_back_tag {};
+struct Pop_Back_Helper: proto::extends< proto::terminal<pop_back_tag>::type, Pop_Back_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Pop_Back_<Arg1> type;
+ };
+};
+Pop_Back_Helper const pop_back_;
+
+template <class Container,class Element>
+struct Push_Front_ : euml_action<Push_Front_<Container,Element> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).push_front(Element()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).push_front(Element()(evt,fsm,state));
+ }
+};
+struct push_front_tag {};
+struct Push_Front_Helper: proto::extends< proto::terminal<push_front_tag>::type, Push_Front_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Push_Front_<Arg1,Arg2> type;
+ };
+};
+Push_Front_Helper const push_front_;
+
+template <class Container>
+struct Pop_Front_ : euml_action<Pop_Front_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).pop_front();
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).pop_front();
+ }
+};
+struct pop_front_tag {};
+struct Pop_Front_Helper: proto::extends< proto::terminal<pop_front_tag>::type, Pop_Front_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Pop_Front_<Arg1> type;
+ };
+};
+Pop_Front_Helper const pop_front_;
+
+template <class Container>
+struct Clear_ : euml_action<Clear_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).clear();
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).clear();
+ }
+};
+struct clear_tag {};
+struct Clear_Helper: proto::extends< proto::terminal<clear_tag>::type, Clear_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Clear_<Arg1> type;
+ };
+};
+Clear_Helper const clear_;
+
+template <class Container>
+struct ListReverse_ : euml_action<ListReverse_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).reverse();
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).reverse();
+ }
+};
+struct list_reverse_tag {};
+struct ListReverse_Helper: proto::extends< proto::terminal<list_reverse_tag>::type, ListReverse_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef ListReverse_<Arg1> type;
+ };
+};
+ListReverse_Helper const list_reverse_;
+
+template <class Container, class Predicate, class Enable=void>
+struct ListUnique_ : euml_action<ListUnique_<Container,Predicate,Enable> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).unique();
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).unique();
+ }
+};
+template <class Container, class Predicate >
+struct ListUnique_<Container,Predicate,
+ typename ::boost::disable_if<typename ::boost::is_same<Predicate,void>::type >::type>
+ : euml_action<ListUnique_<Container,Predicate> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).unique(Predicate()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).unique(Predicate()(evt,fsm,state));
+ }
+};
+struct list_unique_tag {};
+struct ListUnique_Helper: proto::extends< proto::terminal<list_unique_tag>::type, ListUnique_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef ListUnique_<Arg1,Arg2> type;
+ };
+};
+ListUnique_Helper const list_unique_;
+
+template <class Container, class Predicate, class Enable=void>
+struct ListSort_ : euml_action<ListSort_<Container,Predicate,Enable> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).sort();
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).sort();
+ }
+};
+template <class Container, class Predicate >
+struct ListSort_<Container,Predicate,
+ typename ::boost::disable_if<typename ::boost::is_same<Predicate,void>::type >::type>
+ : euml_action<ListSort_<Container,Predicate> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).sort(Predicate()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).sort(Predicate()(evt,fsm,state));
+ }
+};
+struct list_sort_tag {};
+struct ListSort_Helper: proto::extends< proto::terminal<list_sort_tag>::type, ListSort_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef ListSort_<Arg1,Arg2> type;
+ };
+};
+ListSort_Helper const list_sort_;
+
+template <class Container>
+struct Capacity_ : euml_action<Capacity_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).capacity();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).capacity();
+ }
+};
+struct capacity_tag {};
+struct Capacity_Helper: proto::extends< proto::terminal<capacity_tag>::type, Capacity_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Capacity_<Arg1> type;
+ };
+};
+Capacity_Helper const capacity_;
+
+template <class Container>
+struct Size_ : euml_action<Size_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).size();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).size();
+ }
+};
+struct size_tag {};
+struct Size_Helper: proto::extends< proto::terminal<size_tag>::type, Size_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Size_<Arg1> type;
+ };
+};
+Size_Helper const size_;
+
+template <class Container>
+struct Max_Size_ : euml_action<Max_Size_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).max_size();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).max_size();
+ }
+};
+struct max_size_tag {};
+struct Max_Size_Helper: proto::extends< proto::terminal<max_size_tag>::type, Max_Size_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Max_Size_<Arg1> type;
+ };
+};
+Max_Size_Helper const max_size_;
+
+template <class Container, class Value>
+struct Reserve_ : euml_action<Reserve_<Container,Value> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).reserve(Value()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).reserve(Value()(evt,fsm,state));
+ }
+};
+struct reserve_tag {};
+struct Reserve_Helper: proto::extends< proto::terminal<reserve_tag>::type, Reserve_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Reserve_<Arg1,Arg2> type;
+ };
+};
+Reserve_Helper const reserve_;
+
+template <class Container, class Num, class Value ,class Enable=void >
+struct Resize_ : euml_action<Resize_<Container,Num,Value> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).resize(Num()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).resize(Num()(evt,fsm,state));
+ }
+};
+template <class Container, class Num , class Value >
+struct Resize_<Container,Num,Value,typename ::boost::disable_if<typename ::boost::is_same<Value,void>::type >::type>
+ : euml_action<Resize_<Container,Num,Value> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).resize(Num()(evt,fsm,src,tgt),Value()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).resize(Num()(evt,fsm,state),Value()(evt,fsm,state));
+ }
+};
+struct resize_tag {};
+struct Resize_Helper: proto::extends< proto::terminal<resize_tag>::type, Resize_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Resize_<Arg1,Arg2,Arg3> type;
+ };
+};
+Resize_Helper const resize_;
+
+template <class Container, class Param1, class Param2, class Param3 ,class Enable=void >
+struct Insert_ : euml_action<Insert_<Container,Param1,Param2,Param3,Enable> >
+{
+};
+// version for 2 parameters
+template <class Container, class Param1, class Param2, class Param3>
+struct Insert_ < Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::mpl::or_<typename ::boost::is_same<Param2,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >::type
+ >::type
+ >
+ : euml_action<Insert_<Container,Param1,Param2,Param3> >
+{
+ // return value will actually not be correct for set::insert(it1,it2), should be void
+ // but it's ok as nobody should call an inexistent return type
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ // version for transition + second param not an iterator (meaning that, Container is not an associative container)
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename ::boost::mpl::not_<
+ typename has_iterator_category<
+ typename Param2::template transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ >::type
+ >::type
+ >::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+
+ // version for transition + second param is an iterator (meaning that, Container is an associative container)
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename has_iterator_category<
+ typename Param2::template transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ >::type
+ >::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+
+ // version for state action + second param not an iterator (meaning that, Container is not an associative container)
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename ::boost::mpl::not_<
+ typename has_iterator_category<
+ typename Param2::template state_action_result<Event,FSM,STATE>::type
+ >::type
+ >::type
+ >::type,
+ typename state_action_result<Event,FSM,STATE>::type
+ >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+
+ // version for state action + second param is an iterator (meaning that, Container is an associative container)
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename has_iterator_category<
+ typename Param2::template state_action_result<Event,FSM,STATE>::type
+ >::type
+ >::type,
+ typename state_action_result<Event,FSM,STATE>::type
+ >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+// version for 3 parameters (sequence containers)
+template <class Container, class Param1, class Param2, class Param3 >
+struct Insert_<Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >
+ : euml_action<Insert_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state));
+ }
+};
+// version for 1 parameter (associative containers)
+template <class Container, class Param1, class Param2, class Param3>
+struct Insert_ < Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type >
+ : euml_action<Insert_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename std::pair<
+ typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type,bool> type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename std::pair<
+ typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type,bool> type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state));
+ }
+};
+
+struct insert_tag {};
+struct Insert_Helper: proto::extends< proto::terminal<insert_tag>::type, Insert_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Insert_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+Insert_Helper const insert_;
+
+template <class Container1,class Container2>
+struct Swap_ : euml_action<Swap_<Container1,Container2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container1()(evt,fsm,src,tgt)).swap(Container2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container1()(evt,fsm,state)).swap(Container2()(evt,fsm,state));
+ }
+};
+struct swap_tag {};
+struct Swap_Helper: proto::extends< proto::terminal<swap_tag>::type, Swap_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Swap_<Arg1,Arg2> type;
+ };
+};
+Swap_Helper const swap_;
+
+template <class Container, class Iterator1, class Iterator2 ,class Enable=void >
+struct Erase_ : euml_action<Erase_<Container,Iterator1,Iterator2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Iterator1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Iterator1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Iterator1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).erase(Iterator1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Iterator1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).erase(Iterator1()(evt,fsm,state));
+ }
+};
+template <class Container, class Iterator1 , class Iterator2 >
+struct Erase_<Container,Iterator1,Iterator2,
+ typename ::boost::disable_if<typename ::boost::is_same<Iterator2,void>::type >::type>
+ : euml_action<Erase_<Container,Iterator1,Iterator2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Iterator1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Iterator1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Iterator1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).erase(Iterator1()(evt,fsm,src,tgt),Iterator2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Iterator1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).erase(Iterator1()(evt,fsm,state),Iterator2()(evt,fsm,state));
+ }
+};
+struct erase_tag {};
+struct Erase_Helper: proto::extends< proto::terminal<erase_tag>::type, Erase_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Erase_<Arg1,Arg2,Arg3> type;
+ };
+};
+Erase_Helper const erase_;
+
+template <class Container>
+struct Empty_ : euml_action<Empty_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).empty();
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).empty();
+ }
+};
+struct empty_tag {};
+struct Empty_Helper: proto::extends< proto::terminal<empty_tag>::type, Empty_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Empty_<Arg1> type;
+ };
+};
+Empty_Helper const empty_;
+
+template <class Container,class Element>
+struct ListRemove_ : euml_action<ListRemove_<Container,Element> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).remove(Element()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).remove(Element()(evt,fsm,state));
+ }
+};
+struct list_remove_tag {};
+struct ListRemove_Helper: proto::extends< proto::terminal<list_remove_tag>::type, ListRemove_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef ListRemove_<Arg1,Arg2> type;
+ };
+};
+ListRemove_Helper const list_remove_;
+
+template <class Container,class Element>
+struct ListRemove_If_ : euml_action<ListRemove_If_<Container,Element> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).remove_if(Element()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).remove_if(Element()(evt,fsm,state));
+ }
+};
+struct list_remove_if_tag {};
+struct ListRemove_If_Helper: proto::extends< proto::terminal<list_remove_if_tag>::type, ListRemove_If_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef ListRemove_If_<Arg1,Arg2> type;
+ };
+};
+ListRemove_If_Helper const list_remove_if_;
+
+template <class Container, class ToMerge, class Predicate, class Enable=void>
+struct ListMerge_ : euml_action<ListMerge_<Container,ToMerge,Predicate,Enable> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).merge(ToMerge()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).merge(ToMerge()(evt,fsm,state));
+ }
+};
+template <class Container, class ToMerge, class Predicate >
+struct ListMerge_<Container,ToMerge,Predicate,
+ typename ::boost::disable_if<typename ::boost::is_same<Predicate,void>::type >::type>
+ : euml_action<ListMerge_<Container,ToMerge,Predicate> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).merge(ToMerge()(evt,fsm,src,tgt),Predicate()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).merge(ToMerge()(evt,fsm,state),Predicate()(evt,fsm,state));
+ }
+};
+struct list_merge_tag {};
+struct ListMerge_Helper: proto::extends< proto::terminal<list_merge_tag>::type, ListMerge_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef ListMerge_<Arg1,Arg2,Arg3> type;
+ };
+};
+ListMerge_Helper const list_merge_;
+
+template <class Container, class Param1, class Param2, class Param3, class Param4 ,class Enable=void >
+struct Splice_ : euml_action<Splice_<Container,Param1,Param2,Param3,Param4,Enable> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).splice(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).splice(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+template <class Container, class Param1, class Param2, class Param3, class Param4 >
+struct Splice_<Container,Param1,Param2,Param3,Param4,
+ typename ::boost::disable_if<
+ typename ::boost::mpl::or_<typename ::boost::is_same<Param3,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param4,void>::type>::type>::type >::type>
+ : euml_action<Splice_<Container,Param1,Param2,Param3,Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).splice(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).splice(Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state));
+ }
+};
+template <class Container, class Param1, class Param2, class Param3, class Param4 >
+struct Splice_<Container,Param1,Param2,Param3,Param4,
+ typename ::boost::disable_if<typename ::boost::is_same<Param4,void>::type >::type>
+ : euml_action<Splice_<Container,Param1,Param2,Param3,Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).splice(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt),Param4()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).splice(Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state),Param4()(evt,fsm,state));
+ }
+};
+struct splice_tag {};
+struct Splice_Helper: proto::extends< proto::terminal<splice_tag>::type, Splice_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Splice_<Arg1,Arg2,Arg3,Arg4,Arg5> type;
+ };
+};
+Splice_Helper const splice_;
+
+template <class Container, class Param1, class Param2, class Param3, class Enable=void >
+struct StringFind_ : euml_action<StringFind_<Container,Param1,Param2,Param3,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFind_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<StringFind_<Container,Param1,Param2,Param3> >
+
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).find(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).find(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFind_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::is_same<Param3,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >::type
+ >::type
+ >
+ : euml_action<StringFind_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).find(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).find(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFind_<
+ Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >
+ : euml_action<StringFind_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).
+ find(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).
+ find(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));
+ }
+};
+
+struct string_find_tag {};
+struct StringFind_Helper: proto::extends< proto::terminal<string_find_tag>::type, StringFind_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringFind_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+StringFind_Helper const string_find_;
+
+template <class Container, class Param1, class Param2, class Param3, class Enable=void >
+struct StringRFind_ : euml_action<StringRFind_<Container,Param1,Param2,Param3,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringRFind_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<StringRFind_<Container,Param1,Param2,Param3> >
+
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).rfind(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).rfind(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringRFind_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::is_same<Param3,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >::type
+ >::type
+ >
+ : euml_action<StringRFind_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).rfind(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).rfind(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringRFind_<
+ Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >
+ : euml_action<StringRFind_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).
+ rfind(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).
+ rfind(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));
+ }
+};
+
+struct string_rfind_tag {};
+struct StringRFind_Helper: proto::extends< proto::terminal<string_rfind_tag>::type, StringRFind_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringRFind_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+StringRFind_Helper const string_rfind_;
+
+template <class Container, class Param1, class Param2, class Param3, class Enable=void >
+struct StringFindFirstOf_ : euml_action<StringFindFirstOf_<Container,Param1,Param2,Param3,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindFirstOf_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<StringFindFirstOf_<Container,Param1,Param2,Param3> >
+
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).find_first_of(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).find_first_of(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindFirstOf_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::is_same<Param3,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >::type
+ >::type
+ >
+ : euml_action<StringFindFirstOf_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).find_first_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).find_first_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindFirstOf_<
+ Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >
+ : euml_action<StringFindFirstOf_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).
+ find_first_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).
+ find_first_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));
+ }
+};
+
+struct string_find_first_of_tag {};
+struct StringFindFirstOf_Helper:
+ proto::extends< proto::terminal<string_find_first_of_tag>::type, StringFindFirstOf_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringFindFirstOf_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+StringFindFirstOf_Helper const string_find_first_of_;
+
+template <class Container, class Param1, class Param2, class Param3, class Enable=void >
+struct StringFindFirstNotOf_ : euml_action<StringFindFirstNotOf_<Container,Param1,Param2,Param3,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindFirstNotOf_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<StringFindFirstNotOf_<Container,Param1,Param2,Param3> >
+
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).find_first_not_of(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).find_first_not_of(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindFirstNotOf_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::is_same<Param3,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >::type
+ >::type
+ >
+ : euml_action<StringFindFirstNotOf_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).find_first_not_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).find_first_not_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindFirstNotOf_<
+ Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >
+ : euml_action<StringFindFirstNotOf_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).
+ find_first_not_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).
+ find_first_not_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));
+ }
+};
+
+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>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringFindFirstNotOf_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+StringFindFirstNotOf_Helper const string_find_first_not_of_;
+
+template <class Container, class Param1, class Param2, class Param3, class Enable=void >
+struct StringFindLastOf_ : euml_action<StringFindLastOf_<Container,Param1,Param2,Param3,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindLastOf_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<StringFindLastOf_<Container,Param1,Param2,Param3> >
+
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).find_last_of(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).find_last_of(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindLastOf_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::is_same<Param3,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >::type
+ >::type
+ >
+ : euml_action<StringFindLastOf_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).find_last_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).find_last_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindLastOf_<
+ Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >
+ : euml_action<StringFindLastOf_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).
+ find_last_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).
+ find_last_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));
+ }
+};
+
+struct string_find_last_of_tag {};
+struct StringFindLastOf_Helper:
+ proto::extends< proto::terminal<string_find_last_of_tag>::type, StringFindLastOf_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringFindLastOf_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+StringFindLastOf_Helper const string_find_last_of_;
+
+template <class Container, class Param1, class Param2, class Param3, class Enable=void >
+struct StringFindLastNotOf_ : euml_action<StringFindLastNotOf_<Container,Param1,Param2,Param3,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindLastNotOf_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<StringFindLastNotOf_<Container,Param1,Param2,Param3> >
+
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).find_last_not_of(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).find_last_not_of(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindLastNotOf_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::is_same<Param3,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >::type
+ >::type
+ >
+ : euml_action<StringFindLastNotOf_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).find_last_not_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).find_last_not_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringFindLastNotOf_<
+ Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >
+ : euml_action<StringFindLastNotOf_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).
+ find_last_not_of(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).
+ find_last_not_of(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));
+ }
+};
+
+struct string_find_last_not_of_tag {};
+struct StringFindLastNotOf_Helper:
+ proto::extends< proto::terminal<string_find_last_of_tag>::type, StringFindLastNotOf_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringFindLastNotOf_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+StringFindLastNotOf_Helper const string_find_last_not_of_;
+
+template <class Container>
+struct Npos_ : euml_action<Npos_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename Container::size_type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename Container::size_type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return Container::npos;
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return Container::npos;
+ }
+};
+
+template <class Container, class Param1, class Param2, class Enable=void >
+struct Associative_Erase_ : euml_action<Associative_Erase_<Container,Param1,Param2,Enable> >
+{
+};
+// version for 1 parameter
+template <class Container, class Param1, class Param2>
+struct Associative_Erase_ < Container,Param1,Param2,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<Associative_Erase_<Container,Param1,Param2> >
+{
+ // return value will actually not be correct for set::erase(it), should be void
+ // but it's ok as nobody should call an inexistent return type
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ // version for transition + param is an iterator
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename has_iterator_category<
+ typename Param1::template transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ >::type
+ >::type,
+ void
+ >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).erase(Param1()(evt,fsm,src,tgt));
+ }
+
+ // version for state action + param is an iterator
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename has_iterator_category<
+ typename Param1::template state_action_result<Event,FSM,STATE>::type
+ >::type
+ >::type,
+ void
+ >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).erase(Param1()(evt,fsm,state));
+ }
+
+ // version for transition + param not an iterator
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename ::boost::mpl::not_<
+ typename has_iterator_category<
+ typename Param1::template transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ >::type
+ >::type
+ >::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
+ >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).erase(Param1()(evt,fsm,src,tgt));
+ }
+
+ // version for state action + param not an iterator
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename ::boost::mpl::not_<
+ typename has_iterator_category<
+ typename Param1::template state_action_result<Event,FSM,STATE>::type
+ >::type
+ >::type
+ >::type,
+ typename state_action_result<Event,FSM,STATE>::type
+ >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).erase(Param1()(evt,fsm,state));
+ }
+};
+
+
+// version for 2 parameters
+template <class Container, class Param1, class Param2>
+struct Associative_Erase_ < Container,Param1,Param2,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<Associative_Erase_<Container,Param1,Param2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ (Container()(evt,fsm,src,tgt)).erase(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ (Container()(evt,fsm,state)).erase(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+struct associative_erase_tag {};
+struct Associative_Erase_Helper: proto::extends< proto::terminal<associative_erase_tag>::type, Associative_Erase_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Associative_Erase_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+Associative_Erase_Helper const associative_erase_;
+
+
+template <class T, class Param>
+struct Associative_Find_ : euml_action<Associative_Find_<T,Param> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).find(Param()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).find(Param()(evt,fsm,state));
+ }
+};
+
+struct associative_find_tag {};
+struct Associative_Find_Helper: proto::extends< proto::terminal<associative_find_tag>::type, Associative_Find_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Associative_Find_<Arg1,Arg2> type;
+ };
+};
+Associative_Find_Helper const associative_find_;
+
+template <class Container,class Param>
+struct AssociativeCount_ : euml_action<AssociativeCount_<Container,Param> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).count(Param()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).count(Param()(evt,fsm,state));
+ }
+};
+struct associative_count_tag {};
+struct AssociativeCount_Helper: proto::extends< proto::terminal<associative_count_tag>::type, AssociativeCount_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef AssociativeCount_<Arg1,Arg2> type;
+ };
+};
+AssociativeCount_Helper const associative_count_;
+
+template <class T, class Param>
+struct Associative_Lower_Bound_ : euml_action<Associative_Lower_Bound_<T,Param> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).lower_bound(Param()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).lower_bound(Param()(evt,fsm,state));
+ }
+};
+
+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>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Associative_Lower_Bound_<Arg1,Arg2> type;
+ };
+};
+Associative_Lower_Bound_Helper const associative_lower_bound_;
+
+template <class T, class Param>
+struct Associative_Upper_Bound_ : euml_action<Associative_Upper_Bound_<T,Param> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).upper_bound(Param()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).upper_bound(Param()(evt,fsm,state));
+ }
+};
+
+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>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Associative_Upper_Bound_<Arg1,Arg2> type;
+ };
+};
+Associative_Upper_Bound_Helper const associative_upper_bound_;
+
+template <class T>
+struct First_ : euml_action<First_<T> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_first_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_first_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).first;
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).first;
+ }
+};
+
+struct first_tag {};
+struct First_Helper: proto::extends< proto::terminal<first_tag>::type, First_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef First_<Arg1> type;
+ };
+};
+First_Helper const first_;
+
+template <class T>
+struct Second_ : euml_action<Second_<T> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_second_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_second_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).second;
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).second;
+ }
+};
+
+struct second_tag {};
+struct Second_Helper: proto::extends< proto::terminal<second_tag>::type, Second_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Second_<Arg1> type;
+ };
+};
+Second_Helper const second_;
+
+template <class T, class Param>
+struct Associative_Equal_Range_ : euml_action<Associative_Equal_Range_<T,Param> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef std::pair<
+ typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type,
+ typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::type > type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef std::pair<
+ typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type,
+ typename get_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type>::type > type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T()(evt,fsm,src,tgt)).equal_range(Param()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T()(evt,fsm,state)).equal_range(Param()(evt,fsm,state));
+ }
+};
+
+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>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Associative_Equal_Range_<Arg1,Arg2> type;
+ };
+};
+Associative_Equal_Range_Helper const associative_equal_range_;
+
+template <class Container, class Param1, class Param2, class Enable=void >
+struct Substr_ : euml_action<Substr_<Container,Param1,Param2,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2>
+struct Substr_ <
+ Container,Param1,Param2,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param1,void>::type
+ >::type
+ >
+ : euml_action<Substr_<Container,Param1,Param2> >
+
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).substr();
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).substr();
+ }
+};
+
+template <class Container,class Param1, class Param2>
+struct Substr_ <
+ Container,Param1,Param2,
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::is_same<Param2,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param1,void>::type
+ >::type
+ >::type
+ >::type
+ >
+ : euml_action<Substr_<Container,Param1,Param2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).substr(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).substr(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2>
+struct Substr_<
+ Container,Param1,Param2,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<Substr_<Container,Param1,Param2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).
+ substr(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).
+ substr(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+struct substr_tag {};
+struct Substr_Helper: proto::extends< proto::terminal<substr_tag>::type, Substr_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Substr_<Arg1,Arg2,Arg3> type;
+ };
+};
+Substr_Helper const substr_;
+
+template <class Container, class Param1, class Param2, class Param3, class Param4 ,class Enable=void >
+struct StringCompare_ : euml_action<StringCompare_<Container,Param1,Param2,Param3,Param4,Enable> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef int type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef int type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).compare(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).compare(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container, class Param1, class Param2, class Param3, class Param4 >
+struct StringCompare_<Container,Param1,Param2,Param3,Param4,
+ typename ::boost::disable_if<
+ typename ::boost::mpl::or_<typename ::boost::is_same<Param2,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param3,void>::type>::type>::type >::type>
+ : euml_action<StringCompare_<Container,Param1,Param2,Param3,Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef int type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef int type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).compare(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).compare(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+template <class Container, class Param1, class Param2, class Param3, class Param4 >
+struct StringCompare_<Container,Param1,Param2,Param3,Param4,
+ typename ::boost::disable_if<
+ typename ::boost::mpl::or_<typename ::boost::is_same<Param3,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param4,void>::type>::type>::type >::type>
+ : euml_action<StringCompare_<Container,Param1,Param2,Param3,Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef int type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef int type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).compare(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).compare(Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state));
+ }
+};
+template <class Container, class Param1, class Param2, class Param3, class Param4 >
+struct StringCompare_<Container,Param1,Param2,Param3,Param4,
+ typename ::boost::disable_if<typename ::boost::is_same<Param4,void>::type >::type>
+ : euml_action<StringCompare_<Container,Param1,Param2,Param3,Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef int type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef int type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).compare(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt),Param4()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).compare(Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state),Param4()(evt,fsm,state));
+ }
+};
+struct string_compare_tag {};
+struct StringCompare_Helper: proto::extends< proto::terminal<string_compare_tag>::type, StringCompare_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringCompare_<Arg1,Arg2,Arg3,Arg4,Arg5> type;
+ };
+};
+StringCompare_Helper const string_compare_;
+
+template <class Container, class Param1, class Param2, class Param3, class Enable=void >
+struct Append_ : euml_action<Append_<Container,Param1,Param2,Param3,Enable> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).append(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).append(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container, class Param1, class Param2, class Param3 >
+struct Append_<Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::mpl::or_<typename ::boost::is_same<Param2,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param3,void>::type>::type>::type >::type>
+ : euml_action<Append_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).append(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).append(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+template <class Container, class Param1, class Param2, class Param3 >
+struct Append_<Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<typename ::boost::is_same<Param3,void>::type >::type>
+ : euml_action<Append_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).append (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).append (Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state));
+ }
+};
+struct append_tag {};
+struct Append_Helper: proto::extends< proto::terminal<append_tag>::type, Append_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Append_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+Append_Helper const append_;
+
+template <class Container, class Param1, class Param2, class Param3, class Param4 ,class Enable=void >
+struct StringInsert_ : euml_action<StringInsert_<Container,Param1,Param2,Param3,Param4,Enable> >
+{
+};
+
+template <class Container, class Param1, class Param2, class Param3, class Param4>
+struct StringInsert_ <
+ Container,Param1,Param2,Param3,Param4,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >
+ : euml_action<StringInsert_<Container,Param1,Param2,Param3,Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+template <class Container, class Param1, class Param2, class Param3, class Param4 >
+struct StringInsert_<Container,Param1,Param2,Param3,Param4,
+ typename ::boost::disable_if<
+ typename ::boost::mpl::or_<typename ::boost::is_same<Param3,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param4,void>::type>::type>::type >::type>
+ : euml_action<StringInsert_<Container,Param1,Param2,Param3,Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state));
+ }
+};
+template <class Container, class Param1, class Param2, class Param3, class Param4 >
+struct StringInsert_<Container,Param1,Param2,Param3,Param4,
+ typename ::boost::disable_if<typename ::boost::is_same<Param4,void>::type >::type>
+ : euml_action<StringInsert_<Container,Param1,Param2,Param3,Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).insert(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt),Param4()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).insert(Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state),Param4()(evt,fsm,state));
+ }
+};
+struct string_insert_tag {};
+struct StringInsert_Helper: proto::extends< proto::terminal<string_insert_tag>::type, StringInsert_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringInsert_<Arg1,Arg2,Arg3,Arg4,Arg5> type;
+ };
+};
+StringInsert_Helper const string_insert_;
+
+
+template <class Container, class Param1, class Param2, class Enable=void >
+struct StringErase_ : euml_action<StringErase_<Container,Param1,Param2,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2>
+struct StringErase_ <
+ Container,Param1,Param2,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param1,void>::type
+ >::type
+ >
+ : euml_action<StringErase_<Container,Param1,Param2> >
+
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).erase();
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).erase();
+ }
+};
+
+template <class Container,class Param1, class Param2>
+struct StringErase_ <
+ Container,Param1,Param2,
+ typename ::boost::enable_if<
+ typename ::boost::mpl::and_<
+ typename ::boost::is_same<Param2,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param1,void>::type
+ >::type
+ >::type
+ >::type
+ >
+ : euml_action<StringErase_<Container,Param1,Param2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).erase(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).erase(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2>
+struct StringErase_<
+ Container,Param1,Param2,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<StringErase_<Container,Param1,Param2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).
+ erase(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).
+ erase(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+struct string_erase_tag {};
+struct StringErase_Helper: proto::extends< proto::terminal<string_erase_tag>::type, StringErase_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringErase_<Arg1,Arg2,Arg3> type;
+ };
+};
+StringErase_Helper const string_erase_;
+
+template <class Container, class Param1, class Param2, class Param3, class Enable=void >
+struct StringAssign_ : euml_action<StringAssign_<Container,Param1,Param2,Param3,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringAssign_ <
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param2,void>::type
+ >::type
+ >
+ : euml_action<StringAssign_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).assign(Param1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).assign(Param1()(evt,fsm,state));
+ }
+};
+
+template <class Container, class Param1, class Param2, class Param3 >
+struct StringAssign_<Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::mpl::or_<typename ::boost::is_same<Param2,void>::type,
+ typename ::boost::mpl::not_<
+ typename ::boost::is_same<Param3,void>::type>::type>::type >::type>
+ : euml_action<StringAssign_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).assign(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).assign(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+template <class Container, class Param1, class Param2, class Param3 >
+struct StringAssign_<Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<typename ::boost::is_same<Param3,void>::type >::type>
+ : euml_action<StringAssign_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).assign (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).assign (Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state));
+ }
+};
+struct assign_tag {};
+struct StringAssign_Helper: proto::extends< proto::terminal<assign_tag>::type, StringAssign_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringAssign_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+StringAssign_Helper const string_assign_;
+
+template <class Container, class Param1, class Param2, class Param3, class Param4, class Enable=void >
+struct StringReplace_ : euml_action<StringReplace_<Container,Param1,Param2,Param3,Param4,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2, class Param3, class Param4>
+struct StringReplace_<Container,Param1,Param2,Param3,Param4,
+ typename ::boost::enable_if<typename ::boost::is_same<Param4,void>::type >::type>
+ : euml_action<StringReplace_<Container,Param1,Param2,Param3,Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).replace(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).replace(Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3, class Param4>
+struct StringReplace_<Container,Param1,Param2,Param3,Param4,
+ typename ::boost::disable_if<typename ::boost::is_same<Param4,void>::type >::type>
+ : euml_action<StringReplace_<Container,Param1,Param2,Param3,Param4> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Container,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).replace (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),
+ Param3()(evt,fsm,src,tgt),Param4()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).replace (Param1()(evt,fsm,state),Param2()(evt,fsm,state),
+ Param3()(evt,fsm,state),Param4()(evt,fsm,state));
+ }
+};
+struct string_replace_tag {};
+struct StringReplace_Helper: proto::extends< proto::terminal<string_replace_tag>::type, StringReplace_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringReplace_<Arg1,Arg2,Arg3,Arg4,Arg5> type;
+ };
+};
+StringReplace_Helper const string_replace_;
+
+template <class Container>
+struct CStr_ : euml_action<CStr_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::add_const<
+ typename get_value_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type>::type* type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::add_const<
+ typename get_value_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type>::type* type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).c_str();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).c_str();
+ }
+};
+struct c_str_tag {};
+struct CStr_Helper: proto::extends< proto::terminal<c_str_tag>::type, CStr_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef CStr_<Arg1> type;
+ };
+};
+CStr_Helper const c_str_;
+
+template <class Container>
+struct StringData_ : euml_action<StringData_<Container> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::add_const<
+ typename get_value_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type>::type* type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::add_const<
+ typename get_value_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type>::type* type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).data();
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Container::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).data();
+ }
+};
+struct string_data_tag {};
+struct StringData_Helper: proto::extends< proto::terminal<string_data_tag>::type, StringData_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringData_<Arg1> type;
+ };
+};
+StringData_Helper const string_data_;
+
+template <class Container, class Param1, class Param2, class Param3, class Enable=void >
+struct StringCopy_ : euml_action<StringCopy_<Container,Param1,Param2,Param3,Enable> >
+{
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringCopy_<
+ Container,Param1,Param2,Param3,
+ typename ::boost::enable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >
+ : euml_action<StringCopy_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).copy(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).copy(Param1()(evt,fsm,state),Param2()(evt,fsm,state));
+ }
+};
+
+template <class Container,class Param1, class Param2, class Param3>
+struct StringCopy_<
+ Container,Param1,Param2,Param3,
+ typename ::boost::disable_if<
+ typename ::boost::is_same<Param3,void>::type
+ >::type
+ >
+ : euml_action<StringCopy_<Container,Param1,Param2,Param3> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type2<Container,Event,FSM,STATE>::type>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_size_type<
+ typename ::boost::remove_reference<
+ typename get_result_type<Container,EVT,FSM,SourceState,TargetState>::type>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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& src,TargetState& tgt)const
+ {
+ return (Container()(evt,fsm,src,tgt)).
+ copy(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename state_action_result<Event,FSM,STATE>::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (Container()(evt,fsm,state)).
+ copy(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));
+ }
+};
+
+struct string_copy_tag {};
+struct StringCopy_Helper: proto::extends< proto::terminal<string_copy_tag>::type, StringCopy_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef StringCopy_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+StringCopy_Helper const string_copy_;
+
+}}}}
+
+#endif //BOOST_MSM_FRONT_EUML_CONTAINER_H

Added: sandbox/msm/boost/msm/front/euml/euml.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/euml.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,20 @@
+// 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_FRONT_EUML_EUML_H
+#define BOOST_MSM_FRONT_EUML_EUML_H
+
+#include <boost/msm/front/euml/common.hpp>
+#include <boost/msm/front/euml/operator.hpp>
+#include <boost/msm/front/euml/guard_grammar.hpp>
+#include <boost/msm/front/euml/state_grammar.hpp>
+#include <boost/msm/front/euml/stt_grammar.hpp>
+
+#endif //BOOST_MSM_FRONT_EUML_EUML_H
\ No newline at end of file

Added: sandbox/msm/boost/msm/front/euml/euml_typeof.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/euml_typeof.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,121 @@
+// 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_FRONT_EUML_TYPEOF_H
+#define BOOST_MSM_FRONT_EUML_TYPEOF_H
+
+#include <boost/typeof/typeof.hpp>
+
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(::boost::mpl::vector0, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(::boost::mpl::vector50, 50)
+BOOST_TYPEOF_REGISTER_TYPE(::boost::mpl::na)
+BOOST_TYPEOF_REGISTER_TEMPLATE(::boost::fusion::vector, 10)
+BOOST_TYPEOF_REGISTER_TYPE(::boost::fusion::void_)
+BOOST_TYPEOF_REGISTER_TEMPLATE(::boost::mpl::vector, 20)
+BOOST_TYPEOF_REGISTER_TYPE(std::string)
+BOOST_TYPEOF_REGISTER_TEMPLATE(::boost::mpl::size_t, (unsigned int))
+
+BOOST_TYPEOF_REGISTER_TYPE(::boost::msm::front::default_base_state)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::inherit_attributes, 1)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::func_state, 6)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::entry_func_state, (int)(typename)(typename)(typename)(typename)(typename)(typename))
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::explicit_entry_func_state, (int)(typename)(typename)(typename)(typename)(typename)(typename))
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::exit_func_state, 7)
+
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::define_flag, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::attribute, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::define_defer, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::define_init, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Source_, (int))
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Target_, (int))
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Current_, (int))
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Event_, (int))
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::State_Attribute_, (typename)(int))
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::State_Machine_, (int))
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::none)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::Row, 5)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::ActionSequence, 1)
+
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::NoAction)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::And_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Or_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Not_, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::If_Else_, 3)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::If)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::If_Then_, 2)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::If_Then)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::While_Do_, 2)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::While_)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Do_While_, 2)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Do_While_)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::For_Loop_, 4)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::For_Loop_)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Process_, 1)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Process_)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Process2_, 2)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Process2_)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Get_Flag_, 1)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Get_Flag_)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Begin_, 1)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Begin_Helper)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::End_, 1)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::End_Helper)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Deref_, 1)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Deref_Helper)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Push_Back_, 2)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Push_Back_Helper)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Clear_, 1)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Clear_Helper)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Empty_, 1)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Empty_Helper)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Find_, 2)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Find_Helper)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Npos_, 1)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::False_)
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::True_)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Int_, (int))
+BOOST_TYPEOF_REGISTER_TYPE(boost::msm::front::euml::Int)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Pre_inc_, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Pre_dec_, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Post_inc_, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Post_dec_, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Plus_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Minus_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Multiplies_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Divides_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Modulus_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Bitwise_And_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Bitwise_Or_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Bitwise_Xor_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Subscript_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Plus_Assign_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Minus_Assign_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Multiplies_Assign_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Divides_Assign_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Modulus_Assign_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::ShiftLeft_Assign_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::ShiftRight_Assign_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::ShiftLeft_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::ShiftRight_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Assign_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Unary_Plus_, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Unary_Minus_, 1)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Less_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::LessEqual_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::Greater_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::GreaterEqual_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::EqualTo_, 2)
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::msm::front::euml::NotEqualTo_, 2)
+
+#endif //BOOST_MSM_FRONT_EUML_TYPEOF_H
\ No newline at end of file

Added: sandbox/msm/boost/msm/front/euml/guard_grammar.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/guard_grammar.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,351 @@
+// 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_FRONT_EUML_GUARD_GRAMMAR_H
+#define BOOST_MSM_FRONT_EUML_GUARD_GRAMMAR_H
+
+#include <boost/proto/core.hpp>
+#include <boost/proto/transform.hpp>
+
+#include <boost/msm/front/euml/common.hpp>
+#include <boost/msm/front/euml/operator.hpp>
+#include <boost/msm/front/euml/state_grammar.hpp>
+
+namespace boost { namespace msm { namespace front { namespace euml
+{
+struct BuildGuards;
+struct BuildActions;
+
+struct BuildGuardsCases
+{
+ // The primary template matches nothing:
+ template<typename Tag>
+ struct case_
+ : proto::not_<proto::_>
+ {};
+};
+template<>
+struct BuildGuardsCases::case_<proto::tag::logical_or>
+ : proto::when<
+ proto::logical_or<BuildGuards,BuildGuards >,
+ Or_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::logical_and>
+ : proto::when<
+ proto::logical_and<BuildGuards,BuildGuards >,
+ And_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::logical_not>
+ : proto::when<
+ proto::logical_not<BuildGuards >,
+ Not_<BuildGuards(proto::_child)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::less>
+ : proto::when<
+ proto::less<BuildGuards, BuildGuards >,
+ Less_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::less_equal>
+ : proto::when<
+ proto::less_equal<BuildGuards, BuildGuards >,
+ LessEqual_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::greater>
+ : proto::when<
+ proto::greater<BuildGuards, BuildGuards >,
+ Greater_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::greater_equal>
+ : proto::when<
+ proto::greater_equal<BuildGuards, BuildGuards >,
+ GreaterEqual_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::equal_to>
+ : proto::when<
+ proto::equal_to<BuildGuards, BuildGuards >,
+ EqualTo_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::not_equal_to>
+ : proto::when<
+ proto::not_equal_to<BuildGuards, BuildGuards >,
+ NotEqualTo_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::pre_inc>
+ : proto::when<
+ proto::pre_inc<BuildGuards >,
+ Pre_inc_<BuildGuards(proto::_child)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::dereference>
+ : proto::when<
+ proto::dereference<BuildGuards >,
+ Deref_<BuildGuards(proto::_child)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::pre_dec>
+ : proto::when<
+ proto::pre_dec<BuildGuards >,
+ Pre_dec_<BuildGuards(proto::_child)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::post_inc>
+ : proto::when<
+ proto::post_inc<BuildGuards >,
+ Post_inc_<BuildGuards(proto::_child)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::post_dec>
+ : proto::when<
+ proto::post_dec<BuildGuards >,
+ Post_dec_<BuildGuards(proto::_child)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::plus>
+ : proto::when<
+ proto::plus<BuildGuards,BuildGuards >,
+ Plus_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::minus>
+ : proto::when<
+ proto::minus<BuildGuards,BuildGuards >,
+ Minus_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::multiplies>
+ : proto::when<
+ proto::multiplies<BuildGuards,BuildGuards >,
+ Multiplies_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::divides>
+ : proto::when<
+ proto::divides<BuildGuards,BuildGuards >,
+ Divides_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::modulus>
+ : proto::when<
+ proto::modulus<BuildGuards,BuildGuards >,
+ Modulus_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::bitwise_and>
+ : proto::when<
+ proto::bitwise_and<BuildGuards,BuildGuards >,
+ Bitwise_And_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::bitwise_or>
+ : proto::when<
+ proto::bitwise_or<BuildGuards,BuildGuards >,
+ Bitwise_Or_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::subscript>
+ : proto::when<
+ proto::subscript<BuildGuards,BuildGuards >,
+ Subscript_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::plus_assign>
+ : proto::when<
+ proto::plus_assign<BuildGuards,BuildGuards >,
+ Plus_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::minus_assign>
+ : proto::when<
+ proto::minus_assign<BuildGuards,BuildGuards >,
+ Minus_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::multiplies_assign>
+ : proto::when<
+ proto::multiplies_assign<BuildGuards,BuildGuards >,
+ Multiplies_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::divides_assign>
+ : proto::when<
+ proto::divides_assign<BuildGuards,BuildGuards >,
+ Divides_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::modulus_assign>
+ : proto::when<
+ proto::modulus_assign<BuildGuards,BuildGuards >,
+ Modulus_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::shift_left_assign>
+ : proto::when<
+ proto::shift_left_assign<BuildGuards,BuildGuards >,
+ ShiftLeft_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::shift_right_assign>
+ : proto::when<
+ proto::shift_right_assign<BuildGuards,BuildGuards >,
+ ShiftRight_Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::shift_left>
+ : proto::when<
+ proto::shift_left<BuildGuards,BuildGuards >,
+ ShiftLeft_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::shift_right>
+ : proto::when<
+ proto::shift_right<BuildGuards,BuildGuards >,
+ ShiftRight_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::assign>
+ : proto::when<
+ proto::assign<BuildGuards,BuildGuards >,
+ Assign_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::bitwise_xor>
+ : proto::when<
+ proto::bitwise_xor<BuildGuards,BuildGuards >,
+ Bitwise_Xor_<BuildGuards(proto::_left),BuildGuards(proto::_right)>()
+ >
+{};
+template<>
+struct BuildGuardsCases::case_<proto::tag::negate>
+ : proto::when<
+ proto::negate<BuildGuards >,
+ Unary_Minus_<BuildGuards(proto::_child)>()
+ >
+{};
+
+template<>
+struct BuildGuardsCases::case_<proto::tag::function>
+ : proto::or_<
+ proto::when<
+ proto::function<proto::terminal<if_tag>,BuildGuards,BuildGuards,BuildGuards >,
+ If_Else_<BuildGuards(proto::_child_c<1>),
+ BuildGuards(proto::_child_c<2>),
+ BuildGuards(proto::_child_c<3>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_> >,
+ get_fct<proto::_child_c<0> >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions >,
+ get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions,BuildActions >,
+ get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions >,
+ get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>)
+ ,BuildActions(proto::_child_c<2>),BuildActions(proto::_child_c<3>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions >,
+ get_fct<proto::_child_c<0>
+ ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
+ ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >,
+ get_fct<proto::_child_c<0>
+ ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
+ ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>),BuildActions(proto::_child_c<5>) >()
+ >
+#ifdef BOOST_MSVC
+ ,proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >,
+ get_fct<proto::_child_c<0>
+ ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
+ ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>)
+ ,BuildActions(proto::_child_c<5>),BuildActions(proto::_child_c<6>) >()
+ >
+#endif
+ >
+{};
+
+template<>
+struct BuildGuardsCases::case_<proto::tag::terminal>
+ : proto::or_<
+ proto::when <
+ proto::terminal<action_tag>,
+ proto::_
+ >,
+ proto::when<
+ proto::terminal<state_tag>,
+ proto::_
+ >,
+ proto::when<
+ proto::terminal<flag_tag>,
+ proto::_
+ >,
+ proto::when<
+ proto::terminal<event_tag>,
+ proto::_
+ >
+ >
+{};
+
+struct BuildGuards
+ : proto::switch_<BuildGuardsCases>
+{};
+
+}}}}
+
+#endif //BOOST_MSM_FRONT_EUML_GUARD_GRAMMAR_H

Added: sandbox/msm/boost/msm/front/euml/iteration.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/iteration.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,26 @@
+// 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_FRONT_EUML_ITERATION_H
+#define BOOST_MSM_FRONT_EUML_ITERATION_H
+
+#include <algorithm>
+#include <numeric>
+#include <boost/msm/front/euml/common.hpp>
+
+namespace boost { namespace msm { namespace front { namespace euml
+{
+
+MSM_EUML_FUNCTION(ForEach_ , std::for_each , for_each_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(Accumulate_ , std::accumulate , accumulate_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+
+}}}}
+
+#endif //BOOST_MSM_FRONT_EUML_ITERATION_H

Added: sandbox/msm/boost/msm/front/euml/operator.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/operator.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,1560 @@
+// 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_FRONT_EUML_OPERATOR_H
+#define BOOST_MSM_FRONT_EUML_OPERATOR_H
+
+#include <iterator>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/mpl/has_key.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/set.hpp>
+#include <boost/proto/core.hpp>
+#include <boost/msm/front/euml/common.hpp>
+
+BOOST_MPL_HAS_XXX_TRAIT_DEF(reference)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(key_type)
+
+namespace boost { namespace msm { namespace front { namespace euml
+{
+
+template <class T1,class T2>
+struct Or_ : euml_action<Or_<T1,T2> >
+{
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)
+ {
+ return (T1()(evt,fsm,src,tgt) || T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state)
+ {
+ return (T1()(evt,fsm,state) || T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct And_ : euml_action<And_<T1,T2> >
+{
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)
+ {
+ return (T1()(evt,fsm,src,tgt) && T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state)
+ {
+ return (T1()(evt,fsm,state) && T2()(evt,fsm,state));
+ }
+};
+template <class T1>
+struct Not_ : euml_action<Not_<T1> >
+{
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)
+ {
+ return !(T1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state)
+ {
+ return !(T1()(evt,fsm,state));
+ }
+};
+
+template <class Condition,class Action1,class Action2, class Enable=void >
+struct If_Else_ : euml_action<If_Else_<Condition,Action1,Action2,Enable> > {};
+
+template <class Condition,class Action1,class Action2>
+struct If_Else_<Condition,Action1,Action2
+ , typename ::boost::enable_if<typename has_tag_type<Action1>::type >::type>
+ : euml_action<If_Else_<Condition,Action1,Action2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Action1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Action1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Action1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ if (Condition()(evt,fsm,src,tgt))
+ {
+ return Action1()(evt,fsm,src,tgt);
+ }
+ return Action2()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Action1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ if (Condition()(evt,fsm,state))
+ {
+ return Action1()(evt,fsm,state);
+ }
+ return Action2()(evt,fsm,state);
+ }
+};
+
+template <class Condition,class Action1,class Action2>
+struct If_Else_<Condition,Action1,Action2
+ , typename ::boost::disable_if<typename has_tag_type<Action1>::type >::type>
+ : euml_action<If_Else_<Condition,Action1,Action2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ if (Condition()(evt,fsm,src,tgt))
+ {
+ return Action1()(evt,fsm,src,tgt);
+ }
+ return Action2()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ if (Condition()(evt,fsm,state))
+ {
+ return Action1()(evt,fsm,state);
+ }
+ return Action2()(evt,fsm,state);
+ }
+};
+
+struct if_tag
+{
+};
+struct If : proto::extends<proto::terminal<if_tag>::type, If, sm_domain>
+{
+ using proto::extends< proto::terminal<if_tag>::type, If, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef If_Else_<Arg1,Arg2,Arg3> type;
+ };
+};
+If const if_then_else_;
+
+template <class Condition,class Action1, class Enable=void >
+struct If_Then_ : euml_action<If_Then_<Condition,Action1,Enable> > {};
+
+template <class Condition,class Action1>
+struct If_Then_<Condition,Action1
+ , typename ::boost::enable_if<typename has_tag_type<Action1>::type >::type>
+ : euml_action<If_Then_<Condition,Action1> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Action1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Action1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Action1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ if (Condition()(evt,fsm,src,tgt))
+ {
+ return Action1()(evt,fsm,src,tgt);
+ }
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Action1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ if (Condition()(evt,fsm,state))
+ {
+ return Action1()(evt,fsm,state);
+ }
+ }
+};
+
+template <class Condition,class Action1>
+struct If_Then_<Condition,Action1
+ , typename ::boost::disable_if<typename has_tag_type<Action1>::type >::type>
+ : euml_action<If_Then_<Condition,Action1> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ if (Condition()(evt,fsm,src,tgt))
+ {
+ return Action1()(evt,fsm,src,tgt);
+ }
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ if (Condition()(evt,fsm,state))
+ {
+ return Action1()(evt,fsm,state);
+ }
+ }
+};
+struct if_then_tag
+{
+};
+struct If_Then : proto::extends< proto::terminal<if_then_tag>::type, If_Then, sm_domain>
+{
+ using proto::extends< proto::terminal<if_then_tag>::type, If_Then, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef If_Then_<Arg1,Arg2> type;
+ };
+};
+If_Then const if_then_;
+
+template <class Condition,class Body>
+struct While_Do_ : euml_action<While_Do_<Condition,Body> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ Body body_;
+ Condition cond_;
+ while (cond_(evt,fsm,src,tgt))
+ {
+ body_(evt,fsm,src,tgt);
+ }
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ Body body_;
+ Condition cond_;
+ while (cond_(evt,fsm,state))
+ {
+ body_(evt,fsm,state);
+ }
+ }
+};
+struct while_do_tag
+{
+};
+struct While_Do_Helper : proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, sm_domain>
+{
+ using proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef While_Do_<Arg1,Arg2> type;
+ };
+};
+While_Do_Helper const while_;
+
+template <class Condition,class Body>
+struct Do_While_ : euml_action<Do_While_<Condition,Body> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ Condition cond_;
+ Body body_;
+ do
+ {
+ body_(evt,fsm,src,tgt);
+ } while (cond_(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ Condition cond_;
+ Body body_;
+ do
+ {
+ body_(evt,fsm,state);
+ } while (cond_(evt,fsm,state));
+ }
+};
+struct do_while_tag
+{
+};
+struct Do_While_Helper : proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, sm_domain>
+{
+ using proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Do_While_<Arg1,Arg2> type;
+ };
+};
+Do_While_Helper const do_while_;
+
+template <class Begin,class End,class EndLoop,class Body>
+struct For_Loop_ : euml_action<For_Loop_<Begin,End,EndLoop,Body> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ End end_;
+ EndLoop end_loop_;
+ Body body_;
+ for(Begin()(evt,fsm,src,tgt);end_(evt,fsm,src,tgt);end_loop_(evt,fsm,src,tgt))
+ {
+ body_(evt,fsm,src,tgt);
+ }
+ }
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ End end_;
+ EndLoop end_loop_;
+ Body body_;
+ for(Begin()(evt,fsm,state);end_(evt,fsm,state);end_loop_(evt,fsm,state))
+ {
+ body_(evt,fsm,state);
+ }
+ }
+};
+struct for_loop_tag
+{
+};
+struct For_Loop_Helper : proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, sm_domain>
+{
+ using proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, sm_domain>::operator=;
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef For_Loop_<Arg1,Arg2,Arg3,Arg4> type;
+ };
+};
+For_Loop_Helper const for_;
+
+
+
+
+template <class T>
+struct Deref_ : euml_action<Deref_<T> >
+{
+ using euml_action<Deref_<T> >::operator=;
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::add_reference<
+ typename std::iterator_traits <
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type>::value_type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::add_reference<
+ typename std::iterator_traits<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type
+ >::value_type
+ >::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return *(T()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return *(T()(evt,fsm,state));
+ }
+};
+
+template <class T>
+struct Pre_inc_ : euml_action<Pre_inc_<T> >
+{
+ using euml_action<Pre_inc_<T> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return ++T()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return ++T()(evt,fsm,state);
+ }
+};
+template <class T>
+struct Pre_dec_ : euml_action<Pre_dec_<T> >
+{
+ using euml_action<Pre_dec_<T> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return --T()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return --T()(evt,fsm,state);
+ }
+};
+template <class T>
+struct Post_inc_ : euml_action<Post_inc_<T> >
+{
+ using euml_action<Post_inc_<T> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T()(evt,fsm,src,tgt)++;
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T()(evt,fsm,state)++;
+ }
+};
+template <class T>
+struct Post_dec_ : euml_action<Post_dec_<T> >
+{
+ using euml_action<Post_dec_<T> >::operator=;
+
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T()(evt,fsm,src,tgt)--;
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T()(evt,fsm,state)--;
+ }
+};
+
+template <class T1,class T2>
+struct Plus_ : euml_action<Plus_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T1()(evt,fsm,src,tgt)+T2()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T1()(evt,fsm,state)+T2()(evt,fsm,state);
+ }
+};
+template <class T1,class T2>
+struct Minus_ : euml_action<Minus_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T1()(evt,fsm,src,tgt)-T2()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T1()(evt,fsm,state)-T2()(evt,fsm,state);
+ }
+};
+template <class T1,class T2>
+struct Multiplies_ : euml_action<Multiplies_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T1()(evt,fsm,src,tgt)*T2()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T1()(evt,fsm,state)*T2()(evt,fsm,state);
+ }
+};
+template <class T1,class T2>
+struct Divides_ : euml_action<Divides_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T1()(evt,fsm,src,tgt)/T2()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T1()(evt,fsm,state)/T2()(evt,fsm,state);
+ }
+};
+template <class T1,class T2>
+struct Modulus_ : euml_action<Modulus_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T1()(evt,fsm,src,tgt)%T2()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T1()(evt,fsm,state)%T2()(evt,fsm,state);
+ }
+};
+template <class T1,class T2>
+struct Bitwise_And_ : euml_action<Bitwise_And_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T1()(evt,fsm,src,tgt)&T2()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T1()(evt,fsm,state)&T2()(evt,fsm,state);
+ }
+};
+template <class T1,class T2>
+struct Bitwise_Or_ : euml_action<Bitwise_Or_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T1()(evt,fsm,src,tgt)|T2()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T1()(evt,fsm,state)|T2()(evt,fsm,state);
+ }
+};
+template <class T1,class T2>
+struct Bitwise_Xor_ : euml_action<Bitwise_Xor_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T1()(evt,fsm,src,tgt)^T2()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T1()(evt,fsm,state)^T2()(evt,fsm,state);
+ }
+};
+template <class T1,class T2>
+struct Subscript_ : euml_action<Subscript_<T1,T2> >
+{
+ template <class T>
+ struct get_reference
+ {
+ typedef typename T::reference type;
+ };
+ template <class T>
+ struct get_mapped_type
+ {
+ typedef typename T::value_type::second_type& type;
+ };
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type container_type;
+ typedef typename ::boost::mpl::eval_if<
+ typename has_key_type<container_type>::type,
+ get_mapped_type<container_type>,
+ ::boost::mpl::eval_if<
+ typename ::boost::is_pointer<container_type>::type,
+ ::boost::add_reference<typename ::boost::remove_pointer<container_type>::type >,
+ get_reference<container_type>
+ >
+ >::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type container_type;
+ typedef typename ::boost::mpl::eval_if<
+ typename has_key_type<container_type>::type,
+ get_mapped_type<container_type>,
+ ::boost::mpl::eval_if<
+ typename ::boost::is_pointer<container_type>::type,
+ ::boost::add_reference<typename ::boost::remove_pointer<container_type>::type >,
+ get_reference<container_type>
+ >
+ >::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return T1()(evt,fsm,src,tgt)[T2()(evt,fsm,src,tgt)];
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return T1()(evt,fsm,state)[T2()(evt,fsm,state)];
+ }
+};
+template <class T1,class T2>
+struct Plus_Assign_ : euml_action<Plus_Assign_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt)+=T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T1()(evt,fsm,state)+=T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct Minus_Assign_ : euml_action<Minus_Assign_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt)-=T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T1()(evt,fsm,state)-=T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct Multiplies_Assign_ : euml_action<Multiplies_Assign_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt)*=T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T1()(evt,fsm,state)*=T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct Divides_Assign_ : euml_action<Divides_Assign_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt)/=T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T1()(evt,fsm,state)/=T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct Modulus_Assign_ : euml_action<Modulus_Assign_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt)%=T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T1()(evt,fsm,state)%=T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct ShiftLeft_Assign_ : euml_action<ShiftLeft_Assign_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt)<<=T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T1()(evt,fsm,state)<<=T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct ShiftRight_Assign_ : euml_action<ShiftRight_Assign_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt)>>=T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T1()(evt,fsm,state)>>=T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct ShiftLeft_ : euml_action<ShiftLeft_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt)<<T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T1()(evt,fsm,state)<<T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct ShiftRight_ : euml_action<ShiftRight_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt)>>T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T1()(evt,fsm,state)>>T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct Assign_ : euml_action<Assign_<T1,T2> >
+{
+ using euml_action< Assign_<T1,T2> >::operator=;
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt)=T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return (T1()(evt,fsm,state)=T2()(evt,fsm,state));
+ }
+};
+template <class T1>
+struct Unary_Plus_ : euml_action<Unary_Plus_<T1> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return +T1()(evt,fsm,src,tgt);
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return +T1()(evt,fsm,state);
+ }
+};
+template <class T1>
+struct Unary_Minus_ : euml_action<Unary_Minus_<T1> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename ::boost::remove_reference<
+ typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return -(T1()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return -(T1()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct Less_ : euml_action<Less_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt) < T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ return (T1()(evt,fsm,state) < T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct LessEqual_ : euml_action<LessEqual_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt) <= T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ return (T1()(evt,fsm,state) <= T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct Greater_ : euml_action<Greater_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt) > T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ return (T1()(evt,fsm,state) > T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct GreaterEqual_ : euml_action<GreaterEqual_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt) >= T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ return (T1()(evt,fsm,state) >= T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct EqualTo_ : euml_action<EqualTo_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt) == T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ return (T1()(evt,fsm,state) == T2()(evt,fsm,state));
+ }
+};
+template <class T1,class T2>
+struct NotEqualTo_ : euml_action<NotEqualTo_<T1,T2> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef bool type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef bool type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return (T1()(evt,fsm,src,tgt) != T2()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ bool operator()(Event const& evt,FSM& fsm,STATE& state)const
+ {
+ return (T1()(evt,fsm,state) != T2()(evt,fsm,state));
+ }
+};
+
+}}}}
+
+#endif // BOOST_MSM_FRONT_EUML_OPERATOR_H

Added: sandbox/msm/boost/msm/front/euml/querying.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/querying.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,43 @@
+// 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_FRONT_EUML_QUERYING_H
+#define BOOST_MSM_FRONT_EUML_QUERYING_H
+
+#include <algorithm>
+#include <boost/msm/front/euml/common.hpp>
+
+namespace boost { namespace msm { namespace front { namespace euml
+{
+
+MSM_EUML_FUNCTION(Find_ , std::find , find_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(FindIf_ , std::find_if , find_if_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(LowerBound_ , std::lower_bound , lower_bound_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(UpperBound_ , std::upper_bound , upper_bound_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(BinarySearch_ , std::binary_search , binary_search_ , bool , bool )
+MSM_EUML_FUNCTION(MinElement_ , std::min_element , min_element_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(MaxElement_ , std::max_element , max_element_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(AdjacentFind_ , std::adjacent_find , adjacent_find_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(FindEnd_ , std::find_end , find_end_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(FindFirstOf_ , std::find_first_of , find_first_of_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(Equal_ , std::equal , equal_ , bool , bool )
+MSM_EUML_FUNCTION(Search_ , std::search , search_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(Includes_ , std::includes , includes_ , bool , bool )
+MSM_EUML_FUNCTION(LexicographicalCompare_ , std::lexicographical_compare , lexicographical_compare_ , bool , bool )
+MSM_EUML_FUNCTION(Count_ , std::count , count_ , RESULT_TYPE_DIFF_TYPE_ITER_TRAITS_PARAM1 , RESULT_TYPE2_DIFF_TYPE_ITER_TRAITS_PARAM1 )
+MSM_EUML_FUNCTION(CountIf_ , std::count_if , count_if_ , RESULT_TYPE_DIFF_TYPE_ITER_TRAITS_PARAM1 , RESULT_TYPE2_DIFF_TYPE_ITER_TRAITS_PARAM1 )
+MSM_EUML_FUNCTION(Distance_ , std::distance , distance_ , RESULT_TYPE_DIFF_TYPE_ITER_TRAITS_PARAM1 , RESULT_TYPE2_DIFF_TYPE_ITER_TRAITS_PARAM1 )
+MSM_EUML_FUNCTION(EqualRange_ , std::equal_range , equal_range_ , RESULT_TYPE_PAIR_REMOVE_REF_PARAM1 , RESULT_TYPE2_PAIR_REMOVE_REF_PARAM1 )
+MSM_EUML_FUNCTION(Mismatch_ , std::mismatch , mismatch_ , RESULT_TYPE_PAIR_REMOVE_REF_PARAM1 , RESULT_TYPE2_PAIR_REMOVE_REF_PARAM1 )
+
+
+}}}}
+
+#endif //BOOST_MSM_FRONT_EUML_QUERYING_H

Added: sandbox/msm/boost/msm/front/euml/state_grammar.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/state_grammar.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,1637 @@
+// 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_FRONT_EUML_STATE_GRAMMAR_H
+#define BOOST_MSM_FRONT_EUML_STATE_GRAMMAR_H
+
+#include <boost/proto/core.hpp>
+#include <boost/proto/transform.hpp>
+#include <boost/fusion/container/vector.hpp>
+#include <boost/mpl/remove_if.hpp>
+#include <boost/mpl/eval_if.hpp>
+
+#include <boost/msm/row_tags.hpp>
+#include <boost/msm/front/common_states.hpp>
+#include <boost/msm/front/state_machine_def.hpp>
+#include <boost/msm/front/euml/common.hpp>
+#include <boost/msm/front/euml/operator.hpp>
+#include <boost/msm/front/euml/guard_grammar.hpp>
+
+BOOST_MPL_HAS_XXX_TRAIT_DEF(attribute_tag)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(flag_create_tag)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(defer_create_tag)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(control_configure_tag)
+
+namespace proto = boost::proto;
+
+namespace boost { namespace msm { namespace front { namespace euml
+{
+
+// provides the typedefs and interface. Concrete states derive from it.
+template<class EntryFunctor=NoAction,
+ class ExitFunctor=NoAction,
+ class Attributes= ::boost::fusion::vector<>,
+ class Flags = ::boost::mpl::vector0<>,
+ class Defer = ::boost::mpl::vector0<>,
+ class BASE = default_base_state>
+struct func_state : public ::boost::msm::front::state_base<BASE,Attributes>,
+ euml_state<func_state<EntryFunctor,ExitFunctor,Attributes,Flags,Defer,BASE> >
+{
+ // grammar testing
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<EntryFunctor,invalid_type> ));
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<ExitFunctor,invalid_type> ));
+
+ // flags
+ typedef Flags flag_list;
+ // deferred events
+ typedef Defer deferred_events;
+
+ template <class Event,class FSM>
+ void on_entry(Event const& evt,FSM& fsm)
+ {
+ EntryFunctor()(evt,fsm,*this);
+ }
+ template <class Event,class FSM>
+ void on_exit(Event const& evt,FSM& fsm)
+ {
+ ExitFunctor()(evt,fsm,*this);
+ }
+};
+
+// provides the typedefs and interface. Concrete states derive from it.
+template<int ZoneIndex=-1,
+ class EntryFunctor=NoAction,
+ class ExitFunctor=NoAction,
+ class Attributes= ::boost::fusion::vector<>,
+ class Flags = ::boost::mpl::vector0<>,
+ class Defer = ::boost::mpl::vector0<>,
+ class BASE = default_base_state>
+struct entry_func_state : public ::boost::msm::front::state_base<BASE,Attributes>,
+ euml_state<entry_func_state<ZoneIndex,EntryFunctor,ExitFunctor,Attributes,Flags,Defer,BASE> >
+{
+ // grammar testing
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<EntryFunctor,invalid_type> ));
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<ExitFunctor,invalid_type> ));
+
+ // tags
+ typedef int pseudo_entry;
+ enum {zone_index=ZoneIndex};
+ typedef int explicit_entry_state;
+
+ // flags
+ typedef Flags flag_list;
+ // deferred events
+ typedef Defer deferred_events;
+
+ template <class Event,class FSM>
+ void on_entry(Event const& evt,FSM& fsm)
+ {
+ EntryFunctor()(evt,fsm,*this);
+ }
+ template <class Event,class FSM>
+ void on_exit(Event const& evt,FSM& fsm)
+ {
+ ExitFunctor()(evt,fsm,*this);
+ }
+};
+// provides the typedefs and interface. Concrete states derive from it.
+template<int ZoneIndex=-1,
+ class EntryFunctor=NoAction,
+ class ExitFunctor=NoAction,
+ class Attributes= ::boost::fusion::vector<>,
+ class Flags = ::boost::mpl::vector0<>,
+ class Defer = ::boost::mpl::vector0<>,
+ class BASE = default_base_state>
+struct explicit_entry_func_state : public ::boost::msm::front::state_base<BASE,Attributes>,
+ public ::boost::msm::front::explicit_entry<ZoneIndex>,
+ euml_state<explicit_entry_func_state<
+ ZoneIndex,EntryFunctor,ExitFunctor,Attributes,Flags,Defer,BASE> >
+{
+ // grammar testing
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<EntryFunctor,invalid_type> ));
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<ExitFunctor,invalid_type> ));
+
+ // flags
+ typedef Flags flag_list;
+ // deferred events
+ typedef Defer deferred_events;
+
+ template <class Event,class FSM>
+ void on_entry(Event const& evt,FSM& fsm)
+ {
+ EntryFunctor()(evt,fsm,*this);
+ }
+ template <class Event,class FSM>
+ void on_exit(Event const& evt,FSM& fsm)
+ {
+ ExitFunctor()(evt,fsm,*this);
+ }
+};
+
+// provides the typedefs and interface. Concrete states derive from it.
+template<class Event,
+ class EntryFunctor=NoAction,
+ class ExitFunctor=NoAction,
+ class Attributes= ::boost::fusion::vector<>,
+ class Flags = ::boost::mpl::vector0<>,
+ class Defer = ::boost::mpl::vector0<>,
+ class BASE = default_base_state>
+struct exit_func_state : public ::boost::msm::front::state_base<BASE,Attributes>,
+ euml_state<exit_func_state<Event,EntryFunctor,ExitFunctor,Attributes,Flags,Defer,BASE> >
+{
+ // grammar testing
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<EntryFunctor,invalid_type> ));
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<ExitFunctor,invalid_type> ));
+
+ // tags
+ typedef Event event;
+ typedef BASE Base;
+ typedef int pseudo_exit;
+
+ // flags
+ typedef Flags flag_list;
+ // deferred events
+ typedef Defer deferred_events;
+
+ template <class Evt,class FSM>
+ void on_entry(Evt const& evt,FSM& fsm)
+ {
+ EntryFunctor()(evt,fsm,*this);
+ }
+ template <class Evt,class FSM>
+ void on_exit(Evt const& evt,FSM& fsm)
+ {
+ ExitFunctor()(evt,fsm,*this);
+ }
+};
+
+struct BuildActions;
+struct BuildGuards;
+
+struct BuildActionSequence
+ : proto::or_<
+ proto::when <
+ BuildActions,
+ ActionSequence<make_vector_one_row<BuildActions(proto::_)>()>()
+ >,
+ proto::when <
+ proto::comma<BuildActions,BuildActions >,
+ ActionSequence<boost::mpl::push_back<
+ make_vector_one_row<BuildActions(proto::_left)>(),
+ BuildActions(proto::_right)>()>()
+ >,
+ proto::when <
+ proto::comma<BuildActionSequence,BuildActions >,
+ ActionSequence<boost::mpl::push_back<
+ get_sequence<BuildActionSequence(proto::_left) >(),
+ BuildActions(proto::_right) >() >()
+ >
+ >
+{};
+
+struct BuildActionsCases
+{
+ // The primary template matches nothing:
+ template<typename Tag>
+ struct case_
+ : proto::not_<proto::_>
+ {};
+};
+
+template<>
+struct BuildActionsCases::case_<proto::tag::pre_inc>
+ : proto::when<
+ proto::pre_inc<BuildActions >,
+ Pre_inc_< BuildActions(proto::_child)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::pre_dec>
+ : proto::when<
+ proto::pre_dec<BuildActions >,
+ Pre_dec_< BuildActions(proto::_child)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::post_inc>
+ : proto::when<
+ proto::post_inc<BuildActions >,
+ Post_inc_< BuildActions(proto::_child)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::post_dec>
+ : proto::when<
+ proto::post_dec<BuildActions >,
+ Post_dec_< BuildActions(proto::_child)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::dereference>
+ : proto::when<
+ proto::dereference<BuildActions >,
+ Deref_< BuildActions(proto::_child)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::plus>
+ : proto::when<
+ proto::plus<BuildActions,BuildActions >,
+ Plus_<BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::minus>
+ : proto::when<
+ proto::minus<BuildActions,BuildActions >,
+ Minus_<BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::multiplies>
+ : proto::when<
+ proto::multiplies<BuildActions,BuildActions >,
+ Multiplies_<BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::divides>
+ : proto::when<
+ proto::divides<BuildActions,BuildActions >,
+ Divides_<BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::modulus>
+ : proto::when<
+ proto::modulus<BuildActions,BuildActions >,
+ Modulus_<BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::bitwise_and>
+ : proto::when<
+ proto::bitwise_and<BuildActions,BuildActions >,
+ Bitwise_And_<BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::bitwise_or>
+ : proto::when<
+ proto::bitwise_or<BuildActions,BuildActions >,
+ Bitwise_Or_<BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::bitwise_xor>
+ : proto::when<
+ proto::bitwise_xor<BuildActions,BuildActions >,
+ Bitwise_Xor_<BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+
+template<>
+struct BuildActionsCases::case_<proto::tag::plus_assign>
+ : proto::when<
+ proto::plus_assign<BuildActions,BuildActions >,
+ Plus_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::minus_assign>
+ : proto::when<
+ proto::minus_assign<BuildActions,BuildActions >,
+ Minus_Assign_<BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::multiplies_assign>
+ : proto::when<
+ proto::multiplies_assign<BuildActions,BuildActions >,
+ Multiplies_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::divides_assign>
+ : proto::when<
+ proto::divides_assign<BuildActions,BuildActions >,
+ Divides_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::modulus_assign>
+ : proto::when<
+ proto::modulus_assign<BuildActions,BuildActions >,
+ Modulus_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::shift_left_assign>
+ : proto::when<
+ proto::shift_left_assign<BuildActions,BuildActions >,
+ ShiftLeft_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::shift_right_assign>
+ : proto::when<
+ proto::shift_right_assign<BuildActions,BuildActions >,
+ ShiftRight_Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::shift_left>
+ : proto::when<
+ proto::shift_left<BuildActions,BuildActions >,
+ ShiftLeft_< BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::shift_right>
+ : proto::when<
+ proto::shift_right<BuildActions,BuildActions >,
+ ShiftRight_< BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::assign>
+ : proto::when<
+ proto::assign<BuildActions,BuildActions >,
+ Assign_< BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::subscript>
+ : proto::when<
+ proto::subscript<BuildActions,BuildActions >,
+ Subscript_< BuildActions(proto::_left),BuildActions(proto::_right)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::unary_plus>
+ : proto::when<
+ proto::unary_plus<BuildActions >,
+ Unary_Plus_< BuildActions(proto::_child)>()
+ >
+{};
+template<>
+struct BuildActionsCases::case_<proto::tag::negate>
+ : proto::when<
+ proto::negate<BuildActions >,
+ Unary_Minus_< BuildActions(proto::_child)>()
+ >
+{};
+
+template<>
+struct BuildActionsCases::case_<proto::tag::function>
+ : proto::or_<
+ proto::when<
+ proto::function<proto::terminal<if_tag>,BuildGuards,BuildActionSequence,BuildActionSequence >,
+ If_Else_<BuildGuards(proto::_child_c<1>),
+ BuildActionSequence(proto::_child_c<2>),
+ BuildActionSequence(proto::_child_c<3>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<if_then_tag>,BuildGuards,BuildActionSequence >,
+ If_Then_<BuildGuards(proto::_child_c<1>),
+ BuildActionSequence(proto::_child_c<2>)>()
+ >,
+ proto::when<
+ proto::function<proto::terminal<while_do_tag>,BuildGuards,BuildActionSequence >,
+ While_Do_<BuildGuards(proto::_child_c<1>),
+ BuildActionSequence(proto::_child_c<2>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<do_while_tag>,BuildGuards,BuildActionSequence >,
+ Do_While_<BuildGuards(proto::_child_c<1>),
+ BuildActionSequence(proto::_child_c<2>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<for_loop_tag>,
+ BuildActionSequence,BuildGuards,BuildActionSequence,BuildActionSequence>,
+ For_Loop_<BuildActionSequence(proto::_child_c<1>),
+ BuildGuards(proto::_child_c<2>),
+ BuildActionSequence(proto::_child_c<3>),
+ BuildActionSequence(proto::_child_c<4>) >()
+ >,
+ proto::or_<
+ proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions >,
+ get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_> >,
+ get_fct<proto::_child_c<0> >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions,BuildActions >,
+ get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions >,
+ get_fct<proto::_child_c<0>,BuildActions(proto::_child_c<1>)
+ ,BuildActions(proto::_child_c<2>),BuildActions(proto::_child_c<3>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions >,
+ get_fct<proto::_child_c<0>
+ ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
+ ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>) >()
+ >,
+ proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >,
+ get_fct<proto::_child_c<0>
+ ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
+ ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>)
+ ,BuildActions(proto::_child_c<5>) >()
+ >
+#ifdef BOOST_MSVC
+ ,proto::when<
+ proto::function<proto::terminal<proto::_>,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions,BuildActions >,
+ get_fct<proto::_child_c<0>
+ ,BuildActions(proto::_child_c<1>),BuildActions(proto::_child_c<2>)
+ ,BuildActions(proto::_child_c<3>),BuildActions(proto::_child_c<4>)
+ ,BuildActions(proto::_child_c<5>),BuildActions(proto::_child_c<6>) >()
+ >
+#endif
+ >
+ >
+{};
+
+template<>
+struct BuildActionsCases::case_<proto::tag::terminal>
+ : proto::or_<
+ proto::when<
+ proto::terminal<action_tag>,
+ proto::_
+ >,
+ proto::when<
+ proto::terminal<state_tag>,
+ proto::_
+ >,
+ proto::when<
+ proto::terminal<flag_tag>,
+ proto::_
+ >,
+ proto::when<
+ proto::terminal<event_tag>,
+ proto::_
+ >
+ >
+{};
+struct BuildActions
+ : proto::switch_<BuildActionsCases>
+{};
+
+// attributes building
+struct make_attributes_tag
+{
+ typedef int attribute_tag;
+};
+
+template<class X = proto::is_proto_expr>
+struct attribute
+{
+ BOOST_PROTO_BASIC_EXTENDS(
+ proto::terminal<make_attributes_tag>::type
+ , attribute
+ , proto::default_domain
+ )
+};
+
+ attribute<> const attributes_ = {{}};
+ attribute<> const no_attributes_ = {{}};
+
+ struct BuildAttributesHelper
+ : proto::make<
+ ::boost::mpl::pop_front<
+ proto::fold_tree<
+ proto::_
+ , ::boost::fusion::vector<>()
+ , ::boost::mpl::push_back<proto::_state, proto::_value>()
+ >
+ >
+ >
+ {};
+struct BuildAttributes
+ : proto::make<
+ ::boost::mpl::if_<
+ has_attribute_tag< ::boost::mpl::deref< ::boost::mpl::prior< ::boost::mpl::end< BuildAttributesHelper > > > >,
+ ::boost::mpl::pop_back< BuildAttributesHelper >,
+ BuildAttributesHelper >
+ >
+{};
+
+// helper to build a mpl::vector from a << list
+ struct BuildMplVectorHelper
+ : proto::make<
+ ::boost::mpl::pop_front<
+ proto::fold_tree<
+ proto::_
+ , ::boost::mpl::vector0<>()
+ , ::boost::mpl::push_back<proto::_state, proto::_>()
+ >
+ >
+ >
+ {};
+
+// flags building
+struct BuildFlags
+ : proto::make<
+ ::boost::mpl::remove_if<
+ BuildMplVectorHelper,
+ ::boost::mpl::not_< ::boost::is_same<get_euml_tag_type< ::boost::mpl::placeholders::_ >, flag_tag > >
+ >
+ >
+{};
+
+struct control_configure_tag {};
+
+// configuration building
+struct make_configure_tag
+{
+ typedef int control_configure_tag;
+};
+
+template<class X = proto::is_proto_expr>
+struct configure
+{
+ typedef not_euml_tag euml_tag_type;
+ BOOST_PROTO_BASIC_EXTENDS(
+ proto::terminal<make_configure_tag>::type
+ , configure
+ , sm_domain
+ )
+};
+
+ configure<> const configure_ = {{}};
+ configure<> const no_configure_ = {{}};
+
+struct BuildConfigure
+ : proto::make<
+ ::boost::mpl::remove_if<
+ BuildMplVectorHelper,
+ ::boost::mpl::not_< ::boost::is_same<get_euml_tag_type< ::boost::mpl::placeholders::_ >, config_tag > >
+ >
+ >
+{};
+
+struct BuildDeferred
+ : proto::make<
+ ::boost::mpl::remove_if<
+ BuildMplVectorHelper,
+ ::boost::mpl::not_< ::boost::is_same<get_euml_tag_type< ::boost::mpl::placeholders::_ >, event_tag > >
+ >
+ >
+{};
+
+template<class X = proto::is_proto_expr>
+struct define_init
+{
+ typedef int defer_create_tag;
+ BOOST_PROTO_BASIC_EXTENDS(
+ proto::terminal<state_tag>::type
+ , define_init
+ , sm_domain
+ )
+};
+
+define_init<> const init_ = {{}};
+struct BuildInit
+ : proto::make<
+ ::boost::mpl::pop_front<
+ proto::fold_tree<
+ proto::_
+ , ::boost::mpl::vector0<>()
+ , ::boost::mpl::push_back<proto::_state, proto::_>()
+ >
+ >
+ >
+ {};
+
+template <class Expr1,class Expr2,class Attr,class Configure,class BASE>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type,
+BASE
+>
+build_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ return func_state<entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
+}
+
+template <class Expr1,class Expr2,class Attr,class Configure>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type
+>
+build_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ return func_state<entry_action,exit_action,attributes_type,flags_type,deferred_type>();
+}
+
+template <class Expr1,class Expr2,class Attr>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type
+>
+build_state(Expr1 const& ,Expr2 const& ,Attr const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return func_state<entry_action,exit_action,attributes_type>();
+}
+
+template <class Expr1,class Expr2>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type
+>
+build_state(Expr1 const& ,Expr2 const& )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ return func_state<entry_action,exit_action>();
+}
+
+template <class Expr1>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+NoAction
+>
+build_state(Expr1 const& )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ return func_state<entry_action,NoAction>();
+}
+func_state<
+NoAction,
+NoAction
+>
+build_state()
+{
+ return func_state<NoAction,NoAction>();
+}
+
+// provides the typedefs and interface. Concrete states derive from it.
+template<class STT,
+ class Init,
+ class EntryFunctor=NoAction,
+ class ExitFunctor=NoAction,
+ class Attributes= ::boost::fusion::vector<>,
+ class Flags = ::boost::mpl::vector0<>,
+ class Defer = ::boost::mpl::vector0<>,
+ class Configuration = ::boost::mpl::vector0<>,
+ class NoTransitionFunctor = NoAction,
+ class OnExceptionFunctor = NoAction,
+ class BASE = ::boost::msm::front::default_base_state>
+struct func_state_machine : public ::boost::msm::front::state_base<BASE,Attributes>,
+ euml_state<func_state_machine<STT,Init,EntryFunctor,ExitFunctor,Attributes,Flags,
+ Defer,NoTransitionFunctor,OnExceptionFunctor,BASE> >
+{
+ // grammar testing
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<EntryFunctor,invalid_type> ));
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<ExitFunctor,invalid_type> ));
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<NoTransitionFunctor,invalid_type> ));
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<OnExceptionFunctor,invalid_type> ));
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<STT,invalid_type> ));
+
+ // flags
+ typedef Flags flag_list;
+ // deferred events
+ typedef Defer deferred_events;
+ // customization (message queue, exceptions)
+ typedef Configuration configuration;
+
+
+ typedef BASE BaseAllStates;
+ typedef STT transition_table;
+ // the initial state of the player SM. Must be defined
+ typedef Init initial_state;
+
+ template <class Event,class FSM>
+ void on_entry(Event const& evt,FSM& fsm)
+ {
+ EntryFunctor()(evt,fsm,*this);
+ }
+ template <class Event,class FSM>
+ void on_exit(Event const& evt,FSM& fsm)
+ {
+ ExitFunctor()(evt,fsm,*this);
+ }
+protected:
+ // Default no-transition handler. Can be replaced in the Derived SM class.
+ template <class FSM,class Event>
+ void no_transition(Event const& evt,FSM& fsm,int state)
+ {
+ NoTransitionFunctor()(evt,fsm,state);
+ }
+ // default exception handler. Can be replaced in the Derived SM class.
+ template <class FSM,class Event>
+ void exception_caught (Event const& evt,FSM& fsm,std::exception& e)
+ {
+ OnExceptionFunctor()(evt,fsm,e);
+ }
+};
+
+template <class STT,class Init>
+func_state_machine<
+STT,
+typename boost::result_of<BuildInit(Init)>::type
+>
+build_sm(STT ,Init)
+{
+ typedef typename boost::result_of<BuildInit(Init)>::type init_type;
+ return func_state_machine<STT,init_type>();
+}
+
+template <class STT,class Init,class Expr1>
+func_state_machine<
+STT,
+typename boost::result_of<BuildInit(Init)>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type
+>
+build_sm(STT ,Init , Expr1 const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildInit(Init)>::type init_type;
+ return func_state_machine<STT,init_type,entry_action>();
+}
+
+template <class STT,class Init,class Expr1,class Expr2>
+func_state_machine<
+STT,
+typename boost::result_of<BuildInit(Init)>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type
+>
+build_sm(STT ,Init , Expr1 const& ,Expr2 const& )
+{
+ typedef typename boost::result_of<BuildInit(Init)>::type init_type;
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ return func_state_machine<STT,init_type,entry_action,exit_action>();
+}
+
+template <class STT,class Init,class Expr1,class Expr2,class Attr>
+func_state_machine<
+STT,
+typename boost::result_of<BuildInit(Init)>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type
+>
+build_sm(STT ,Init , Expr1 const& ,Expr2 const& ,Attr const&)
+{
+ typedef typename boost::result_of<BuildInit(Init)>::type init_type;
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return func_state_machine<STT,init_type,entry_action,exit_action,attributes_type>();
+}
+
+template <class STT,class Init,class Expr1,class Expr2,class Attr,class Configure>
+func_state_machine<
+STT,
+typename boost::result_of<BuildInit(Init)>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type,
+typename boost::result_of<BuildConfigure(Configure)>::type
+>
+build_sm(STT ,Init , Expr1 const& ,Expr2 const& , Attr const&, Configure const& )
+{
+ typedef typename boost::result_of<BuildInit(Init)>::type init_type;
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildConfigure(Configure)>::type config_type;
+ return func_state_machine<STT,init_type,entry_action,exit_action,attributes_type,flags_type,
+ deferred_type,config_type>();
+
+}
+
+template <class STT,class Init,class Expr1,class Expr2,class Attr,class Configure,class Expr3>
+func_state_machine<
+STT,
+typename boost::result_of<BuildInit(Init)>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type,
+typename boost::result_of<BuildConfigure(Configure)>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr3,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr3)>,
+ make_invalid_type>::type
+>
+build_sm(STT ,Init , Expr1 const& ,Expr2 const& ,Attr const&, Configure const&, Expr3 const& )
+{
+ typedef typename boost::result_of<BuildInit(Init)>::type init_type;
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr3)>::type no_transition_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildConfigure(Configure)>::type config_type;
+ return func_state_machine<STT,init_type,entry_action,exit_action,attributes_type,flags_type,deferred_type,
+ config_type,no_transition_action>();
+}
+
+template <class STT,class Init,class Expr1,class Expr2,class Attr,class Configure,class Expr3,class Expr4>
+func_state_machine<
+STT,
+typename boost::result_of<BuildInit(Init)>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type,
+typename boost::result_of<BuildConfigure(Configure)>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr3,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr3)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr4,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr4)>,
+ make_invalid_type>::type
+>
+build_sm(STT ,Init , Expr1 const& ,Expr2 const& , Attr const&, Configure const&, Expr3 const&, Expr4 const& )
+{
+ typedef typename boost::result_of<BuildInit(Init)>::type init_type;
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildConfigure(Configure)>::type config_type;
+ typedef typename boost::result_of<BuildActionSequence(Expr3)>::type no_transition_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr4)>::type on_exception_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return func_state_machine<STT,init_type,entry_action,exit_action,attributes_type,flags_type,deferred_type,
+ config_type,no_transition_action,on_exception_action>();
+}
+
+template <class STT,class Init,class Expr1,class Expr2,class Attr,class Configure,class Expr3,class Expr4,class BASE>
+func_state_machine<
+STT,
+typename boost::result_of<BuildInit(Init)>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type,
+typename boost::result_of<BuildConfigure(Configure)>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr3,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr3)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr4,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr4)>,
+ make_invalid_type>::type,
+BASE
+>
+build_sm(STT ,Init , Expr1 const& ,Expr2 const& ,Attr const& , Configure const&, Expr3 const&, Expr4 const& , BASE )
+{
+ typedef typename boost::result_of<BuildInit(Init)>::type init_type;
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildConfigure(Configure)>::type config_type;
+ typedef typename boost::result_of<BuildActionSequence(Expr3)>::type no_transition_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr4)>::type on_exception_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return func_state_machine<STT,init_type,entry_action,exit_action,attributes_type,flags_type,deferred_type,
+ config_type,no_transition_action,on_exception_action,BASE>();
+}
+
+template <class Expr>
+inherit_attributes<typename boost::result_of<BuildAttributes(Expr)>::type>
+build_attributes (Expr const&)
+{
+ return inherit_attributes<typename boost::result_of<BuildAttributes(Expr)>::type> ();
+}
+
+template <class Expr1,class Expr2,class Attr,class Configure,class BASE>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename ::boost::mpl::push_back< typename boost::result_of<BuildFlags(Configure)>::type,
+ ::boost::msm::TerminateFlag>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type,
+BASE
+>
+build_terminate_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename ::boost::mpl::push_back<
+ typename boost::result_of<BuildFlags(Configure)>::type,
+ ::boost::msm::TerminateFlag >::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return func_state<entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
+}
+
+template <class Expr1,class Expr2,class Attr,class Configure>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename ::boost::mpl::push_back< typename boost::result_of<BuildFlags(Configure)>::type,
+ ::boost::msm::TerminateFlag>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type
+>
+build_terminate_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename ::boost::mpl::push_back<
+ typename boost::result_of<BuildFlags(Configure)>::type,
+ ::boost::msm::TerminateFlag >::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+
+ return func_state<entry_action,exit_action,attributes_type,flags_type,deferred_type>();
+}
+
+template <class Expr1,class Expr2,class Attr>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+::boost::mpl::vector<boost::msm::TerminateFlag>
+>
+build_terminate_state(Expr1 const& ,Expr2 const& ,Attr const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return func_state<entry_action,exit_action,attributes_type, ::boost::mpl::vector< ::boost::msm::TerminateFlag> >();
+}
+
+template <class Expr1,class Expr2>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+::boost::fusion::vector<>,
+::boost::mpl::vector<boost::msm::TerminateFlag>
+>
+build_terminate_state(Expr1 const& ,Expr2 const& )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ return func_state<entry_action,exit_action,
+ ::boost::fusion::vector<>, ::boost::mpl::vector< ::boost::msm::TerminateFlag> >();
+}
+
+template <class Expr1>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+NoAction,
+::boost::fusion::vector<>,
+::boost::mpl::vector<boost::msm::TerminateFlag>
+>
+build_terminate_state(Expr1 const& )
+{
+ 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> >();
+}
+func_state<
+NoAction,
+NoAction,
+::boost::fusion::vector<>,
+::boost::mpl::vector<boost::msm::TerminateFlag>
+>
+build_terminate_state()
+{
+ return func_state<NoAction,NoAction,::boost::fusion::vector<>,::boost::mpl::vector<boost::msm::TerminateFlag> >();
+}
+
+template <class Expr1,class Expr2,class Attr,class Configure,class BASE,class EndInterruptEvent>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename ::boost::mpl::push_back<
+ typename ::boost::mpl::push_back< typename boost::result_of<BuildFlags(Configure)>::type,
+ ::boost::msm::InterruptedFlag>::type,
+ boost::msm::EndInterruptFlag<EndInterruptEvent>
+ >::type,
+typename boost::result_of<BuildDeferred(Configure)>::type,
+BASE
+>
+build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ typedef typename ::boost::mpl::push_back<
+ typename ::boost::mpl::push_back<
+ typename boost::result_of<BuildFlags(Configure)>::type,
+ ::boost::msm::InterruptedFlag>::type,
+ boost::msm::EndInterruptFlag<EndInterruptEvent>
+ >::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ return func_state<entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
+}
+
+template <class Expr1,class Expr2,class Attr,class Configure,class EndInterruptEvent>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename ::boost::mpl::push_back<
+ typename ::boost::mpl::push_back< typename boost::result_of<BuildFlags(Configure)>::type,
+ ::boost::msm::InterruptedFlag>::type,
+ boost::msm::EndInterruptFlag<EndInterruptEvent>
+ >::type,
+typename boost::result_of<BuildDeferred(Configure)>::type
+>
+build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+
+ typedef typename ::boost::mpl::push_back<
+ typename ::boost::mpl::push_back<
+ typename boost::result_of<BuildFlags(Configure)>::type,
+ ::boost::msm::InterruptedFlag>::type,
+ boost::msm::EndInterruptFlag<EndInterruptEvent>
+ >::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+
+ return func_state<entry_action,exit_action,attributes_type,flags_type,deferred_type>();
+}
+
+template <class Expr1,class Expr2,class Attr,class EndInterruptEvent>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> >
+>
+build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& ,Attr const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return func_state<entry_action,exit_action,attributes_type,
+ ::boost::mpl::vector< boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> > >();
+}
+
+template <class Expr1,class Expr2,class EndInterruptEvent>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+::boost::fusion::vector<>,
+::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> >
+>
+build_interrupt_state(EndInterruptEvent const&,Expr1 const& ,Expr2 const& )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ return func_state<entry_action,exit_action,
+ ::boost::fusion::vector<>,
+ ::boost::mpl::vector< boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> > >();
+}
+
+template <class Expr1,class EndInterruptEvent>
+func_state<
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+NoAction,
+::boost::fusion::vector<>,
+::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> >
+>
+build_interrupt_state(EndInterruptEvent const&, Expr1 const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ return func_state<entry_action,NoAction, ::boost::fusion::vector<>,
+ ::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> > >();
+}
+
+template <class EndInterruptEvent>
+func_state<
+NoAction,
+NoAction,
+::boost::fusion::vector<>,
+::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> >
+>
+build_interrupt_state(EndInterruptEvent const&)
+{
+ return func_state<NoAction,NoAction, ::boost::fusion::vector<>,
+ ::boost::mpl::vector<boost::msm::InterruptedFlag, boost::msm::EndInterruptFlag<EndInterruptEvent> > >();
+}
+
+template <int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure,class BASE>
+entry_func_state<
+ZoneIndex,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type,
+BASE
+>
+build_entry_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return entry_func_state<ZoneIndex,entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
+}
+
+template <int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure>
+entry_func_state<
+ZoneIndex,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type
+>
+build_entry_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return entry_func_state<ZoneIndex,entry_action,exit_action,attributes_type,flags_type,deferred_type>();
+}
+
+template <int ZoneIndex,class Expr1,class Expr2,class Attr>
+entry_func_state<
+ZoneIndex,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type
+>
+build_entry_state(Expr1 const& ,Expr2 const& ,Attr const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return entry_func_state<ZoneIndex,entry_action,exit_action,attributes_type>();
+}
+
+template <int ZoneIndex,class Expr1,class Expr2>
+entry_func_state<
+ZoneIndex,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type
+>
+build_entry_state(Expr1 const& ,Expr2 const& )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ return entry_func_state<ZoneIndex,entry_action,exit_action>();
+}
+
+template <int ZoneIndex,class Expr1>
+entry_func_state<
+ZoneIndex,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+NoAction
+>
+build_entry_state(Expr1 const& )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ return entry_func_state<ZoneIndex,entry_action,NoAction>();
+}
+
+template <int ZoneIndex>
+entry_func_state<
+ZoneIndex,
+NoAction,
+NoAction
+>
+build_entry_state()
+{
+ return entry_func_state<ZoneIndex,NoAction,NoAction>();
+}
+
+template <class Event,class Expr1,class Expr2,class Attr,class Configure,class BASE>
+exit_func_state<
+Event,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type,
+BASE
+>
+build_exit_state(Event const&,Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return exit_func_state<Event,entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
+}
+
+template <class Event,class Expr1,class Expr2,class Attr,class Configure>
+exit_func_state<
+Event,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type
+>
+build_exit_state(Event const&,Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return exit_func_state<Event,entry_action,exit_action,attributes_type,flags_type,deferred_type>();
+}
+
+template <class Event,class Expr1,class Expr2,class Attr>
+exit_func_state<
+Event,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type
+>
+build_exit_state(Event const&,Expr1 const& ,Expr2 const& ,Attr const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return exit_func_state<Event,entry_action,exit_action,attributes_type>();
+}
+
+template <class Event,class Expr1,class Expr2>
+exit_func_state<
+Event,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type
+>
+build_exit_state(Event const&,Expr1 const& ,Expr2 const& )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ return exit_func_state<Event,entry_action,exit_action>();
+}
+
+template <class Event,class Expr1>
+exit_func_state<
+Event,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+NoAction
+>
+build_exit_state(Event const&, Expr1 const& )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ return exit_func_state<Event,entry_action,NoAction>();
+}
+
+template <class Event>
+exit_func_state<
+Event,
+NoAction,
+NoAction
+>
+build_exit_state(Event const&)
+{
+ return exit_func_state<Event,NoAction,NoAction>();
+}
+
+template <int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure,class BASE>
+explicit_entry_func_state<
+ZoneIndex,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type,
+BASE
+>
+build_explicit_entry_state(Expr1 const& ,Expr2 const& , Attr const&, Configure const&, BASE )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return explicit_entry_func_state<ZoneIndex,entry_action,exit_action,attributes_type,flags_type,deferred_type,BASE>();
+}
+
+template <int ZoneIndex,class Expr1,class Expr2,class Attr,class Configure>
+explicit_entry_func_state<
+ZoneIndex,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type,
+typename boost::result_of<BuildFlags(Configure)>::type,
+typename boost::result_of<BuildDeferred(Configure)>::type
+>
+build_explicit_entry_state(Expr1 const& ,Expr2 const& ,Attr const&, Configure const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildFlags(Configure)>::type flags_type;
+ typedef typename boost::result_of<BuildDeferred(Configure)>::type deferred_type;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return explicit_entry_func_state<ZoneIndex,entry_action,exit_action,attributes_type,flags_type,deferred_type>();
+}
+
+template <int ZoneIndex,class Expr1,class Expr2,class Attr>
+explicit_entry_func_state<
+ZoneIndex,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type,
+typename boost::result_of<BuildAttributes(Attr)>::type
+>
+build_explicit_entry_state(Expr1 const& ,Expr2 const& ,Attr const&)
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ typedef typename boost::result_of<BuildAttributes(Attr)>::type attributes_type;
+ return explicit_entry_func_state<ZoneIndex,entry_action,exit_action,attributes_type>();
+}
+
+template <int ZoneIndex,class Expr1,class Expr2>
+explicit_entry_func_state<
+ZoneIndex,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr2,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr2)>,
+ make_invalid_type>::type
+>
+build_explicit_entry_state(Expr1 const& ,Expr2 const& )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ typedef typename boost::result_of<BuildActionSequence(Expr2)>::type exit_action;
+ return explicit_entry_func_state<ZoneIndex,entry_action,exit_action>();
+}
+
+template <int ZoneIndex,class Expr1>
+explicit_entry_func_state<
+ZoneIndex,
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr1,BuildActionSequence>::type,
+ boost::result_of<BuildActionSequence(Expr1)>,
+ make_invalid_type>::type,
+NoAction
+>
+build_explicit_entry_state(Expr1 const& )
+{
+ typedef typename boost::result_of<BuildActionSequence(Expr1)>::type entry_action;
+ return explicit_entry_func_state<ZoneIndex,entry_action,NoAction>();
+}
+
+template <int ZoneIndex>
+explicit_entry_func_state<
+ZoneIndex,
+NoAction,
+NoAction
+>
+build_explicit_entry_state()
+{
+ return explicit_entry_func_state<ZoneIndex,NoAction,NoAction>();
+}
+
+
+
+}}}}
+
+#endif //BOOST_MSM_FRONT_EUML_STATE_GRAMMAR_H
+

Added: sandbox/msm/boost/msm/front/euml/stl.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/stl.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,17 @@
+// 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_FRONT_EUML_STL_H
+#define BOOST_MSM_FRONT_EUML_STL_H
+
+#include <boost/msm/front/euml/container.hpp>
+#include <boost/msm/front/euml/algorithm.hpp>
+
+#endif //BOOST_MSM_FRONT_EUML_STL_H
\ No newline at end of file

Added: sandbox/msm/boost/msm/front/euml/stt_grammar.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/stt_grammar.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,152 @@
+// 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_FRONT_EUML_STT_GRAMMAR_H
+#define BOOST_MSM_FRONT_EUML_STT_GRAMMAR_H
+
+#include <boost/proto/transform.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/eval_if.hpp>
+
+#include <boost/msm/front/euml/common.hpp>
+#include <boost/msm/front/euml/operator.hpp>
+#include <boost/msm/front/euml/guard_grammar.hpp>
+#include <boost/msm/front/euml/state_grammar.hpp>
+
+namespace proto = boost::proto;
+
+namespace boost { namespace msm { namespace front { namespace euml
+{
+template <class Left,class Right>
+struct fusion_left_right
+{
+ typedef Row<typename Left::Source,typename Left::Evt,typename Right::Target
+ ,typename Right::Action,typename Right::Guard> type;
+};
+template <class TargetGuard,class ActionClass>
+struct fusion_target_action_guard
+{
+ typedef Row<none,none,typename TargetGuard::Target,typename ActionClass::Action,typename TargetGuard::Guard> type;
+};
+
+// row grammar
+struct BuildSourcePlusEvent
+ : proto::or_<
+ proto::when<
+ proto::plus<proto::terminal<state_tag>,proto::terminal<event_tag> >,
+ Row<proto::_left,proto::_right,none>()
+ >,
+ proto::when<
+ proto::terminal<state_tag>,
+ Row<proto::_,none,none>()
+ >
+ >
+{};
+struct BuildActionPlusGuard
+ : proto::when<
+ proto::subscript<BuildActionSequence,BuildGuards >,
+ Row<none,none,none,
+ BuildActionSequence(proto::_left),
+ BuildGuards(proto::_right)>()
+ >
+{};
+
+struct BuildNextStates
+ : proto::or_<
+ proto::when<
+ proto::terminal<state_tag>,
+ proto::_
+ >,
+ proto::when <
+ proto::comma<proto::terminal<state_tag>,proto::terminal<state_tag> >,
+ ::boost::mpl::push_back<
+ make_vector_one_row<proto::_left>(),
+ proto::_right>()
+ >,
+ proto::when <
+ proto::comma<BuildNextStates,proto::terminal<state_tag> >,
+ ::boost::mpl::push_back<
+ BuildNextStates(proto::_left),
+ proto::_right >()
+ >
+ >
+{};
+
+struct BuildTargetPlusGuard
+ : proto::when<
+ proto::subscript<BuildNextStates,BuildGuards >,
+ Row<none,none,BuildNextStates(proto::_left),none,BuildGuards(proto::_right)>()
+ >
+{};
+
+
+struct BuildRight
+ : proto::or_<
+ // after == if just state without guard/action
+ proto::when<
+ BuildNextStates,
+ Row<none,none,BuildNextStates(proto::_),none>() >
+ // == target / action
+ , proto::when<
+ proto::divides<BuildNextStates,BuildActionSequence >,
+ Row<none,none,BuildNextStates(proto::_left),
+ BuildActionSequence(proto::_right) >() >
+ // == target [ guard ]
+ , proto::when<
+ proto::subscript<BuildNextStates,BuildGuards >,
+ Row<none,none,BuildNextStates(proto::_left),none,BuildGuards(proto::_right)>() >
+ // == target [ guard ] / action
+ , proto::when<
+ proto::divides<BuildTargetPlusGuard,
+ BuildActionSequence >,
+ fusion_target_action_guard<BuildTargetPlusGuard(proto::_left),
+ Row<none,none,none,BuildActionSequence(proto::_right)>()
+ >()
+ >
+ >
+{};
+
+struct BuildRow
+ : proto::or_<
+ proto::when<
+ proto::equal_to<BuildSourcePlusEvent,BuildRight >,
+ fusion_left_right<BuildSourcePlusEvent(proto::_left),BuildRight(proto::_right)>()
+ >
+ >
+{};
+
+// stt grammar
+struct BuildStt
+ : proto::or_<
+ proto::when<
+ proto::comma<BuildStt,BuildStt>,
+ boost::mpl::push_back<BuildStt(proto::_left),BuildRow(proto::_right)>()
+ >,
+ proto::when <
+ BuildRow,
+ make_vector_one_row<BuildRow(proto::_)>()
+ >
+ >
+{};
+
+
+template <class Expr>
+typename ::boost::mpl::eval_if<
+ typename proto::matches<Expr,BuildStt>::type,
+ boost::result_of<BuildStt(Expr)>,
+ make_invalid_type>::type
+build_stt(Expr const& expr)
+{
+ return typename boost::result_of<BuildStt(Expr)>::type();
+}
+
+
+}}}}
+#endif //BOOST_MSM_FRONT_EUML_STT_GRAMMAR_H

Added: sandbox/msm/boost/msm/front/euml/transformation.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/euml/transformation.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,331 @@
+// 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_FRONT_EUML_TRANSFORMATION_H
+#define BOOST_MSM_FRONT_EUML_TRANSFORMATION_H
+
+#include <algorithm>
+#include <boost/msm/front/euml/common.hpp>
+
+namespace boost { namespace msm { namespace front { namespace euml
+{
+#ifdef __STL_CONFIG_H
+MSM_EUML_FUNCTION(FillN_ , std::fill_n , fill_n_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(Rotate_ , std::rotate , rotate_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(GenerateN_ , std::generate_n , generate_n_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+
+#else
+MSM_EUML_FUNCTION(FillN_ , std::fill_n , fill_n_ , void , void )
+MSM_EUML_FUNCTION(Rotate_ , std::rotate , rotate_ , void , void )
+MSM_EUML_FUNCTION(GenerateN_ , std::generate_n , generate_n_ , void , void )
+#endif
+
+MSM_EUML_FUNCTION(Copy_ , std::copy , copy_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(CopyBackward_ , std::copy_backward , copy_backward_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(Reverse_ , std::reverse , reverse_ , void , void )
+MSM_EUML_FUNCTION(ReverseCopy_ , std::reverse_copy , reverse_copy_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(Remove_ , std::remove , remove_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(RemoveIf_ , std::remove_if , remove_if_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(RemoveCopy_ , std::remove_copy , remove_copy_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(RemoveCopyIf_ , std::remove_copy_if , remove_copy_if_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(Fill_ , std::fill , fill_ , void , void )
+MSM_EUML_FUNCTION(Generate_ , std::generate , generate_ , void , void )
+MSM_EUML_FUNCTION(Unique_ , std::unique , unique_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(UniqueCopy_ , std::unique_copy , unique_copy_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(RandomShuffle_ , std::random_shuffle , random_shuffle_ , void , void )
+MSM_EUML_FUNCTION(RotateCopy_ , std::rotate_copy , rotate_copy_ , RESULT_TYPE_PARAM4 , RESULT_TYPE2_PARAM4 )
+MSM_EUML_FUNCTION(Partition_ , std::partition , partition_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(StablePartition_ , std::stable_partition , stable_partition_ , RESULT_TYPE_PARAM1 , RESULT_TYPE2_PARAM1 )
+MSM_EUML_FUNCTION(Sort_ , std::sort , sort_ , void , void )
+MSM_EUML_FUNCTION(StableSort_ , std::stable_sort , stable_sort_ , void , void )
+MSM_EUML_FUNCTION(PartialSort_ , std::partial_sort , partial_sort_ , void , void )
+MSM_EUML_FUNCTION(PartialSortCopy_ , std::partial_sort_copy , partial_sort_copy_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(NthElement_ , std::nth_element , nth_element_ , void , void )
+MSM_EUML_FUNCTION(Merge_ , std::merge , merge_ , RESULT_TYPE_PARAM5 , RESULT_TYPE2_PARAM5 )
+MSM_EUML_FUNCTION(InplaceMerge_ , std::inplace_merge , inplace_merge_ , void , void )
+MSM_EUML_FUNCTION(SetUnion_ , std::set_union , set_union_ , RESULT_TYPE_PARAM5 , RESULT_TYPE2_PARAM5 )
+MSM_EUML_FUNCTION(PushHeap_ , std::push_heap , push_heap_ , void , void )
+MSM_EUML_FUNCTION(PopHeap_ , std::pop_heap , pop_heap_ , void , void )
+MSM_EUML_FUNCTION(MakeHeap_ , std::make_heap , make_heap_ , void , void )
+MSM_EUML_FUNCTION(SortHeap_ , std::sort_heap , sort_heap_ , void , void )
+MSM_EUML_FUNCTION(NextPermutation_ , std::next_permutation , next_permutation_ , bool , bool )
+MSM_EUML_FUNCTION(PrevPermutation_ , std::prev_permutation , prev_permutation_ , bool , bool )
+MSM_EUML_FUNCTION(InnerProduct_ , std::inner_product , inner_product_ , RESULT_TYPE_PARAM4 , RESULT_TYPE2_PARAM4 )
+MSM_EUML_FUNCTION(PartialSum_ , std::partial_sum , partial_sum_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(AdjacentDifference_ , std::adjacent_difference , adjacent_difference_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(Replace_ , std::replace , replace_ , void , void )
+MSM_EUML_FUNCTION(ReplaceIf_ , std::replace_if , replace_if_ , void , void )
+MSM_EUML_FUNCTION(ReplaceCopy_ , std::replace_copy , replace_copy_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+MSM_EUML_FUNCTION(ReplaceCopyIf_ , std::replace_copy_if , replace_copy_if_ , RESULT_TYPE_PARAM3 , RESULT_TYPE2_PARAM3 )
+
+
+
+template <class T>
+struct BackInserter_ : euml_action<BackInserter_<T> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef std::back_insert_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type> type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef std::back_insert_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type> type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return std::back_inserter(T()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return std::back_inserter(T()(evt,fsm,state));
+ }
+};
+
+struct back_inserter_tag {};
+struct BackInserter_Helper: proto::extends< proto::terminal<back_inserter_tag>::type, BackInserter_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef BackInserter_<Arg1> type;
+ };
+};
+BackInserter_Helper const back_inserter_;
+
+template <class T>
+struct FrontInserter_ : euml_action<FrontInserter_<T> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef std::front_insert_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type> type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef std::front_insert_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type> type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return std::front_inserter(T()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return std::front_inserter(T()(evt,fsm,state));
+ }
+};
+
+struct front_inserter_tag {};
+struct FrontInserter_Helper: proto::extends< proto::terminal<front_inserter_tag>::type, FrontInserter_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef FrontInserter_<Arg1> type;
+ };
+};
+FrontInserter_Helper const front_inserter_;
+
+template <class T,class Pos>
+struct Inserter_ : euml_action<Inserter_<T,Pos> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef std::insert_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type2<T,Event,FSM,STATE>::type>::type> type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef std::insert_iterator<
+ typename ::boost::remove_reference<
+ typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type> type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return std::inserter(T()(evt,fsm,src,tgt),Pos()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename T::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return std::inserter(T()(evt,fsm,state),Pos()(evt,fsm,state));
+ }
+};
+
+struct inserter_tag {};
+struct Inserter_Helper: proto::extends< proto::terminal<inserter_tag>::type, Inserter_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Inserter_<Arg1,Arg2> type;
+ };
+};
+Inserter_Helper const inserter_;
+
+template <class Param1, class Param2, class Param3, class Param4, class Param5, class Enable=void >
+struct Transform_ : euml_action<Transform_<Param1,Param2,Param3,Param4,Param5,Enable> >
+{
+};
+
+template <class Param1, class Param2, class Param3, class Param4, class Param5>
+struct Transform_<Param1,Param2,Param3,Param4,Param5,
+ typename ::boost::enable_if<typename ::boost::is_same<Param5,void>::type >::type>
+ : euml_action<Transform_<Param1,Param2,Param3,Param4,Param5> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Param3,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Param3,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Param1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return std::transform(Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt),
+ Param4()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Param1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return std::transform(Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state),
+ Param4()(evt,fsm,state));
+ }
+};
+
+template <class Param1, class Param2, class Param3, class Param4, class Param5>
+struct Transform_<Param1,Param2,Param3,Param4,Param5,
+ typename ::boost::disable_if<typename ::boost::is_same<Param5,void>::type >::type>
+ : euml_action<Transform_<Param1,Param2,Param3,Param4,Param5> >
+{
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef typename get_result_type2<Param4,Event,FSM,STATE>::type type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef typename get_result_type<Param4,EVT,FSM,SourceState,TargetState>::type type;
+ };
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Param1::tag_type,action_tag>::type,
+ typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
+ operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
+ {
+ return std::transform (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt),
+ Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt));
+ }
+ template <class Event,class FSM,class STATE>
+ typename ::boost::enable_if<
+ typename ::boost::mpl::has_key<
+ typename Param1::tag_type,state_action_tag>::type,
+ typename state_action_result<Event,FSM,STATE>::type >::type
+ operator()(Event const& evt,FSM& fsm,STATE& state )const
+ {
+ return std::transform (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state),
+ Param4()(evt,fsm,state),Param5()(evt,fsm,state));
+ }
+};
+struct transform_tag {};
+struct Transform_Helper: proto::extends< proto::terminal<transform_tag>::type, Transform_Helper, sm_domain>
+{
+ template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
+#ifdef BOOST_MSVC
+ ,class Arg6
+#endif
+>
+ struct In
+ {
+ typedef Transform_<Arg1,Arg2,Arg3,Arg4,Arg5> type;
+ };
+};
+Transform_Helper const transform_;
+
+}}}}
+
+#endif //BOOST_MSM_FRONT_EUML_TRANSFORMATION_H

Added: sandbox/msm/boost/msm/front/functor_row.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/functor_row.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,170 @@
+// 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_FRONT_FUNCTOR_ROW_H
+#define BOOST_MSM_FRONT_FUNCTOR_ROW_H
+
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/for_each.hpp>
+
+#include <boost/typeof/typeof.hpp>
+
+#include <boost/msm/front/automatic_event.hpp>
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+namespace boost { namespace msm { namespace front
+{
+ template <class SOURCE,class EVENT,class TARGET,class ACTION=none,class GUARD=none>
+ struct Row
+ {
+ typedef SOURCE Source;
+ typedef EVENT Evt;
+ typedef TARGET Target;
+ typedef ACTION Action;
+ typedef GUARD Guard;
+ // action plus guard
+ typedef row_tag row_type_tag;
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ static void action_call(FSM& fsm,EVT const& evt,SourceState& src,TargetState& tgt)
+ {
+ // create functor, call it
+ Action()(evt,fsm,src,tgt);
+ }
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ static bool guard_call(FSM& fsm,EVT const& evt,SourceState& src,TargetState& tgt)
+ {
+ // create functor, call it
+ return Guard()(evt,fsm,src,tgt);
+ }
+ };
+
+ template<class SOURCE,class EVENT,class TARGET>
+ struct Row<SOURCE,EVENT,TARGET,none,none>
+ {
+ typedef SOURCE Source;
+ typedef EVENT Evt;
+ typedef TARGET Target;
+ typedef none Action;
+ typedef none Guard;
+ // no action, no guard
+ typedef _row_tag row_type_tag;
+ };
+ template<class SOURCE,class EVENT,class TARGET,class ACTION>
+ struct Row<SOURCE,EVENT,TARGET,ACTION,none>
+ {
+ typedef SOURCE Source;
+ typedef EVENT Evt;
+ typedef TARGET Target;
+ typedef ACTION Action;
+ typedef none Guard;
+ // no guard
+ typedef a_row_tag row_type_tag;
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ static void action_call(FSM& fsm,EVT const& evt,SourceState& src,TargetState& tgt)
+ {
+ // create functor, call it
+ Action()(evt,fsm,src,tgt);
+ }
+ };
+ template<class SOURCE,class EVENT,class TARGET,class GUARD>
+ struct Row<SOURCE,EVENT,TARGET,none,GUARD>
+ {
+ typedef SOURCE Source;
+ typedef EVENT Evt;
+ typedef TARGET Target;
+ typedef none Action;
+ typedef GUARD Guard;
+ // no action
+ typedef g_row_tag row_type_tag;
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ static bool guard_call(FSM& fsm,EVT const& evt,SourceState& src,TargetState& tgt)
+ {
+ // create functor, call it
+ return Guard()(evt,fsm,src,tgt);
+ }
+ };
+ template<class TGT>
+ struct get_row_target
+ {
+ typedef typename TGT::Target type;
+ };
+
+ struct state_tag{};
+ struct event_tag{};
+ struct action_tag{};
+ struct state_action_tag{};
+ struct flag_tag{};
+ struct config_tag{};
+ struct not_euml_tag{};
+
+ template <class Sequence>
+ struct ActionSequence
+ {
+ typedef Sequence sequence;
+ template <class Event,class FSM,class STATE >
+ struct state_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class STATE>
+ struct Call
+ {
+ 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& )
+ {
+ FCT()(evt_,fsm_,state_);
+ }
+ private:
+ EVT const& evt_;
+ FSM& fsm_;
+ STATE& state_;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct transition_action_result
+ {
+ typedef void type;
+ };
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ struct Call2
+ {
+ 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& )
+ {
+ FCT()(evt_,fsm_,src_,tgt_);
+ }
+ private:
+ EVT const & evt_;
+ FSM& fsm_;
+ SourceState& src_;
+ TargetState& tgt_;
+ };
+
+ typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
+
+ 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> >
+ (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> >
+ (Call2<EVT,FSM,SourceState,TargetState>(evt,fsm,src,tgt));
+ }
+ };
+}}}
+#endif //BOOST_MSM_FRONT_FUNCTOR_ROW_H

Added: sandbox/msm/boost/msm/front/state_machine_def.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/state_machine_def.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,132 @@
+// 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_FRONT_STATEMACHINE_DEF_H
+#define BOOST_MSM_FRONT_STATEMACHINE_DEF_H
+
+#include <boost/mpl/vector.hpp>
+
+#include <boost/msm/row_tags.hpp>
+#include <boost/msm/front/states.hpp>
+#include <boost/msm/front/automatic_event.hpp>
+#include <boost/msm/front/common_states.hpp>
+
+namespace boost { namespace msm { namespace front
+{
+
+template<class Derived,class BaseState = default_base_state>
+struct state_machine_def : public state_base<BaseState>
+{
+ // tags
+ // default: no flag
+ typedef ::boost::mpl::vector0<> flag_list;
+ //default: no deferred events
+ typedef ::boost::mpl::vector0<> deferred_events;
+ // customization (message queue, exceptions)
+ typedef ::boost::mpl::vector0<> configuration;
+
+ typedef BaseState BaseAllStates;
+ template<
+ typename T1
+ , class Event
+ , typename T2
+ , void (Derived::*action)(Event const&)
+ >
+ struct a_row
+ {
+ typedef a_row_tag row_type_tag;
+ typedef T1 Source;
+ typedef T2 Target;
+ typedef Event Evt;
+ template <class FSM,class SourceState,class TargetState>
+ static void action_call(FSM& fsm,Event const& evt,SourceState&,TargetState&)
+ {
+ // in this front-end, we don't need to know source and target states
+ (fsm.*action)(evt);
+ }
+ };
+
+ template<
+ typename T1
+ , class Event
+ , typename T2
+ >
+ struct _row
+ {
+ typedef _row_tag row_type_tag;
+ typedef T1 Source;
+ typedef T2 Target;
+ typedef Event Evt;
+ };
+
+ template<
+ typename T1
+ , class Event
+ , typename T2
+ , void (Derived::*action)(Event const&)
+ , bool (Derived::*guard)(Event const&)
+ >
+ struct row
+ {
+ typedef row_tag row_type_tag;
+ typedef T1 Source;
+ typedef T2 Target;
+ typedef Event Evt;
+ template <class FSM,class SourceState,class TargetState>
+ static void action_call(FSM& fsm,Event const& evt,SourceState&,TargetState&)
+ {
+ // in this front-end, we don't need to know source and target states
+ (fsm.*action)(evt);
+ }
+ template <class FSM,class SourceState,class TargetState>
+ static bool guard_call(FSM& fsm,Event const& evt,SourceState&,TargetState&)
+ {
+ // in this front-end, we don't need to know source and target states
+ return (fsm.*guard)(evt);
+ }
+ };
+ template<
+ typename T1
+ , class Event
+ , typename T2
+ , bool (Derived::*guard)(Event const&)
+ >
+ struct g_row
+ {
+ typedef g_row_tag row_type_tag;
+ typedef T1 Source;
+ typedef T2 Target;
+ typedef Event Evt;
+ template <class FSM,class SourceState,class TargetState>
+ static bool guard_call(FSM& fsm,Event const& evt,SourceState&,TargetState&)
+ {
+ // in this front-end, we don't need to know source and target states
+ return (fsm.*guard)(evt);
+ }
+ };
+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)
+ {
+ BOOST_ASSERT(false);
+ }
+ // default exception handler. Can be replaced in the Derived SM class.
+ template <class FSM,class Event>
+ void exception_caught (Event const&,FSM&,std::exception& )
+ {
+ BOOST_ASSERT(false);
+ }
+};
+
+
+} } }// boost::msm::front
+#endif //BOOST_MSM_FRONT_STATEMACHINE_DEF_H
+

Added: sandbox/msm/boost/msm/front/states.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/front/states.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,129 @@
+// 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_FRONT_STATES_H
+#define BOOST_MSM_FRONT_STATES_H
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/msm/front/common_states.hpp>
+#include <boost/msm/row_tags.hpp>
+
+namespace boost { namespace msm { namespace front
+{
+
+struct no_sm_ptr
+{
+ // tags
+ typedef ::boost::mpl::bool_<false> needs_sm;
+};
+struct sm_ptr
+{
+ // tags
+ typedef ::boost::mpl::bool_<true> needs_sm;
+};
+// kept for backward compatibility
+struct NoSMPtr
+{
+ // tags
+ typedef ::boost::mpl::bool_<false> needs_sm;
+};
+struct SMPtr
+{
+ // tags
+ typedef ::boost::mpl::bool_<true> needs_sm;
+};
+
+// provides the typedefs and interface. Concrete states derive from it.
+// template argument: pointer-to-fsm policy
+template<class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
+struct state : public state_base<BASE>, SMPtrPolicy
+{
+ // tags
+ // default: no flag
+ typedef ::boost::mpl::vector0<> flag_list;
+ //default: no deferred events
+ typedef ::boost::mpl::vector0<> deferred_events;
+};
+
+// terminate state simply defines the TerminateFlag flag
+// template argument: pointer-to-fsm policy
+template<class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
+struct terminate_state : public state_base<BASE>, SMPtrPolicy
+{
+ // tags
+ typedef ::boost::mpl::vector<boost::msm::TerminateFlag> flag_list;
+ //default: no deferred events
+ typedef ::boost::mpl::vector0<> deferred_events;
+};
+
+// terminate state simply defines the InterruptedFlag and EndInterruptFlag<EndInterruptEvent> flags
+// template argument: event which ends the interrupt
+// template argument: pointer-to-fsm policy
+template <class EndInterruptEvent,class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
+struct interrupt_state : public state_base<BASE>, SMPtrPolicy
+{
+ // tags
+ typedef ::boost::mpl::vector<boost::msm::InterruptedFlag,
+ boost::msm::EndInterruptFlag<EndInterruptEvent> >
+ flag_list;
+ //default: no deferred events
+ typedef ::boost::mpl::vector0<> deferred_events;
+};
+
+// not a state but a bunch of extra typedefs to handle direct entry into a composite state. To be derived from
+// template argument: zone index of this state
+template <int ZoneIndex=-1>
+struct explicit_entry
+{
+ typedef int no_automatic_create;
+ typedef int explicit_entry_state;
+ enum {zone_index=ZoneIndex};
+};
+
+// to be derived from. Makes a type an entry (pseudo) state. Actually an almost full-fledged state
+// template argument: containing composite
+// template argument: zone index of this state
+// template argument: pointer-to-fsm policy
+template<int ZoneIndex=-1,class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
+struct entry_pseudo_state
+ : public state_base<BASE>,SMPtrPolicy
+{
+ // tags
+ typedef int pseudo_entry;
+ enum {zone_index=ZoneIndex};
+ typedef int explicit_entry_state;
+ // default: no flag
+ typedef ::boost::mpl::vector0<> flag_list;
+ //default: no deferred events
+ typedef ::boost::mpl::vector0<> deferred_events;
+};
+
+// to be derived from. Makes a state an exit (pseudo) state. Actually an almost full-fledged state
+// template argument: event to forward
+// template argument: pointer-to-fsm policy
+template<class Event,class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
+struct exit_pseudo_state : public state_base<BASE> , SMPtrPolicy
+{
+ typedef Event event;
+ typedef BASE Base;
+ typedef SMPtrPolicy PtrPolicy;
+ typedef int pseudo_exit;
+
+ // default: no flag
+ typedef ::boost::mpl::vector< > flag_list;
+ //default: no deferred events
+ typedef ::boost::mpl::vector0<> deferred_events;
+};
+
+}}}
+
+#endif //BOOST_MSM_FRONT_STATES_H
+

Deleted: sandbox/msm/boost/msm/history_policies.hpp
==============================================================================
--- sandbox/msm/boost/msm/history_policies.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,105 +0,0 @@
-// 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_HISTORY_POLICIES_H
-#define BOOST_MSM_HISTORY_POLICIES_H
-
-#include <vector>
-#include <boost/mpl/contains.hpp>
-
-namespace boost { namespace msm
-{
-
-// policy classes
-
-// Default: no history used
-class NoHistory
-{
-public:
- NoHistory():m_initialStates(){}
- ~NoHistory(){}
- void set_initial_states(std::vector<int>& initial_states)
- {
- m_initialStates = initial_states;
- }
- void history_exit(std::vector<int>& )
- {
- // ignore
- }
- // returns the state where the state machine should be at start
- template <class Event>
- std::vector<int>& history_entry(Event const& )
- {
- // always come back to the original state
- return m_initialStates;
- }
-private:
- std::vector<int> m_initialStates;
-};
-
-// not UML standard. Always activates history, no matter which event generated the transition
-class AlwaysHistory
-{
-public:
- AlwaysHistory():m_currentStates(){}
- ~AlwaysHistory(){}
- void set_initial_states(std::vector<int>& initial_states)
- {
- m_currentStates = initial_states;
- }
- void history_exit(std::vector<int>& current_states)
- {
- m_currentStates = current_states;
- }
- // returns the state where the state machine should be at start
- template <class Event>
- std::vector<int>& history_entry(Event const& )
- {
- // always load back the last active state
- return m_currentStates;
- }
-private:
- std::vector<int> m_currentStates;
-};
-
-// UML Shallow history. For deep history, just use this policy for all the contained state machines
-template <class Events>
-class ShallowHistory
-{
-public:
- ShallowHistory():m_initialStates(),m_currentStates(){}
- ~ShallowHistory(){}
- void set_initial_states(std::vector<int>& initial_states)
- {
- m_currentStates = initial_states;
- m_initialStates = initial_states;
- }
- void history_exit(std::vector<int>& current_states)
- {
- m_currentStates = current_states;
- }
- // returns the state where the state machine should be at start
- template <class Event>
- std::vector<int>& history_entry(Event const&)
- {
- if ( ::boost::mpl::contains<Events,Event>::value)
- {
- return m_currentStates;
- }
- // not one of our events, no history
- return m_initialStates;
- }
-private:
- std::vector<int> m_initialStates;
- std::vector<int> m_currentStates;
-};
-
-} }//boost::msm
-#endif //BOOST_MSM_HISTORY_POLICIES_H

Deleted: sandbox/msm/boost/msm/metafunctions.hpp
==============================================================================
--- sandbox/msm/boost/msm/metafunctions.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,505 +0,0 @@
-// 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_METAFUNCTIONS_H
-#define BOOST_MSM_METAFUNCTIONS_H
-
-#include <boost/mpl/copy_if.hpp>
-#include <boost/mpl/unique.hpp>
-#include <boost/mpl/set.hpp>
-#include <boost/mpl/at.hpp>
-#include <boost/mpl/pair.hpp>
-#include <boost/mpl/map.hpp>
-#include <boost/mpl/int.hpp>
-#include <boost/mpl/has_xxx.hpp>
-#include <boost/mpl/find_if.hpp>
-#include <boost/mpl/count_if.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/not.hpp>
-#include <boost/mpl/insert.hpp>
-#include <boost/mpl/is_sequence.hpp>
-#include <boost/mpl/vector.hpp>
-#include <boost/mpl/transform.hpp>
-#include <boost/mpl/find.hpp>
-#include <boost/mpl/insert.hpp>
-#include <boost/mpl/insert_range.hpp>
-
-#include <boost/type_traits/is_same.hpp>
-#include <boost/utility/enable_if.hpp>
-
-#include <boost/msm/common_types.hpp>
-
-namespace mpl = boost::mpl;
-BOOST_MPL_HAS_XXX_TRAIT_DEF(explicit_creation)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(pseudo_entry)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(pseudo_exit)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(concrete_exit_state)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(composite_tag)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(not_real_row_tag)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(event_blocking_flag)
-
-namespace boost { namespace msm
-{
-
-// returns the current state type of a transition
-template <class Transition>
-struct transition_source_type
-{
- typedef typename Transition::current_state_type type;
-};
-
-// returns the target state type of a transition
-template <class Transition>
-struct transition_target_type
-{
- typedef typename Transition::next_state_type type;
-};
-
-// helper functions for generate_state_ids
-// create a pair of a state and a passed id for source and target states
-template <class Id,class Transition>
-struct make_pair_source_state_id
-{
- typedef typename ::boost::mpl::pair<typename Transition::current_state_type,Id> type;
-};
-template <class Id,class Transition>
-struct make_pair_target_state_id
-{
- typedef typename ::boost::mpl::pair<typename Transition::next_state_type,Id> type;
-};
-
-// iterates through a transition table and automatically generates ids starting at 0
-// first the source states, transition up to down
-// then the target states, up to down
-template <class stt>
-struct generate_state_ids
-{
- typedef typename
- ::boost::mpl::fold<
- stt,::boost::mpl::pair< ::boost::mpl::map< >, ::boost::mpl::int_<0> >,
- ::boost::mpl::pair<
- ::boost::mpl::if_<
- ::boost::mpl::has_key< ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
- transition_source_type< ::boost::mpl::placeholders::_2> >,
- ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
- ::boost::mpl::insert< ::boost::mpl::first<mpl::placeholders::_1>,
- make_pair_source_state_id< ::boost::mpl::second< ::boost::mpl::placeholders::_1 >,
- ::boost::mpl::placeholders::_2> >
- >,
- ::boost::mpl::if_<
- ::boost::mpl::has_key< ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
- transition_source_type< ::boost::mpl::placeholders::_2> >,
- ::boost::mpl::second< ::boost::mpl::placeholders::_1 >,
- ::boost::mpl::next< ::boost::mpl::second<mpl::placeholders::_1 > >
- >
- > //pair
- >::type source_state_ids;
- typedef typename ::boost::mpl::first<source_state_ids>::type source_state_map;
- typedef typename ::boost::mpl::second<source_state_ids>::type highest_state_id;
-
-
- typedef typename
- ::boost::mpl::fold<
- stt,::boost::mpl::pair<source_state_map,highest_state_id >,
- ::boost::mpl::pair<
- ::boost::mpl::if_<
- ::boost::mpl::has_key< ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
- transition_target_type< ::boost::mpl::placeholders::_2> >,
- ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
- ::boost::mpl::insert< ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
- make_pair_target_state_id< ::boost::mpl::second< ::boost::mpl::placeholders::_1 >,
- ::boost::mpl::placeholders::_2> >
- >,
- ::boost::mpl::if_<
- ::boost::mpl::has_key< ::boost::mpl::first< ::boost::mpl::placeholders::_1>,
- transition_target_type< ::boost::mpl::placeholders::_2> >,
- ::boost::mpl::second< ::boost::mpl::placeholders::_1 >,
- ::boost::mpl::next< ::boost::mpl::second< ::boost::mpl::placeholders::_1 > >
- >
- > //pair
- >::type all_state_ids;
- typedef typename ::boost::mpl::first<all_state_ids>::type type;
-};
-
-// returns the id of a given state
-template <class stt,class State>
-struct get_state_id
-{
- typedef typename ::boost::mpl::at<typename generate_state_ids<stt>::type,State>::type type;
- enum {value = type::value};
-};
-
-// returns a mpl::vector containing the init states of a state machine
-template <class States>
-struct get_initial_states
-{
- typedef typename ::boost::mpl::if_<
- ::boost::mpl::is_sequence<States>,
- States,
- typename ::boost::mpl::push_back< ::boost::mpl::vector<>,States>::type >::type type;
-};
-
-// returns a mpl::int_ containing the size of a region. If the argument is not a sequence, returns 1
-template <class region>
-struct get_number_of_regions
-{
- typedef typename mpl::if_<
- ::boost::mpl::is_sequence<region>,
- ::boost::mpl::size<region>,
- ::boost::mpl::int_<1> >::type type;
-};
-
-// builds a mpl::vector of initial states
-template <class region>
-struct get_regions_as_sequence
-{
- typedef typename ::boost::mpl::if_<
- ::boost::mpl::is_sequence<region>,
- region,
- typename ::boost::mpl::push_back< ::boost::mpl::vector<>,region>::type >::type type;
-};
-
-template <class ToCreateSeq>
-struct get_explicit_creation_as_sequence
-{
- typedef typename ::boost::mpl::if_<
- ::boost::mpl::is_sequence<ToCreateSeq>,
- ToCreateSeq,
- typename ::boost::mpl::push_back< ::boost::mpl::vector<>,ToCreateSeq>::type >::type type;
-};
-
-// returns true if 2 transitions have the same source (used to remove duplicates in search of composite states)
-template <class stt,class Transition1,class Transition2>
-struct have_same_source
-{
- enum {current_state1 = get_state_id<stt,typename Transition1::current_state_type >::type::value};
- enum {current_state2 = get_state_id<stt,typename Transition2::current_state_type >::type::value};
- enum {value = ((int)current_state1 == (int)current_state2) };
-};
-
-
-// A metafunction that returns the Event associated with a transition.
-template <class Transition>
-struct transition_event
-{
- typedef typename Transition::event type;
-};
-
-// returns true for composite states
-template <class State>
-struct is_composite_state
-{
- enum {value = has_composite_tag<State>::type::value};
- typedef typename has_composite_tag<State>::type type;
-};
-
-// transform a transition table in a container of source states
-template <class stt>
-struct keep_source_names
-{
- // instead of the rows we want only the names of the states (from source)
- typedef typename
- ::boost::mpl::transform<
- stt,transition_source_type< ::boost::mpl::placeholders::_1> >::type type;
-};
-
-// transform a transition table in a container of target states
-template <class stt>
-struct keep_target_names
-{
- // instead of the rows we want only the names of the states (from source)
- typedef typename
- ::boost::mpl::transform<
- stt,transition_target_type< ::boost::mpl::placeholders::_1> >::type type;
-};
-
-template <class stt>
-struct generate_state_set
-{
- // keep in the original transition table only the source/target state types
- typedef typename keep_source_names<stt>::type sources;
- typedef typename keep_target_names<stt>::type targets;
- typedef typename
- ::boost::mpl::fold<
- sources, ::boost::mpl::set<>,
- ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::placeholders::_2>
- >::type source_set;
- typedef typename
- ::boost::mpl::fold<
- targets,source_set,
- ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::placeholders::_2>
- >::type type;
-};
-
-// iterates through the transition table and generate a mpl::set<> containing all the events
-template <class stt>
-struct generate_event_set
-{
- typedef typename
- ::boost::mpl::fold<
- stt, ::boost::mpl::set<>,
- ::boost::mpl::if_<
- ::boost::mpl::has_key< ::boost::mpl::placeholders::_1,
- transition_event< ::boost::mpl::placeholders::_2> >,
- ::boost::mpl::placeholders::_1,
- ::boost::mpl::insert< ::boost::mpl::placeholders::_1,
- transition_event< ::boost::mpl::placeholders::_2> > >
- >::type type;
-};
-
-// returns a mpl::bool_<true> if State has Event as delayed event
-template <class State, class Event>
-struct has_state_delayed_event
-{
- typedef typename ::boost::mpl::find<typename State::deferred_events,Event>::type found;
- typedef typename ::boost::mpl::if_<
- ::boost::is_same<found,typename ::boost::mpl::end<typename State::deferred_events>::type >,
- ::boost::mpl::bool_<false>,
- ::boost::mpl::bool_<true> >::type type;
-};
-// returns a mpl::bool_<true> if State has any delayed event
-template <class State>
-struct has_state_delayed_events
-{
- typedef typename ::boost::mpl::if_<
- ::boost::mpl::empty<typename State::deferred_events>,
- ::boost::mpl::bool_<false>,
- ::boost::mpl::bool_<true> >::type type;
-};
-
-// Template used to create dummy entries for initial states not found in the stt.
-template< typename T1 >
-struct not_a_row
-{
- typedef int not_real_row_tag;
- struct dummy_event
- {
- };
- typedef T1 current_state_type;
- typedef T1 next_state_type;
- typedef dummy_event event;
-};
-
-template <class StateType>
-struct get_explicit_creation
-{
- typedef typename StateType::explicit_creation type;
-};
-
-// add to the stt the initial states which could be missing (if not being involved in a transition)
-template <class Derived>
-struct create_stt
-{
- typedef typename Derived::transition_table stt;
- // get the state set
- typedef typename generate_state_set<stt>::type states;
- // transform the initial region(s) in a sequence
- typedef typename get_regions_as_sequence<typename Derived::initial_state>::type init_states;
- // iterate through the initial states and add them in the stt if not already there
- typedef typename
- ::boost::mpl::fold<
- init_states,stt,
- ::boost::mpl::if_<
- ::boost::mpl::has_key<states, ::boost::mpl::placeholders::_2>,
- ::boost::mpl::placeholders::_1,
- ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::end<mpl::placeholders::_1>,
- not_a_row< ::boost::mpl::placeholders::_2 > >
- >
- >::type with_init;
- // do the same for states marked as explicitly created
- typedef typename get_explicit_creation_as_sequence<
- typename ::boost::mpl::eval_if<
- typename has_explicit_creation<Derived>::type,
- get_explicit_creation<Derived>,
- ::boost::mpl::vector<> >::type
- >::type explicit_created;
-
- typedef typename
- ::boost::mpl::fold<
- explicit_created,with_init,
- ::boost::mpl::if_<
- ::boost::mpl::has_key<states, ::boost::mpl::placeholders::_2>,
- ::boost::mpl::placeholders::_1,
- ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::end<mpl::placeholders::_1>,
- not_a_row< ::boost::mpl::placeholders::_2 > >
- >
- >::type type;
-};
-
-// returns the transition table of a Composite state
-template <class Composite>
-struct get_transition_table
-{
- typedef typename create_stt<Composite>::type type;
-};
-// recursively get a transition table for a given composite state.
-// returns the transition table for this state + the tables of all composite sub states recursively
-template <class Composite>
-struct recursive_get_transition_table
-{
- // get the transition table of the state if it's a state machine
- typedef typename ::boost::mpl::eval_if<typename is_composite_state<Composite>::type,
- get_transition_table<Composite>,
- ::boost::mpl::vector0<> >::type org_table;
-
- typedef typename generate_state_set<org_table>::type states;
-
- // and for every substate, recursively get the transition table if it's a state machine
- typedef typename ::boost::mpl::fold<
- states,org_table,
- ::boost::mpl::insert_range< ::boost::mpl::placeholders::_1, ::boost::mpl::end<mpl::placeholders::_1>,
- recursive_get_transition_table< ::boost::mpl::placeholders::_2 > >
- >::type type;
-
-};
-
-// metafunction used to say if a SM has pseudo exit states
-template <class Derived>
-struct has_fsm_delayed_events
-{
- typedef typename create_stt<Derived>::type Stt;
- typedef typename generate_state_set<Stt>::type state_list;
-
- typedef ::boost::mpl::bool_< ::boost::mpl::count_if<
- state_list,has_state_delayed_events< ::boost::mpl::placeholders::_1 > >::value != 0> type;
-};
-
-template <class Transition>
-struct make_vector
-{
- typedef ::boost::mpl::vector<Transition> type;
-};
-template< typename Entry >
-struct get_first_element_pair_second
-{
- typedef typename ::boost::mpl::front<typename Entry::second>::type type;
-};
-
-// returns the owner of an explicit_entry state
-// which is the containing SM if the transition originates from outside the containing SM
-// or else the explicit_entry state itself
-template <class State,class ContainingSM>
-struct get_owner
-{
- typedef typename ::boost::mpl::if_<
- typename ::boost::mpl::not_<typename ::boost::is_same<typename State::owner,ContainingSM>::type>::type,
- typename State::owner,
- State >::type type;
-};
-template <class Sequence,class ContainingSM>
-struct get_fork_owner
-{
- typedef typename ::boost::mpl::front<Sequence>::type seq_front;
- typedef typename ::boost::mpl::if_<
- typename ::boost::mpl::not_<
- typename ::boost::is_same<typename seq_front::owner,ContainingSM>::type>::type,
- typename seq_front::owner,
- seq_front >::type type;
-};
-
-// metafunctions used to find out if a state is entry, exit or something else
-template <class State>
-struct is_pseudo_entry
-{
- typedef typename ::boost::mpl::if_< typename has_pseudo_entry<State>::type,
- ::boost::mpl::bool_<true>,::boost::mpl::bool_<false>
- >::type type;
-};
-// says if a state is an exit pseudo state
-template <class State>
-struct is_pseudo_exit
-{
- typedef typename ::boost::mpl::if_< typename has_pseudo_exit<State>::type,
- ::boost::mpl::bool_<true>, ::boost::mpl::bool_<false>
- >::type type;
-};
-
-// metafunction used to say if a SM has pseudo exit states
-template <class StateType>
-struct has_exit_pseudo_states_helper
-{
- typedef typename create_stt<StateType>::type Stt;
- typedef typename generate_state_set<Stt>::type state_list;
-
- typedef ::boost::mpl::bool_< ::boost::mpl::count_if<
- state_list,is_pseudo_exit< ::boost::mpl::placeholders::_1> >::value != 0> type;
-};
-template <class StateType>
-struct has_exit_pseudo_states
-{
- typedef typename ::boost::mpl::eval_if<typename is_composite_state<StateType>::type,
- has_exit_pseudo_states_helper<StateType>,
- ::boost::mpl::bool_<false> >::type type;
-};
-
-template <class StateType>
-struct is_state_blocking
-{
- typedef typename ::boost::mpl::fold<
- typename StateType::flag_list, ::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 >,
- ::boost::mpl::placeholders::_1 >
- >::type blocking_flags;
-
- typedef typename ::boost::mpl::if_<
- ::boost::mpl::empty<blocking_flags>,
- ::boost::mpl::bool_<false>,
- ::boost::mpl::bool_<true> >::type type;
-};
-// returns a mpl::bool_<true> if fsm has an event blocking flag in one of its substates
-template <class StateType>
-struct has_fsm_blocking_states
-{
- typedef typename create_stt<StateType>::type Stt;
- typedef typename generate_state_set<Stt>::type state_list;
-
- typedef typename ::boost::mpl::fold<
- state_list, ::boost::mpl::set<>,
- ::boost::mpl::if_<
- is_state_blocking< ::boost::mpl::placeholders::_2>,
- ::boost::mpl::insert< ::boost::mpl::placeholders::_1, ::boost::mpl::placeholders::_2 >,
- ::boost::mpl::placeholders::_1 >
- >::type blocking_states;
-
- typedef typename ::boost::mpl::if_<
- ::boost::mpl::empty<blocking_states>,
- ::boost::mpl::bool_<false>,
- ::boost::mpl::bool_<true> >::type type;
-};
-
-// helper to find out if a SM has an active exit state and is therefore waiting for exiting
-template <class StateType,class OwnerFct,class FSM>
-inline
-typename ::boost::enable_if<typename ::boost::mpl::and_<typename is_composite_state<FSM>::type,
- typename is_pseudo_exit<StateType>::type>,bool >::type
-is_exit_state_active(FSM& fsm)
-{
- typedef typename OwnerFct::type Composite;
- typedef typename create_stt<Composite>::type stt;
- int state_id = get_state_id<stt,StateType>::type::value;
- Composite& comp = fsm.template get_state<Composite&>();
- return (std::find(comp.current_state().begin(),comp.current_state().end(),state_id)
- !=comp.current_state().end());
-}
-template <class StateType,class OwnerFct,class FSM>
-inline
-typename ::boost::disable_if<typename ::boost::mpl::and_<typename is_composite_state<FSM>::type,
- typename is_pseudo_exit<StateType>::type>,bool >::type
-is_exit_state_active(FSM& fsm)
-{
- return false;
-}
-
-} } //boost::msm
-
-#endif // BOOST_MSM_METAFUNCTIONS_H
-

Added: sandbox/msm/boost/msm/row_tags.hpp
==============================================================================
--- (empty file)
+++ sandbox/msm/boost/msm/row_tags.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,43 @@
+// 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_ROW_TAGS_H
+#define BOOST_MSM_ROW_TAGS_H
+
+
+
+namespace boost { namespace msm
+{
+//tags
+struct a_row_tag {};
+struct g_row_tag {};
+struct _row_tag {};
+struct row_tag {};
+
+// flags used internally to handle terminate / interrupt states
+struct TerminateFlag
+{
+ typedef int non_forwarding_flag;
+ typedef int event_blocking_flag;
+};
+struct InterruptedFlag
+{
+ typedef int non_forwarding_flag;
+ typedef int event_blocking_flag;
+};
+template <class EndEvent>
+struct EndInterruptFlag
+{
+ typedef int non_forwarding_flag;
+};
+
+} } // boost::msm
+#endif //BOOST_MSM_ROW_TAGS_H
+

Deleted: sandbox/msm/boost/msm/state_machine.hpp
==============================================================================
--- sandbox/msm/boost/msm/state_machine.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,1540 +0,0 @@
-// 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_STATEMACHINE_H
-#define BOOST_MSM_STATEMACHINE_H
-
-#include <vector>
-#include <queue>
-#include <functional>
-#include <numeric>
-#include <utility>
-
-#include <boost/mpl/fold.hpp>
-#include <boost/mpl/transform.hpp>
-#include <boost/mpl/vector.hpp>
-#include <boost/mpl/size.hpp>
-#include <boost/mpl/contains.hpp>
-#include <boost/mpl/insert_range.hpp>
-#include <boost/mpl/for_each.hpp>
-#include <boost/mpl/front.hpp>
-#include <boost/mpl/has_xxx.hpp>
-#include <boost/mpl/logical.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/not.hpp>
-
-#include <boost/assert.hpp>
-#include <boost/type_traits.hpp>
-#include <boost/utility/enable_if.hpp>
-#include <boost/smart_ptr.hpp>
-
-#include <boost/bind.hpp>
-#include <boost/bind/apply.hpp>
-#include <boost/function.hpp>
-#include <boost/msm/metafunctions.hpp>
-#include <boost/msm/history_policies.hpp>
-#include <boost/msm/bind_helpers.hpp>
-#include <boost/msm/copy_policies.hpp>
-#include <boost/msm/common_types.hpp>
-#include <boost/msm/args.hpp>
-#include <boost/msm/dispatch_table.hpp>
-#include <boost/msm/states.hpp>
-
-BOOST_MPL_HAS_XXX_TRAIT_DEF(accept_sig)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(no_exception_thrown)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(no_message_queue)
-
-namespace boost { namespace msm
-{
-
-// This declares the statically-initialized dispatch_table instance.
-template <class Fsm, class HistoryPolicy,class BaseState, class CopyPolicy,class Stt, class Event>
-const dispatch_table<Fsm, HistoryPolicy,BaseState,CopyPolicy,Stt, Event>
-dispatch_table<Fsm, HistoryPolicy,BaseState,CopyPolicy,Stt, Event>::instance;
-
-// CRTP base class for state machines. Pass the actual FSM class as
-// the Derived parameter.
-template<class Derived,class HistoryPolicy=NoHistory,
- class BaseState=default_base_state, class CopyPolicy=NoCopy>
-class state_machine : public state_base<BaseState>,CopyPolicy
-{
-private:
- typedef ::boost::function<
- execute_return ()> transition_fct;
- typedef ::boost::function<
- execute_return () > deferred_fct;
- typedef std::queue<deferred_fct > deferred_events_queue_t;
- typedef std::queue<transition_fct > events_queue_t;
- typedef bool (*flag_handler)(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>&);
- // all state machines are friend with each other to allow embedding any of them in another fsm
- template <class ,class ,class,class > friend class state_machine;
-
- // helper to add, if needed, visitors to all states
- // version without visitors
- template <class StateType,class Enable=void>
- struct visitor_fct_helper
- {
- public:
- visitor_fct_helper(){}
- void fill_visitors(int number_of_states)
- {
- }
- template <class FCT>
- void insert(int index,FCT fct)
- {
- }
- template <class VISITOR>
- void execute(int index,VISITOR vis)
- {
- }
- };
- // version with visitors
- template <class StateType>
- struct visitor_fct_helper<StateType,typename ::boost::enable_if<has_accept_sig<StateType> >::type>
- {
- public:
- visitor_fct_helper():m_state_visitors(){}
- void fill_visitors(int number_of_states)
- {
- m_state_visitors.resize(number_of_states);
- }
- template <class FCT>
- void insert(int index,FCT fct)
- {
- m_state_visitors[index]=fct;
- }
- void execute(int index)
- {
- m_state_visitors[index]();
- }
-
-#define MSM_VISITOR_HELPER_EXECUTE_SUB(z, n, unused) ARG ## n vis ## n
-#define MSM_VISITOR_HELPER_EXECUTE(z, n, unused) \
- template <BOOST_PP_ENUM_PARAMS(n, class ARG)> \
- void execute(int index BOOST_PP_COMMA_IF(n) \
- BOOST_PP_ENUM(n, MSM_VISITOR_HELPER_EXECUTE_SUB, ~ ) ) \
- { \
- m_state_visitors[index](BOOST_PP_ENUM_PARAMS(n,vis)); \
- }
- BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_VISITOR_HELPER_EXECUTE, ~)
-#undef MSM_VISITOR_HELPER_EXECUTE
-#undef MSM_VISITOR_HELPER_EXECUTE_SUB
- private:
- typedef typename StateType::accept_sig::type visitor_fct;
- typedef std::vector<visitor_fct> visitors;
-
- visitors m_state_visitors;
- };
-
- public:
- // tags
- typedef int composite_tag;
-
- // default: no flag
- typedef ::boost::mpl::vector0<> flag_list;
- //default: no deferred events
- typedef ::boost::mpl::vector<> deferred_events;
- // in case someone needs to know
- typedef HistoryPolicy history_policy;
- typedef CopyPolicy copy_policy;
-
- struct InitEvent { };
- // flag handling
- struct Flag_AND
- {
- typedef std::logical_and<bool> type;
- };
- struct Flag_OR
- {
- typedef std::logical_or<bool> type;
- };
- typedef ::boost::shared_ptr<BaseState> pBaseState;
-
- // Member functions
-
- // start the state machine (calls entry of the initial state)
- void start()
- {
- // call on_entry on this SM
- (static_cast<Derived*>(this))->on_entry(InitEvent());
- typedef typename get_initial_states<typename Derived::initial_state>::type init_states;
- ::boost::mpl::for_each<init_states, boost::msm::wrap<mpl::placeholders::_1> >
- (call_init<InitEvent>(&m_state_list[0],InitEvent()));
- }
-
- // 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>
- execute_return process_event(Event const& evt)
- {
- // extend the table with tables from composite states
- typedef typename extend_table<Derived>::type complete_table;
- // use this table as if it came directly from the user
- typedef dispatch_table<Derived,HistoryPolicy,BaseState,CopyPolicy,complete_table,Event> table;
-
- HandledEnum ret_handled=HANDLED_FALSE;
- // if the state machine has terminate or interrupt flags, check them, otherwise skip
- if (is_event_handling_blocked_helper<Derived,Event>())
- return ::boost::make_tuple(HANDLED_TRUE,&this->m_states);
- // if a message queue is needed and processing is on the way
- if (!do_pre_msg_queue_helper<Derived,Event>(evt))
- {
- // wait for the end of current processing
- return ::boost::make_tuple(HANDLED_TRUE,&this->m_states);
- }
- else
- {
- // event can be handled, processing
- // prepare the next deferred event for handling
- // if one defer is found in the SM, otherwise skip
- handle_defer_helper<Derived> defer_helper(m_deferred_events_queue);
- defer_helper.do_pre_handle_deferred();
- // process event
- bool handled = this->do_process_helper<Derived,Event>(evt);
- if (handled)
- {
- ret_handled = HANDLED_TRUE;
- }
- // after handling, take care of the deferred events
- defer_helper.do_post_handle_deferred();
-
- // 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<Derived>();
- return ::boost::make_tuple(ret_handled,&this->m_states);
- }
- }
-
- // Getter that returns the current state of the FSM
- const std::vector<int>& current_state() const
- {
- return this->m_states;
- }
-
- // return the state whose id is passed or 0 if not found
- // caution if you need this, you probably need polymorphic states
- const BaseState* get_state_by_id(int id) const
- {
- typedef typename create_stt<Derived>::type stt;
- typedef typename generate_state_set<stt>::type state_list;
- BOOST_STATIC_CONSTANT(int, max_state = ( ::boost::mpl::size<state_list>::value));
- BOOST_ASSERT(id < (max_state));
- if (id < max_state)
- return (this->m_state_list[id]).get();
- // error
- return 0;
- }
- // true if the sm is used in another sm
- bool is_contained() const
- {
- return m_is_included;
- }
- // get a state
- // as a pointer
- template <class State>
- typename ::boost::enable_if<typename ::boost::is_pointer<State>::type,State >::type
- get_state(::boost::msm::dummy<0> = 0)
- {
- typedef typename create_stt<Derived>::type stt;
- return &(static_cast<typename boost::add_reference<typename ::boost::remove_pointer<State>::type>::type >
- (*(m_state_list[get_state_id<stt,typename ::boost::remove_pointer<State>::type>::type::value])));
- }
- // as a reference
- template <class State>
- typename ::boost::enable_if<typename ::boost::is_reference<State>::type,State >::type
- get_state(::boost::msm::dummy<1> = 0)
- {
- typedef typename create_stt<Derived>::type stt;
- return static_cast<State >
- (*(m_state_list[get_state_id<stt,typename ::boost::remove_reference<State>::type>::type::value]));
- }
-
- // checks if a flag is active using the BinaryOp as folding function
- template <class Flag,class BinaryOp>
- bool is_flag_active()
- {
- flag_handler* flags_entries = get_entries_for_flag<Flag>();
-
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
- return std::accumulate(m_states.begin(),
- m_states.end(),false,
- ::boost::bind(typename BinaryOp::type(),
- ::boost::bind(::boost::apply<bool>(),
- ::boost::bind(::boost::msm::deref<flag_handler>(),
- ::boost::bind(::boost::msm::plus2<flag_handler*,int>(),
- flags_entries, _2)),
- ::boost::ref(*this)), _1));
- }
- // checks if a flag is active using no binary op if 1 region, or OR if > 1 regions
- template <class Flag>
- bool is_flag_active()
- {
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
- return FlagHelper<Flag,(nr_regions::value>1)>::helper(*this,get_entries_for_flag<Flag>());
- }
- // visit the currently active states (if these are defined as visitable
- // by implementing accept)
- void visit_current_states()
- {
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
- for (int i=0; i<nr_regions::value;++i)
- {
- m_visitors.execute(m_states[i]);
- }
- }
-#define MSM_VISIT_STATE_SUB(z, n, unused) ARG ## n vis ## n
-#define MSM_VISIT_STATE_EXECUTE(z, n, unused) \
- template <BOOST_PP_ENUM_PARAMS(n, class ARG)> \
- void visit_current_states(BOOST_PP_ENUM(n, MSM_VISIT_STATE_SUB, ~ ) ) \
- { \
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions; \
- for (int i=0; i<nr_regions::value;++i) \
- { \
- m_visitors.execute(m_states[i],BOOST_PP_ENUM_PARAMS(n,vis)); \
- } \
- }
- BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_VISIT_STATE_EXECUTE, ~)
-#undef MSM_VISIT_STATE_EXECUTE
-#undef MSM_VISIT_STATE_SUB
-
- protected: // interface for the derived class
- typedef std::vector<pBaseState> pstate_base_list;
-
- // helper used to fill the initial states
- struct init_states
- {
- init_states(std::vector<int>& init):m_initial_states(init){}
-
- // History initializer function object, used with mpl::for_each
- template <class State>
- void operator()(::boost::msm::wrap<State> const&)
- {
- typedef typename create_stt<Derived>::type stt;
- m_initial_states.push_back(get_state_id<stt,State>::type::value);
- }
- std::vector<int>& m_initial_states;
- };
- // Construct with the default initial states
- state_machine()
- :state_base<BaseState>()
- ,CopyPolicy()
- ,m_states()
- ,m_events_queue()
- ,m_deferred_events_queue()
- ,m_history()
- ,m_state_list()
- ,m_event_processing(false)
- ,m_is_included(false)
- ,m_visitors()
- {
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
- m_states.reserve(nr_regions::value);
- // build a sequence of regions if needed
- typedef typename get_regions_as_sequence<typename Derived::initial_state>::type initial_states;
- // initialize our list of states with the ones defined in Derived::initial_state
- ::boost::mpl::for_each< initial_states, ::boost::msm::wrap<mpl::placeholders::_1> >
- (init_states(m_states));
- m_history.set_initial_states(m_states);
- // create states
- fill_states(this);
- }
- // template constructor. Needed only for sub-fsms having exit pseudo states.
- template <class ContainingSM>
- state_machine(ContainingSM* containing_sm)
- :state_base<BaseState>()
- ,CopyPolicy()
- ,m_states()
- ,m_events_queue()
- ,m_deferred_events_queue()
- ,m_history()
- ,m_state_list()
- ,m_event_processing(false)
- ,m_is_included(true)
- ,m_visitors()
- {
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
- m_states.reserve(nr_regions::value);
- // build a sequence of regions if needed
- typedef typename get_regions_as_sequence<typename Derived::initial_state>::type initial_states;
- // initialize our list of states with the ones defined in Derived::initial_state
- ::boost::mpl::for_each< initial_states, boost::msm::wrap<mpl::placeholders::_1> >
- (init_states(m_states));
- m_history.set_initial_states(m_states);
- // create states
- fill_states(containing_sm);
- }
- // assignment operator using the copy policy to decide if non_copyable, shallow or deep copying is necessary
- state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>& operator=
- (state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy> const& rhs)
- {
- if (this != &rhs)
- {
- CopyPolicy::operator=(rhs);
- do_copy<mpl::bool_<CopyPolicy::shallow_copy::value> >(rhs);
- }
- return *this;
- }
- state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>
- (state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy> const& rhs):CopyPolicy(rhs)
- {
- if (this != &rhs)
- {
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
- m_states.reserve(nr_regions::value);
- // build a sequence of regions if needed
- typedef typename get_regions_as_sequence<typename Derived::initial_state>::type initial_states;
- // initialize our list of states with the ones defined in Derived::initial_state
- fill_states(this);
- do_copy<mpl::bool_<CopyPolicy::shallow_copy::value> >(rhs);
- }
- }
-
- // 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::dummy<0> = 0)
- {
- // if the state machine is terminated, do not handle any event
- if (is_flag_active< ::boost::msm::TerminateFlag>())
- return true;
- // if the state machine is interrupted, do not handle any event
- // unless the event is the end interrupt event
- if ( is_flag_active< ::boost::msm::InterruptedFlag>() &&
- !is_flag_active< ::boost::msm::EndInterruptFlag<Event> >())
- return true;
- 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::dummy<1> = 0)
- {
- // 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 has_no_message_queue<StateType>::type,bool >::type
- do_pre_msg_queue_helper(EventType const& evt, ::boost::msm::dummy<0> = 0)
- {
- // no message queue needed
- return true;
- }
- template <class StateType,class EventType>
- typename ::boost::disable_if<typename has_no_message_queue<StateType>::type,bool >::type
- do_pre_msg_queue_helper(EventType const& evt, ::boost::msm::dummy<1> = 0)
- {
- execute_return (state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>::*pf) (EventType const& evt) =
- &state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>::process_event;
- // if we are already processing an event
- if (m_event_processing)
- {
- // event has to be put into the queue
- transition_fct f = ::boost::bind(pf,this,evt);
- 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 has_no_message_queue<StateType>::type,void >::type
- do_post_msg_queue_helper( ::boost::msm::dummy<0> = 0)
- {
- // no message queue needed
- }
- template <class StateType>
- typename ::boost::disable_if<typename has_no_message_queue<StateType>::type,void >::type
- do_post_msg_queue_helper( ::boost::msm::dummy<1> = 0)
- {
- m_event_processing = false;
- process_message_queue();
- }
- // 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 has_no_exception_thrown<StateType>::type,bool >::type
- do_process_helper(EventType const& evt, ::boost::msm::dummy<0> = 0)
- {
- return this->do_process_event(evt);
- }
- template <class StateType,class EventType>
- typename ::boost::disable_if<typename has_no_exception_thrown<StateType>::type,bool >::type
- do_process_helper(EventType const& evt, ::boost::msm::dummy<1> = 0)
- {
- try
- {
- return this->do_process_event(evt);
- }
- catch (std::exception& e)
- {
- // give a chance to the concrete state machine to handle
- (static_cast<Derived*>(this))->exception_caught(e);
- }
- return false;
- }
- // handling of deferred events
- // if none is found in the SM, take the following empty main version
- template <class StateType, class Enable = void>
- struct handle_defer_helper
- {
- handle_defer_helper(deferred_events_queue_t& a_queue){}
- void do_pre_handle_deferred()
- {
- }
-
- void do_post_handle_deferred()
- {
- }
- };
- // otherwise the standard version handling the deferred events
- template <class StateType>
- struct handle_defer_helper
- <StateType, typename enable_if< typename ::boost::msm::has_fsm_delayed_events<StateType>::type >::type>
- {
- handle_defer_helper(deferred_events_queue_t& a_queue):events_queue(a_queue),next_deferred_event(){}
- void do_pre_handle_deferred()
- {
- if (!events_queue.empty())
- {
- next_deferred_event = events_queue.front();
- events_queue.pop();
- }
- }
-
- void do_post_handle_deferred()
- {
- if (next_deferred_event)
- {
- next_deferred_event();
- }
- }
-
- private:
- deferred_events_queue_t& events_queue;
- deferred_fct next_deferred_event;
- };
-
- // minimum event processing without exceptions, queues, etc.
- template<class Event>
- bool do_process_event(Event const& evt)
- {
- // extend the table with tables from composite states
- typedef typename extend_table<Derived>::type complete_table;
- // use this table as if it came directly from the user
- typedef dispatch_table<Derived,HistoryPolicy,BaseState,CopyPolicy,
- complete_table,Event> table;
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
-
- bool 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]](
- *static_cast<Derived*>(this), this->m_states[i], &m_state_list[0],evt);
- this->m_states[i] = res.first;
- handled = (handled || res.second);
- }
- // 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
- if (!handled && !is_contained())
- {
- for (int i=0; i<nr_regions::value;++i)
- {
- (static_cast<Derived*>(this))->no_transition(this->m_states[i],evt);
- }
- }
- return handled;
- }
-
- // default row arguments for the compilers which accept this
- template <class Event>
- bool no_guard(Event const&){return true;}
- template <class Event>
- void no_action(Event const&){}
-
- // Template used to form rows in the transition table
- template<
- typename T1
- , class Event
- , typename T2
- , void (Derived::*action)(Event const&)
-#if !defined(__GNUC__)
- = static_cast<void (Derived::*)(Event const&)>(&no_action<Event>)
-#endif
- , bool (Derived::*guard)(Event const&)
-#if !defined(__GNUC__)
- = static_cast<bool (Derived::*)(Event const&)>(&no_guard<Event>)
-#endif
- >
- struct row
- {
- // if the source has no automatic creation (i.e. is an exit pseudo state), then
- // current_state_type becomes the result of get_owner
- // meaning the containing SM from which the exit occurs
- typedef typename ::boost::mpl::eval_if<
- typename has_no_automatic_create<T1>::type,
- get_owner<T1,Derived>,
- ::boost::mpl::identity<T1> >::type current_state_type;
-
- // if Target is a sequence, then we have a fork and expect a sequence of explicit_entry
- // else if Target is an explicit_entry, next_state_type becomes the result of get_owner
- // meaning the containing SM if the row is "outside" the containing SM or else the explicit_entry state itself
- typedef typename ::boost::mpl::eval_if<
- typename ::boost::mpl::is_sequence<T2>::type,
- get_fork_owner<T2,Derived>,
- ::boost::mpl::eval_if<
- typename has_no_automatic_create<T2>::type,
- get_owner<T2,Derived>,
- ::boost::mpl::identity<T2> >
- >::type next_state_type;
-
- typedef Event event;
-
- // if a guard condition is here, call it to check that the event is accepted
- static bool check_guard(Derived& fsm,Event const& evt)
- {
- if (!guard || (guard && (fsm.*guard)(evt)))
- return true;
- return false;
- }
- // Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(Derived& fsm, int state, pBaseState* all_states, Event const& evt)
- {
- typedef typename create_stt<Derived>::type stt;
-
- 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 T1 is an exit pseudo state, then take the transition only if the pseudo exit state is active
- if (!::boost::is_same<T1,current_state_type>::value &&
- !is_exit_state_active<T1,get_owner<T1,Derived> >(fsm))
- {
- return std::make_pair(current_state,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);
- }
-
- // the guard condition has already been checked
- execute_exit<current_state_type>(all_states[current_state].get(),evt);
- if (action)
- {
- // then call the action method
- (fsm.*action)(evt);
- }
- // and finally the entry method of the new current state
- convert_event_and_execute_entry<next_state_type,T2>(all_states[next_state].get(),evt);
- return std::make_pair(next_state,HANDLED_TRUE);
- }
- };
-
- // row having only a guard condition
- template<
- typename T1
- , class Event
- , typename T2
- , bool (Derived::*guard)(Event const&)
- >
- struct g_row
- {
- // if the source has no automatic creation (i.e. is an exit pseudo state), then
- // current_state_type becomes the result of get_owner
- // meaning the containing SM from which the exit occurs
- typedef typename ::boost::mpl::eval_if<
- typename has_no_automatic_create<T1>::type,
- get_owner<T1,Derived>,
- ::boost::mpl::identity<T1> >::type current_state_type;
-
- // if Target is a sequence, then we have a fork and expect a sequence of explicit_entry
- // else if Target is an explicit_entry, next_state_type becomes the result of get_owner
- // meaning the containing SM if the row is "outside" the containing SM or else the explicit_entry state itself
- typedef typename ::boost::mpl::eval_if<
- typename ::boost::mpl::is_sequence<T2>::type,
- get_fork_owner<T2,Derived>,
- ::boost::mpl::eval_if<
- typename has_no_automatic_create<T2>::type,
- get_owner<T2,Derived>,
- ::boost::mpl::identity<T2> >
- >::type next_state_type;
-
- typedef Event event;
-
- // if a guard condition is defined, call it to check that the event is accepted
- static bool check_guard(Derived& fsm,Event const& evt)
- {
- if (!guard || (guard && (fsm.*guard)(evt)))
- return true;
- return false;
- }
- // Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(Derived& fsm, int state, pBaseState* all_states, Event const& evt)
- {
- typedef typename create_stt<Derived>::type stt;
- 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 T1 is an exit pseudo state, then take the transition only if the pseudo exit state is active
- if (!::boost::is_same<T1,current_state_type>::value &&
- !is_exit_state_active<T1,get_owner<T1,Derived> >(fsm))
- {
- return std::make_pair(current_state,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);
- }
- // the guard condition has already been checked
- execute_exit<current_state_type>(all_states[current_state].get(),evt);
-
- // and finally the entry method of the new current state
- convert_event_and_execute_entry<next_state_type,T2>(all_states[next_state].get(),evt);
- return std::make_pair(next_state,HANDLED_TRUE);
- }
- };
-
- // row having only an action method
- template<
- typename T1
- , class Event
- , typename T2
- , void (Derived::*action)(Event const&)
- >
- struct a_row
- {
- // if the source has no automatic creation (i.e. is an exit pseudo state), then
- // current_state_type becomes the result of get_owner
- // meaning the containing SM from which the exit occurs
- typedef typename ::boost::mpl::eval_if<
- typename has_no_automatic_create<T1>::type,
- get_owner<T1,Derived>,
- ::boost::mpl::identity<T1> >::type current_state_type;
-
- // if Target is a sequence, then we have a fork and expect a sequence of explicit_entry
- // else if Target is an explicit_entry, next_state_type becomes the result of get_owner
- // meaning the containing SM if the row is "outside" the containing SM or else the explicit_entry state itself
- typedef typename ::boost::mpl::eval_if<
- typename ::boost::mpl::is_sequence<T2>::type,
- get_fork_owner<T2,Derived>,
- ::boost::mpl::eval_if<
- typename has_no_automatic_create<T2>::type,
- get_owner<T2,Derived>,
- ::boost::mpl::identity<T2> >
- >::type next_state_type;
-
- typedef Event event;
-
- // Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(Derived& fsm, int state, pBaseState* all_states, Event const& evt)
- {
- typedef typename create_stt<Derived>::type stt;
- 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 T1 is an exit pseudo state, then take the transition only if the pseudo exit state is active
- if (!::boost::is_same<T1,current_state_type>::value &&
- !is_exit_state_active<T1,get_owner<T1,Derived> >(fsm))
- {
- return std::make_pair(current_state,HANDLED_FALSE);
- }
- // no need to check the guard condition
- // first call the exit method of the current state
- execute_exit<current_state_type>(all_states[current_state].get(),evt);
- if (action)
- {
- // then call the action method
- (fsm.*action)(evt);
- }
- // and finally the entry method of the new current state
- convert_event_and_execute_entry<next_state_type,T2>(all_states[next_state].get(),evt);
- return std::make_pair(next_state,HANDLED_TRUE);
- }
- };
-
- // row having no guard condition or action, simply transitions
- template<
- typename T1
- , class Event
- , typename T2
- >
- struct _row
- {
- // if the source has no automatic creation (i.e. is an exit pseudo state), then
- // current_state_type becomes the result of get_owner
- // meaning the containing SM from which the exit occurs
- typedef typename ::boost::mpl::eval_if<
- typename has_no_automatic_create<T1>::type,
- get_owner<T1,Derived>,
- ::boost::mpl::identity<T1> >::type current_state_type;
-
- // if Target is a sequence, then we have a fork and expect a sequence of explicit_entry
- // else if Target is an explicit_entry, next_state_type becomes the result of get_owner
- // meaning the containing SM if the row is "outside" the containing SM or else the explicit_entry state itself
- typedef typename ::boost::mpl::eval_if<
- typename ::boost::mpl::is_sequence<T2>::type,
- get_fork_owner<T2,Derived>,
- ::boost::mpl::eval_if<
- typename has_no_automatic_create<T2>::type,
- get_owner<T2,Derived>,
- ::boost::mpl::identity<T2> >
- >::type next_state_type;
-
- typedef Event event;
-
- // Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(Derived& fsm, int state, pBaseState* all_states, Event const& evt)
- {
- typedef typename create_stt<Derived>::type stt;
- 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 T1 is an exit pseudo state, then take the transition only if the pseudo exit state is active
- if (!::boost::is_same<T1,current_state_type>::value &&
- !is_exit_state_active<T1,get_owner<T1,Derived> >(fsm))
- {
- return std::make_pair(current_state,HANDLED_FALSE);
- }
- // first call the exit method of the current state
- execute_exit<current_state_type>(all_states[current_state].get(),evt);
-
- // and finally the entry method of the new current state
- convert_event_and_execute_entry<next_state_type,T2>(all_states[next_state].get(),evt);
- return std::make_pair(next_state,HANDLED_TRUE);
- }
- };
-private:
-
- // helper used to call the init states at the start of the state machine
- template <class Event>
- struct call_init
- {
- call_init(pBaseState* states,Event const& an_event):all_states(states),evt(an_event){}
- template <class State>
- void operator()(boost::msm::wrap<State> const&)
- {
- typedef typename create_stt<Derived>::type stt;
- execute_entry<State>(all_states[get_state_id<stt,State>::type::value].get(),evt);
- }
- private:
- pBaseState* all_states;
- Event const& evt;
- };
- // helper for flag handling. Uses OR by default on orthogonal zones.
- template <class Flag,bool orthogonalStates>
- struct FlagHelper
- {
- static bool helper(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>& sm,flag_handler* )
- {
- // by default we use OR to accumulate the flags
- return sm.is_flag_active<Flag,Flag_OR>();
- }
- };
- template <class Flag>
- struct FlagHelper<Flag,false>
- {
- static bool helper(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>& sm,flag_handler* flags_entries)
- {
- // just one active state, so we can call operator[] with 0
- return flags_entries[sm.current_state()[0]](sm);
- }
- };
- // handling of flag
- // defines a true and false functions plus a forwarding one for composite states
- template <class StateType,class Flag>
- struct FlagHandler
- {
- static bool flag_true(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>& )
- {
- return true;
- }
- static bool flag_false(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>& )
- {
- return false;
- }
- static bool forward(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>& fsm)
- {
- typedef typename create_stt<Derived>::type stt;
- return (static_cast<StateType& >
- (*(fsm.m_state_list[get_state_id<stt,StateType>::type::value]))).is_flag_active<Flag>();
- }
- };
- template <class Flag>
- struct init_flags
- {
- 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::dummy<0> = 0 )
- {
- // 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::dummy<1> = 0 )
- {
- // default no flag
- an_entry[offset] = &FlagHandler<T,Flag>::flag_false;
- }
- // attributes
- flag_handler* entries;
-
- public:
- init_flags(flag_handler* entries_)
- : entries(entries_)
- {}
-
- // Flags initializer function object, used with mpl::for_each
- template <class StateType>
- void operator()( ::boost::msm::wrap<StateType> const& )
- {
- typedef typename StateType::flag_list flags;
- typedef typename ::boost::mpl::contains<flags,Flag >::type found;
- typedef typename is_composite_state<StateType>::type composite;
- typedef typename create_stt<Derived>::type stt;
-
- BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,StateType>::type::value));
- if (found::type::value)
- {
- // the type defined the flag => true
- entries[state_id] = &FlagHandler<StateType,Flag>::flag_true;
- }
- else
- {
- // false or forward
- helper<StateType>(entries,state_id);
- }
- }
- };
- // maintains for every flag a static array containing the flag value for every state
- template <class Flag>
- flag_handler* get_entries_for_flag()
- {
- typedef typename create_stt<Derived>::type Stt;
- typedef typename generate_state_set<Stt>::type state_list;
- BOOST_STATIC_CONSTANT(int, max_state = (mpl::size<state_list>::value));
-
- static flag_handler flags_entries[max_state];
- // build a state list
- ::boost::mpl::for_each<state_list, boost::msm::wrap< ::boost::mpl::placeholders::_1> >
- (init_flags<Flag>(flags_entries));
- return flags_entries;
- }
-
- // helper used to create a state using the correct constructor
- template <class State, class Enable=void>
- struct create_state_helper
- {
- static void set_sm(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>* ,pBaseState )
- {
- // state doesn't need its sm
- }
- };
- // create a state requiring a pointer to the state machine
- template <class State>
- struct create_state_helper<State,typename boost::enable_if<typename State::needs_sm >::type>
- {
- static void set_sm(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>* sm,pBaseState new_state)
- {
- // create and set the fsm
- static_cast<State*>(new_state.get())->set_sm_ptr(static_cast<Derived*>(sm));
- }
- };
- // A function object for use with mpl::for_each that stuffs
- // states into the state list.
- template<class ContainingSM>
- struct add_state
- {
- add_state(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>* self_,ContainingSM* sm)
- : self(self_),containing_sm(sm){}
-
- // State is a sub fsm with exit pseudo states and gets a pointer to this fsm, so it can build a callback
- template <class StateType>
- typename ::boost::enable_if<
- typename has_exit_pseudo_states<StateType>::type,pBaseState >::type
- new_state_helper(boost::msm::dummy<0> = 0) const
- {
- return pBaseState(new StateType(containing_sm));
- }
- // State is a sub fsm without exit pseudo states and does not get a callback to this fsm
- // or state is a normal state and needs nothing except creation
- template <class StateType>
- typename ::boost::enable_if<
- typename boost::mpl::and_<typename boost::mpl::not_
- <typename has_exit_pseudo_states<StateType>::type>::type,
- typename boost::mpl::not_
- <typename is_pseudo_exit<StateType>::type>::type
- >::type,pBaseState>::type
- new_state_helper( ::boost::msm::dummy<1> = 0) const
- {
- return pBaseState(new StateType);
- }
- // state is exit pseudo state and gets callback to target fsm
- template <class StateType>
- typename ::boost::enable_if<typename is_pseudo_exit<StateType>::type,pBaseState >::type
- new_state_helper( ::boost::msm::dummy<2> = 0) const
- {
- pBaseState to_return (new StateType());
- execute_return (ContainingSM::*pf) (typename StateType::event const& evt)=
- &ContainingSM::process_event;
- ::boost::function<execute_return (typename StateType::event const&)> fct =
- ::boost::bind(pf,containing_sm,_1);
- static_cast<StateType*>(to_return.get())->set_forward_fct(fct);
- return to_return;
- }
- // for every defined state in the sm
- template <class State>
- void operator()( ::boost::msm::wrap<State> const&) const
- {
- //create a new state with the defined id and type
- typedef typename create_stt<Derived>::type stt;
- BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,State>::value));
-
- pBaseState new_state (this->new_state_helper<State>());
- self->m_state_list[state_id]= new_state;
- create_state_helper<State>::set_sm(self,new_state);
- // create a visitor callback
- visitor_helper<State>(state_id,new_state.get());
- }
- 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,BaseState* astate,::boost::msm::dummy<0> = 0) const
- {
- visitor_args<StateType,StateType::accept_sig::args_number>::helper(self,id,astate);
- }
- template <class StateType>
- typename ::boost::disable_if<typename has_accept_sig<StateType>::type,void >::type
- visitor_helper(int id,BaseState* astate,::boost::msm::dummy<1> = 0) const
- {
- // nothing to do
- }
- // main unspecialized helper class
- template <class StateType,int ARGS>
- struct visitor_args;
-#define MSM_VISITOR_ARGS_SUB(z, n, unused) BOOST_PP_CAT(_,BOOST_PP_ADD(n,1))
-#define MSM_VISITOR_ARGS_EXECUTE(z, n, unused) \
- template <class StateType> \
- struct visitor_args<StateType,n> \
- { \
- static void helper (state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>* sm, \
- int id,BaseState* astate) \
- { \
- sm->m_visitors.insert(id, boost::bind(&StateType::accept, \
- static_cast<StateType*>(astate) BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, MSM_VISITOR_ARGS_SUB, ~) )); \
- } \
- };
-BOOST_PP_REPEAT(BOOST_PP_ADD(BOOST_MSM_VISITOR_ARG_SIZE,1), MSM_VISITOR_ARGS_EXECUTE, ~)
-#undef MSM_VISITOR_ARGS_EXECUTE
-#undef MSM_VISITOR_ARGS_SUB
-
- state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>* self;
- ContainingSM* containing_sm;
- };
-
- // helper used to copy every state if needed
- struct copy_helper
- {
- copy_helper(pstate_base_list& to_fill,const pstate_base_list& rhs,
- state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>* sm):
- m_tofill_states(to_fill),m_rhs(rhs),m_sm(sm){}
- template <class StateType>
- void operator()( ::boost::msm::wrap<StateType> const& )
- {
- typedef typename create_stt<Derived>::type stt;
- BOOST_STATIC_CONSTANT(int, state_id = (get_state_id<stt,StateType>::type::value));
- if (m_rhs.empty())
- return;
- pBaseState copiedState
- (new StateType (*static_cast<StateType*> (m_rhs[state_id].get())));
- m_tofill_states[state_id] = copiedState;
- // possibly also set the visitor
- visitor_helper<StateType>(state_id,copiedState.get());
-
- // and for states that keep a pointer to the fsm, reset the pointer
- create_state_helper<StateType>::set_sm(m_sm,copiedState);
- }
- template <class StateType>
- typename ::boost::enable_if<typename has_accept_sig<StateType>::type,void >::type
- visitor_helper(int id,BaseState* astate) const
- {
- m_sm->m_visitors.insert(id, ::boost::bind(&StateType::accept,
- static_cast<StateType*>(astate),_1));
- }
- template <class StateType>
- typename ::boost::disable_if<typename has_accept_sig<StateType>::type,void >::type
- visitor_helper(int id,BaseState* astate) const
- {
- // nothing to do
- }
-
- pstate_base_list& m_tofill_states;
- const pstate_base_list& m_rhs;
- state_machine<Derived,HistoryPolicy,
- BaseState,CopyPolicy>* m_sm;
- };
-
- // copy functions for shallow or deep copy (no need of a 3rd version for NoCopy as noncopyable handles it)
- template <class IsShallowCopy>
- typename ::boost::disable_if<typename IsShallowCopy::type,void >::type
- do_copy (state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy> const& rhs,
- ::boost::msm::dummy<0> = 0)
- {
- // deep copy simply assigns the data
- m_states = rhs.m_states;
- m_events_queue = rhs.m_events_queue;
- m_deferred_events_queue = rhs.m_deferred_events_queue;
- m_history = rhs.m_history;
- m_event_processing = rhs.m_event_processing;
- m_is_included = rhs.m_is_included;
- // except for the states themselves, which get duplicated
- typedef typename create_stt<Derived>::type Stt;
-
- typedef typename generate_state_set<Stt>::type state_list;
- ::boost::mpl::for_each<state_list, ::boost::msm::wrap< ::boost::mpl::placeholders::_1> >
- (copy_helper(m_state_list,rhs.m_state_list,this));
- }
- template <class IsShallowCopy>
- typename ::boost::enable_if<typename IsShallowCopy::type,void >::type
- do_copy (state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy> const& rhs,
- ::boost::msm::dummy<1> = 0)
- {
- // shallow copy simply assigns the data
- m_states = rhs.m_states;
- m_events_queue = rhs.m_events_queue;
- m_deferred_events_queue = rhs.m_deferred_events_queue;
- m_history = rhs.m_history;
- m_state_list = rhs.m_state_list;
- m_event_processing = rhs.m_event_processing;
- m_is_included = rhs.m_is_included;
- m_visitors = rhs.m_visitors;
- }
-
- // helper used to call the correct entry/exit method
- // unfortunately in O(number of states in the sub-sm) but should be better than a virtual call
- template<class Event,bool is_entry>
- struct entry_exit_helper
- {
- entry_exit_helper(int id,Event const& e,pBaseState* states):state_id(id),evt(e),all_states(states){}
- // helper for entry actions
- template <class IsEntry,class State>
- typename ::boost::enable_if<typename IsEntry::type,void >::type
- helper( ::boost::msm::dummy<0> = 0)
- {
- typedef typename create_stt<Derived>::type stt;
- BOOST_STATIC_CONSTANT(int, id = (get_state_id<stt,State>::value));
- if (id == state_id)
- {
- execute_entry<State>(all_states[id].get(),evt);
- }
- }
- // helper for exit actions
- template <class IsEntry,class State>
- typename boost::disable_if<typename IsEntry::type,void >::type
- helper( ::boost::msm::dummy<1> = 0)
- {
- typedef typename create_stt<Derived>::type stt;
- BOOST_STATIC_CONSTANT(int, id = (get_state_id<stt,State>::value));
- if (id == state_id)
- {
- execute_exit<State>(all_states[id].get(),evt);
- }
- }
- // iterates through all states to find the one to be activated
- template <class State>
- void operator()( ::boost::msm::wrap<State> const&)
- {
- entry_exit_helper<Event,is_entry>::template helper< ::boost::mpl::bool_<is_entry>,State >();
- }
- private:
- int state_id;
- Event const& evt;
- pBaseState* all_states;
- };
- // start for states machines which are themselves embedded in other state machines (composites)
- template <class Event>
- void start(Event const& incomingEvent)
- {
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
- typedef typename create_stt<Derived>::type stt;
- typedef typename generate_state_set<stt>::type state_list;
- for (int i=0; i<nr_regions::value;++i)
- {
- //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>(m_states[i],incomingEvent,&m_state_list[0]));
- }
- }
-
- // helper used to set the correct state as active state upon entry into a fsm
- struct direct_event_start_helper
- {
- direct_event_start_helper(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>* self_):self(self_){}
- // this variant is for the standard case, entry due to activation of the containing FSM
- template <class EventType>
- typename ::boost::disable_if<typename has_direct_entry<EventType>::type,void>::type
- operator()(EventType const& evt, ::boost::msm::dummy<0> = 0)
- {
- (static_cast<Derived*>(self))->on_entry(evt);
- self->start(evt);
- }
-
- // this variant is for the direct entry case (just one entry, not a sequence of entries)
- template <class EventType>
- typename ::boost::enable_if<
- typename ::boost::mpl::and_<
- typename ::boost::mpl::not_< typename is_pseudo_entry<
- typename EventType::active_state>::type >::type,
- typename ::boost::mpl::and_<typename has_direct_entry<EventType>::type,
- typename ::boost::mpl::not_<typename ::boost::mpl::is_sequence
- <typename EventType::active_state>::type >::type
- >::type>::type,void
- >::type
- operator()(EventType const& evt, ::boost::msm::dummy<1> = 0)
- {
- (static_cast<Derived*>(self))->on_entry(evt);
- typedef typename create_stt<Derived>::type stt;
- int state_id = get_state_id<stt,typename EventType::active_state>::value;
- BOOST_STATIC_ASSERT(EventType::active_state::zone_index >= 0);
- BOOST_STATIC_ASSERT(EventType::active_state::zone_index <=
- get_number_of_regions<typename Derived::initial_state>::type::value);
- // just set the correct zone, the others will be default/history initialized
- self->m_states[EventType::active_state::zone_index] = state_id;
- self->start(evt.m_event);
- }
-
- // this variant is for the fork entry case (a sequence on entries)
- template <class EventType>
- typename ::boost::enable_if<
- typename ::boost::mpl::and_<
- typename ::boost::mpl::not_<
- typename is_pseudo_entry<typename EventType::active_state>::type >::type,
- typename ::boost::mpl::and_<typename has_direct_entry<EventType>::type,
- typename ::boost::mpl::is_sequence<
- typename EventType::active_state>::type
- >::type>::type,void
- >::type
- operator()(EventType const& evt, ::boost::msm::dummy<2> = 0)
- {
- (static_cast<Derived*>(self))->on_entry(evt);
- ::boost::mpl::for_each<typename EventType::active_state,
- ::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);
- }
-
- // this variant is for the pseudo state entry case
- template <class EventType>
- typename ::boost::enable_if<
- typename is_pseudo_entry<typename EventType::active_state >::type,void
- >::type
- operator()(EventType const& evt, ::boost::msm::dummy<3> = 0)
- {
- // entry on the FSM
- (static_cast<Derived*>(self))->on_entry(evt);
- typedef typename create_stt<Derived>::type stt;
- int state_id = get_state_id<stt,typename EventType::active_state>::value;
- // given region starts with the entry pseudo state as active state
- self->m_states[EventType::active_state::zone_index] = state_id;
- self->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);
- }
- private:
- // helper for the fork case, does almost like the direct entry
- state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>* self;
- template <class EventType>
- struct fork_helper
- {
- fork_helper(state_machine<Derived,HistoryPolicy,BaseState,CopyPolicy>* self_,EventType const& evt_):
- helper_self(self_),helper_evt(evt_){}
- template <class StateType>
- void operator()( ::boost::msm::wrap<StateType> const& )
- {
- typedef typename create_stt<Derived>::type stt;
- int state_id = get_state_id<stt,StateType>::value;
- BOOST_STATIC_ASSERT(StateType::zone_index >= 0);
- BOOST_STATIC_ASSERT(StateType::zone_index <=
- get_number_of_regions<typename Derived::initial_state>::type::value);
- helper_self->m_states[StateType::zone_index] = state_id;
- }
- private:
- state_machine<Derived,HistoryPolicy,
- BaseState,CopyPolicy>* helper_self;
- EventType const& helper_evt;
- };
- };
-
- // entry/exit for states machines which are themselves embedded in other state machines (composites)
- template <class Event>
- void entry(Event const& incomingEvent)
- {
- // by default we activate the history/init states, can be overwritten by direct_event_start_helper
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
- for (int i=0; i<nr_regions::value;++i)
- {
- this->m_states[i] = m_history.history_entry(incomingEvent)[i];
- }
- // 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();
- }
- template <class Event>
- void exit(Event const& incomingEvent)
- {
- typedef typename get_number_of_regions<typename Derived::initial_state>::type nr_regions;
- typedef typename create_stt<Derived>::type stt;
- typedef typename generate_state_set<stt>::type state_list;
- 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::wrap< ::boost::mpl::placeholders::_1> >
- (entry_exit_helper<Event,false>(m_states[i],incomingEvent,&m_state_list[0]));
- }
- // then call our own exit
- (static_cast<Derived*>(this))->on_exit(incomingEvent);
- // give the history a chance to handle this (or not).
- m_history.history_exit(this->m_states);
- }
-
- // no transition for event.
- template <class Event>
- static std::pair<int,HandledEnum> call_no_transition(Derived& , int state, pBaseState* ,Event const& )
- {
- return std::make_pair(state,HANDLED_FALSE);
- }
- // called for deferred events. Address set in the dispatch_table at init
- template <class Event>
- static std::pair<int,HandledEnum> defer_transition(Derived& fsm, int state, pBaseState*,Event const& e)
- {
- execute_return (Derived::*pf) (Event const& evt)= &Derived::process_event;
- Event temp (e);
- ::boost::function<execute_return () > f= ::boost::bind(pf,&fsm,temp);
- fsm.post_deferred_event(f);
- return std::make_pair(state,HANDLED_TRUE);
- }
-
- // Default no-transition handler. Can be replaced in the Derived SM class.
- template <class Event>
- int no_transition(int state, Event const& )
- {
- BOOST_ASSERT(false);
- return state;
- }
- // default exception handler. Can be replaced in the Derived SM class.
- void exception_caught (std::exception& )
- {
- BOOST_ASSERT(false);
- }
- // puts a deferred event in the queue
- void post_deferred_event(deferred_fct& deferred)
- {
- m_deferred_events_queue.push(deferred);
- }
- // removes one event from the message queue and processes it
- void process_message_queue()
- {
- if (!m_events_queue.empty())
- {
- transition_fct to_call = m_events_queue.front();
- m_events_queue.pop();
- to_call();
- }
- }
-
- // calls the entry/exit or on_entry/on_exit depending on the state type
- // (avoids calling virtually)
- // variant for FSMs
- template <class StateType,class EventType>
- static
- typename boost::enable_if<typename is_composite_state<StateType>::type,void >::type
- execute_entry(BaseState* astate,EventType const& evt,boost::msm::dummy<0> = 0)
- {
- // calls on_entry on the fsm then handles direct entries, fork, entry pseudo state
- (static_cast<StateType*>(astate))->entry(evt);
- }
- // variant for states
- template <class StateType,class EventType>
- static
- typename ::boost::disable_if<
- typename ::boost::mpl::or_<typename is_composite_state<StateType>::type,
- typename is_pseudo_exit<StateType>::type >::type,void >::type
- execute_entry(BaseState* astate,EventType const& evt, ::boost::msm::dummy<1> = 0)
- {
- // simple call to on_entry
- (static_cast<StateType*>(astate))->on_entry(evt);
- }
- // variant for exit pseudo states
- template <class StateType,class EventType>
- static
- typename ::boost::enable_if<typename is_pseudo_exit<StateType>::type,void >::type
- execute_entry(BaseState* astate,EventType const& evt, ::boost::msm::dummy<2> = 0)
- {
- // calls on_entry on the state then forward the event to the transition which should be defined inside the
- // contained fsm
- (static_cast<StateType*>(astate))->on_entry(evt);
- (static_cast<StateType*>(astate))->forward_event(evt);
- }
- template <class StateType,class EventType>
- static
- typename ::boost::enable_if<typename is_composite_state<StateType>::type,void >::type
- execute_exit(BaseState* astate,EventType const& evt, ::boost::msm::dummy<0> = 0)
- {
- (static_cast<StateType*>(astate))->exit(evt);
- }
- template <class StateType,class EventType>
- static
- typename ::boost::disable_if<typename is_composite_state<StateType>::type,void >::type
- execute_exit(BaseState* astate,EventType const& evt, ::boost::msm::dummy<1> = 0)
- {
- // simple call to on_exit
- (static_cast<StateType*>(astate))->on_exit(evt);
- }
-
- // helper allowing special handling of direct entries / fork
- template <class StateType,class TargetType,class EventType>
- static
- typename ::boost::disable_if<
- typename ::boost::mpl::or_<typename has_explicit_entry_state<TargetType>::type,
- ::boost::mpl::is_sequence<TargetType> >::type,void>::type
- convert_event_and_execute_entry(BaseState* astate,EventType const& evt, ::boost::msm::dummy<1> = 0)
- {
- // if the target is a normal state, do the standard entry handling
- execute_entry<StateType>(astate,evt);
- }
- template <class StateType,class TargetType,class EventType>
- static
- typename ::boost::enable_if<
- typename ::boost::mpl::or_<typename has_explicit_entry_state<TargetType>::type,
- ::boost::mpl::is_sequence<TargetType> >::type,void >::type
- convert_event_and_execute_entry(BaseState* astate,EventType const& evt, ::boost::msm::dummy<0> = 0)
- {
- // for the direct entry, pack the event in a wrapper so that we handle it differently during fsm entry
- execute_entry<StateType>(astate,direct_entry_event<TargetType,EventType>(evt));
- }
-
- // creates all the states
- template <class ContainingSM>
- void fill_states(ContainingSM* containing_sm=0)
- {
- typedef typename create_stt<Derived>::type stt;
- typedef typename generate_state_set<stt>::type state_list;
- BOOST_STATIC_CONSTANT(int, max_state = (mpl::size<state_list>::value));
- // allocate the place without reallocation
- m_state_list.resize(max_state);
- m_visitors.fill_visitors(max_state);
- ::boost::mpl::for_each<state_list, ::boost::msm::wrap< ::boost::mpl::placeholders::_1> >
- (add_state<ContainingSM>(this,containing_sm));
- }
-
- // Template used to form forwarding rows in the transition table for every row of a composite SM
- template<
- typename T1
- , class Event
- >
- struct frow
- {
- typedef T1 current_state_type;
- typedef T1 next_state_type;
- typedef Event event;
-
- // Take the transition action and return the next state.
- static std::pair<int,HandledEnum> execute(Derived& fsm, int state, pBaseState* ,Event const& evt)
- {
- execute_return res =
- (static_cast<T1& > (*(fsm.m_state_list[state]))).process_event(evt);
- typedef typename create_stt<Derived>::type stt;
- return std::make_pair(get_state_id<stt,T1>::type::value,res.get<0>());
- }
- };
-public:
- template <class Composite,class Event>
- struct make_frow
- {
- typedef frow<Composite,Event> type;
- };
- // gets the transition table from a composite and make from it a forwarding row
- template <class Composite>
- struct get_transition_table_as_frow
- {
- // first get the table of a composite
- typedef typename recursive_get_transition_table<Composite>::type original_table;
- // and add for every event a forwarding row
- typedef typename generate_event_set<original_table>::type all_events;
- typedef typename ::boost::mpl::fold<
- all_events, ::boost::mpl::vector<>,
- ::boost::mpl::push_back< ::boost::mpl::placeholders::_1,
- frow<Composite, ::boost::mpl::placeholders::_2> > >::type type;
- };
-
- // extends the transition table with rows from composite states
- template <class Composite>
- struct extend_table
- {
- // add the init states
- typedef typename create_stt<Composite>::type stt;
- // get the state set
- typedef typename generate_state_set<stt>::type states;
- // for every state, add its transition table (if any)
- // transformed as frow
- typedef typename ::boost::mpl::fold<states,stt,
- ::boost::mpl::insert_range< ::boost::mpl::placeholders::_1,
- ::boost::mpl::end< ::boost::mpl::placeholders::_1>,
- get_transition_table_as_frow< ::boost::mpl::placeholders::_2> >
- >::type type;
- };
-private:
- template <class Fsm, class History,class UserBaseState, class Copy,class Stt, class Event>
- friend struct dispatch_table;
- template <typename T1,class Event> friend struct frow;
-
- // data members
- std::vector<int> m_states;
- events_queue_t m_events_queue;
- deferred_events_queue_t m_deferred_events_queue;
- HistoryPolicy m_history;
- pstate_base_list m_state_list;
- bool m_event_processing;
- bool m_is_included;
- visitor_fct_helper<BaseState>
- m_visitors;
-};
-
-} } // boost::msm
-#endif //BOOST_MSM_STATEMACHINE_H
-

Deleted: sandbox/msm/boost/msm/states.hpp
==============================================================================
--- sandbox/msm/boost/msm/states.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,241 +0,0 @@
-// 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_STATES_H
-#define BOOST_MSM_STATES_H
-
-#include <boost/mpl/bool.hpp>
-#include <boost/mpl/vector.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/function.hpp>
-#include <boost/utility/enable_if.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/msm/common_types.hpp>
-
-
-// traits used for entry/exit states
-BOOST_MPL_HAS_XXX_TRAIT_DEF(no_automatic_create)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(direct_entry)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(explicit_entry_state)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(non_forwarding_flag)
-
-namespace boost { namespace msm
-{
-// default base: non-polymorphic, not visitable
-struct default_base_state
-{
- ~default_base_state(){}
-};
-// default polymorphic base state. Derive all states from it to get polymorphic behavior
-struct polymorphic_state
-{
- virtual ~polymorphic_state() {}
-};
-
-// the interface for all states. Defines entry and exit functions. Overwrite to implement for any state needing it.
-template<class USERBASE>
-struct state_base : USERBASE
-{
- typedef USERBASE user_state_base;
-
- // empty implementation for the states not wishing to define an entry condition
- // will not be called polymorphic way
- template <class Event>
- void on_entry(Event const& ){}
- template <class Event>
- void on_exit(Event const& ){}
-};
-struct no_sm_ptr
-{
- // tags
- typedef ::boost::mpl::bool_<false> needs_sm;
-};
-struct sm_ptr
-{
- // tags
- typedef ::boost::mpl::bool_<true> needs_sm;
-};
-// kept for backward compatibility
-struct NoSMPtr
-{
- // tags
- typedef ::boost::mpl::bool_<false> needs_sm;
-};
-struct SMPtr
-{
- // tags
- typedef ::boost::mpl::bool_<true> needs_sm;
-};
-
-// provides the typedefs and interface. Concrete states derive from it.
-// template argument: pointer-to-fsm policy
-template<class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
-struct state : public state_base<BASE>, SMPtrPolicy
-{
- // tags
- // default: no flag
- typedef ::boost::mpl::vector<> flag_list;
- //default: no deferred events
- typedef ::boost::mpl::vector<> deferred_events;
-};
-
-// flags used internally to handle terminate / interrupt states
-struct TerminateFlag
-{
- typedef int non_forwarding_flag;
- typedef int event_blocking_flag;
-};
-struct InterruptedFlag
-{
- typedef int non_forwarding_flag;
- typedef int event_blocking_flag;
-};
-template <class EndEvent>
-struct EndInterruptFlag
-{
- typedef int non_forwarding_flag;
-};
-
-// terminate state simply defines the TerminateFlag flag
-// template argument: pointer-to-fsm policy
-template<class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
-struct terminate_state : public state_base<BASE>, SMPtrPolicy
-{
- // tags
- typedef ::boost::mpl::vector<boost::msm::TerminateFlag> flag_list;
- //default: no deferred events
- typedef ::boost::mpl::vector<> deferred_events;
-};
-
-// terminate state simply defines the InterruptedFlag and EndInterruptFlag<EndInterruptEvent> flags
-// template argument: event which ends the interrupt
-// template argument: pointer-to-fsm policy
-template <class EndInterruptEvent,class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
-struct interrupt_state : public state_base<BASE>, SMPtrPolicy
-{
- // tags
- typedef ::boost::mpl::vector<boost::msm::InterruptedFlag,
- boost::msm::EndInterruptFlag<EndInterruptEvent> >
- flag_list;
- //default: no deferred events
- typedef ::boost::mpl::vector<> deferred_events;
-};
-
-// not a state but a bunch of extra typedefs to handle direct entry into a composite state. To be derived from
-// template argument: containing composite
-// template argument: zone index of this state
-template <class Composite,int ZoneIndex=-1>
-struct explicit_entry
-{
- typedef int no_automatic_create;
- typedef int explicit_entry_state;
- typedef Composite owner;
- enum {zone_index=ZoneIndex};
- template <class ToTest>
- // metafunction helping determine who needs to create this state
- struct is_owning_composite
- {
- typedef typename ::boost::is_same<Composite,ToTest>::type type;
- };
-};
-
-// to be derived from. Makes a type an entry (pseudo) state. Actually an almost full-fledged state
-// template argument: containing composite
-// template argument: zone index of this state
-// template argument: pointer-to-fsm policy
-template<class Composite,int ZoneIndex=-1,class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
-struct entry_pseudo_state
- : public state_base<BASE>, explicit_entry<Composite,ZoneIndex> ,SMPtrPolicy
-{
- // tags
- typedef int pseudo_entry;
- // default: no flag
- typedef ::boost::mpl::vector<> flag_list;
- //default: no deferred events
- typedef ::boost::mpl::vector<> deferred_events;
-};
-
-// to be derived from. Makes a state an exit (pseudo) state. Actually an almost full-fledged state
-// template argument: containing composite
-// template argument: event to forward
-// template argument: pointer-to-fsm policy
-template<class Composite,class Event,class BASE = default_base_state,class SMPtrPolicy = no_sm_ptr>
-struct exit_pseudo_state : public state_base<BASE> , SMPtrPolicy
-{
- // tags
- typedef int pseudo_exit;
- typedef int no_automatic_create;
- typedef Composite owner;
- typedef Event event;
-
- // metafunction helping determine who needs to create this state
- template <class ToTest>
- struct is_owning_composite
- {
- typedef typename boost::is_same<Composite,ToTest>::type type;
- };
- // default: no flag
- typedef ::boost::mpl::vector< > flag_list;
- //default: no deferred events
- typedef ::boost::mpl::vector<> deferred_events;
-
- // forward event to the higher-level FSM
- template <class ForwardEvent>
- void forward_event(ForwardEvent const& incomingEvent)
- {
- // use helper to forward or not
- helper(incomingEvent);
- }
- void set_forward_fct(::boost::function<execute_return (Event const&)> fct)
- {
- m_forward = fct;
- }
- exit_pseudo_state():m_forward(){}
- // by assignments, we keep our forwarding functor unchanged as our containing SM did not change
- exit_pseudo_state(exit_pseudo_state<Composite,Event,BASE,SMPtrPolicy>& rhs){}
- exit_pseudo_state<Composite,Event,BASE,SMPtrPolicy>& operator= (const exit_pseudo_state<Composite,Event,BASE,SMPtrPolicy>& )
- {
- return *this;
- }
-private:
- ::boost::function<execute_return (Event const&)> m_forward;
-
- // helper used to forward an event if it is the one we are supposed to
- template <class ForwardEvent>
- typename ::boost::enable_if<typename ::boost::is_convertible<ForwardEvent,Event>::type,void >::type
- helper(ForwardEvent const& incomingEvent,boost::msm::dummy<0> = 0)
- {
- // call if handler set, if not, this state is simply a terminate state
- if (m_forward)
- m_forward(incomingEvent);
- }
- template <class ForwardEvent>
- typename ::boost::disable_if<typename ::boost::is_convertible<ForwardEvent,Event>::type,void >::type
- helper(ForwardEvent const& incomingEvent,boost::msm::dummy<1> = 0)
- {
- // Not our event, ignore
- }
-};
-
-// event used internally for wrapping a direct entry
-template <class StateType,class Event>
-struct direct_entry_event
-{
- typedef int direct_entry;
- typedef StateType active_state;
-
- direct_entry_event(Event const& evt):m_event(evt){}
- Event const& m_event;
-};
-
-}}
-
-#endif //BOOST_MSM_STATES_H
-

Deleted: sandbox/msm/boost/msm/tools.hpp
==============================================================================
--- sandbox/msm/boost/msm/tools.hpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,67 +0,0 @@
-// 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_TOOLS_H
-#define BOOST_MSM_TOOLS_H
-
-
-#include <string>
-#include <iostream>
-#include <boost/msm/metafunctions.hpp>
-
-namespace boost { namespace msm
-{
-
-// fills the array passed in with the state names in the correct order
-// the array must be big enough. To know the needed size, use mpl::size
-// on fsm::generate_state_set
-template <class stt>
-struct fill_state_names
-{
- fill_state_names(char const** names):m_names(names){}
- template <class StateType>
- void operator()(boost::msm::wrap<StateType> const&)
- {
- m_names[get_state_id<stt,StateType>::value]= typeid(StateType).name();
- }
-private:
- char const** m_names;
-};
-
-// fills the typeid-generated name of the given state in the string passed as argument
-template <class stt>
-struct get_state_name
-{
- 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::wrap<StateType> const&)
- {
- if (get_state_id<stt,StateType>::value == m_state_id)
- {
- m_name = typeid(StateType).name();
- }
- }
-private:
- std::string& m_name;
- int m_state_id;
-};
-
-// displays the typeid of the given Type
-struct display_type
-{
- template <class Type>
- void operator()(boost::msm::wrap<Type> const&)
- {
- std::cout << typeid(Type).name() << std::endl;
- }
-};
-
-} } //boost::msm
-#endif //BOOST_MSM_TOOLS_H

Added: sandbox/msm/libs/msm/doc/AnnexA.jpg
==============================================================================
Binary file. No diff available.

Added: sandbox/msm/libs/msm/doc/Anonymous.jpg
==============================================================================
Binary file. No diff available.

Added: sandbox/msm/libs/msm/doc/AnonymousTutorial.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/AnonymousTutorial.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,122 @@
+#include <iostream>
+// back-end
+#include <boost/msm/back/state_machine.hpp>
+//front-end
+#include <boost/msm/front/state_machine_def.hpp>
+
+namespace msm = boost::msm;
+using namespace boost::msm::front;
+
+namespace
+{
+ // events
+ struct event1 {};
+
+
+ // front-end: define the FSM structure
+ struct my_machine_ : public msm::front::state_machine_def<my_machine_>
+ {
+ // The list of FSM states
+ struct State1 : public msm::front::state<>
+ {
+ // every (optional) entry/exit methods get the event passed.
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: State1" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State1" << std::endl;}
+ };
+ struct State2 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const& ,FSM&) {std::cout << "entering: State2" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State2" << std::endl;}
+ };
+
+ struct State3 : public msm::front::state<>
+ {
+ // when stopped, the CD is loaded
+ template <class Event,class FSM>
+ void on_entry(Event const& ,FSM&) {std::cout << "entering: State3" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State3" << std::endl;}
+ };
+
+ struct State4 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: State4" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State4" << std::endl;}
+ };
+
+ // the initial state of the player SM. Must be defined
+ typedef State1 initial_state;
+
+ // transition actions
+ void State2ToState3(none const&) { std::cout << "my_machine::State2ToState3\n"; }
+ void State3ToState4(none const&) { std::cout << "my_machine::State3ToState4\n"; }
+ // guard conditions
+ bool always_true(none const& evt)
+ {
+ std::cout << "always_true" << std::endl;
+ return true;
+ }
+ bool always_false(none const& evt)
+ {
+ std::cout << "always_false" << std::endl;
+ return false;
+ }
+
+ typedef my_machine_ p; // makes transition table cleaner
+
+ // Transition table for player
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +---------+-------------+---------+---------------------+----------------------+
+ _row < State1 , none , State2 >,
+ a_row < State2 , none , State3 , &p::State2ToState3 >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ row < State3 , none , State4 , &p::State3ToState4 , &p::always_true >,
+ g_row < State3 , none , State4 , &p::always_false >,
+ _row < State4 , event1 , State1 >
+ // +---------+-------------+---------+---------------------+----------------------+
+ > {};
+ // Replaces the default no-transition response.
+ template <class FSM,class Event>
+ void no_transition(Event const& e, FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ // Pick a back-end
+ typedef msm::back::state_machine<my_machine_> my_machine;
+
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "State1", "State2", "State3", "State4" };
+ void pstate(my_machine const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+ void test()
+ {
+ my_machine p;
+
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ // in this case it will also immediately trigger all anonymous transitions
+ p.start();
+ // this event will bring us back to the initial state and thus, a new "loop" will be started
+ p.process_event(event1());
+
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/AnonymousTutorialEuml.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/AnonymousTutorialEuml.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,164 @@
+#include <iostream>
+// back-end
+#include <boost/msm/back/state_machine.hpp>
+#include <boost/msm/front/euml/euml.hpp>
+
+namespace msm = boost::msm;
+using namespace boost::msm::front::euml;
+
+namespace
+{
+ // events
+ struct event1 : euml_event<event1> {};
+
+ struct State1_Entry : euml_action<State1_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: State1" << std::endl;
+ }
+ };
+ struct State1_Exit : euml_action<State1_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: State1" << std::endl;
+ }
+ };
+ struct State2_Entry : euml_action<State2_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: State2" << std::endl;
+ }
+ };
+ struct State2_Exit : euml_action<State2_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: State2" << std::endl;
+ }
+ };
+ struct State3_Entry : euml_action<State3_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: State3" << std::endl;
+ }
+ };
+ struct State3_Exit : euml_action<State3_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: State3" << std::endl;
+ }
+ };
+ struct State4_Entry : euml_action<State4_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: State4" << std::endl;
+ }
+ };
+ struct State4_Exit : euml_action<State4_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: State4" << std::endl;
+ }
+ };
+
+ // The list of FSM states
+ typedef BOOST_TYPEOF(build_state(State1_Entry(),State1_Exit())) State1;
+ typedef BOOST_TYPEOF(build_state(State2_Entry(),State2_Exit())) State2;
+ typedef BOOST_TYPEOF(build_state(State3_Entry(),State3_Exit())) State3;
+ typedef BOOST_TYPEOF(build_state(State4_Entry(),State4_Exit())) State4;
+
+ // transition actions
+ struct State2ToState3 : euml_action<State2ToState3>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
+ {
+ std::cout << "my_machine::State2ToState3" << std::endl;
+ }
+ };
+ struct State3ToState4 : euml_action<State3ToState4>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
+ {
+ std::cout << "my_machine::State3ToState4" << std::endl;
+ }
+ };
+ // guard conditions
+ struct always_true : euml_action<always_true>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ bool operator()(EVT const& evt,FSM&,SourceState& ,TargetState& )
+ {
+ std::cout << "always_true" << std::endl;
+ return true;
+ }
+ };
+ struct always_false : euml_action<always_false>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ bool operator()(EVT const& evt,FSM&,SourceState& ,TargetState& )
+ {
+ std::cout << "always_false" << std::endl;
+ return false;
+ }
+ };
+ // replaces the old transition table
+ typedef BOOST_TYPEOF(build_stt
+ ((State1() == State2() ,
+ State2() == State3() / State2ToState3(),
+ State3() == State4() [always_true()] / State3ToState4(),
+ State3() == State4() [always_false()],
+ State4() + event1() == State1()
+ // +------------------------------------------------------------------------------+
+ ) ) ) transition_table;
+
+ // create a state machine "on the fly"
+ typedef BOOST_TYPEOF(build_sm( transition_table(), //STT
+ init_ << State1() // Init State
+ )) my_machine_;
+
+ // Pick a back-end
+ typedef msm::back::state_machine<my_machine_> my_machine;
+
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "State1", "State2", "State3", "State4" };
+ void pstate(my_machine const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+ void test()
+ {
+ my_machine p;
+
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ // in this case it will also immediately trigger all anonymous transitions
+ p.start();
+ // this event will bring us back to the initial state and thus, a new "loop" will be started
+ p.process_event(event1());
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/AnonymousTutorialWithFunctors.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/AnonymousTutorialWithFunctors.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,147 @@
+#include <iostream>
+// back-end
+#include <boost/msm/back/state_machine.hpp>
+//front-end
+#include <boost/msm/front/state_machine_def.hpp>
+// functors
+#include <boost/msm/front/functor_row.hpp>
+#include <boost/msm/front/euml/common.hpp>
+
+namespace msm = boost::msm;
+using namespace boost::msm::front;
+
+namespace
+{
+ // events
+ struct event1 {};
+
+
+ // front-end: define the FSM structure
+ struct my_machine_ : public msm::front::state_machine_def<my_machine_>
+ {
+ // The list of FSM states
+ struct State1 : public msm::front::state<>
+ {
+ // every (optional) entry/exit methods get the event passed.
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: State1" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State1" << std::endl;}
+ };
+ struct State2 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const& ,FSM&) {std::cout << "entering: State2" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State2" << std::endl;}
+ };
+
+ struct State3 : public msm::front::state<>
+ {
+ // when stopped, the CD is loaded
+ template <class Event,class FSM>
+ void on_entry(Event const& ,FSM&) {std::cout << "entering: State3" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State3" << std::endl;}
+ };
+
+ struct State4 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: State4" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State4" << std::endl;}
+ };
+
+ // the initial state of the player SM. Must be defined
+ typedef State1 initial_state;
+
+ // transition actions
+ struct State2ToState3
+ {
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM& ,SourceState& ,TargetState& )
+ {
+ std::cout << "my_machine::State2ToState3" << std::endl;
+ }
+ };
+ struct State3ToState4
+ {
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM& ,SourceState& ,TargetState& )
+ {
+ std::cout << "my_machine::State3ToState4" << std::endl;
+ }
+ };
+ // guard conditions
+ struct always_true
+ {
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)
+ {
+ std::cout << "always_true" << std::endl;
+ return true;
+ }
+ };
+ struct always_false
+ {
+ template <class EVT,class FSM,class SourceState,class TargetState>
+ bool operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)
+ {
+ std::cout << "always_false" << std::endl;
+ return true;
+ }
+ };
+
+ typedef my_machine_ p; // makes transition table cleaner
+
+ // Transition table for player
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +---------+-------------+---------+---------------------+----------------------+
+ Row < State1 , none , State2 >,
+ Row < State2 , none , State3 , State2ToState3 >,
+ Row < State3 , none , State4 , always_false >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ Row < State3 , none , State4 , State3ToState4 , always_true >,
+ Row < State4 , event1 , State1 >
+ // +---------+-------------+---------+---------------------+----------------------+
+ > {};
+ // Replaces the default no-transition response.
+ template <class FSM,class Event>
+ void no_transition(Event const& e, FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ // Pick a back-end
+ typedef msm::back::state_machine<my_machine_> my_machine;
+
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "State1", "State2", "State3", "State4" };
+ void pstate(my_machine const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+ void test()
+ {
+ my_machine p;
+
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ // in this case it will also immediately trigger all anonymous transitions
+ p.start();
+ // this event will bring us back to the initial state and thus, a new "loop" will be started
+ p.process_event(event1());
+
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/CompilerStressTestEuml.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/CompilerStressTestEuml.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,420 @@
+#include <vector>
+#include <list>
+#include <set>
+#include <map>
+#include <iostream>
+
+#define FUSION_MAX_VECTOR_SIZE 15
+
+#include <boost/msm/back/state_machine.hpp>
+#include <boost/msm/front/euml/euml.hpp>
+#include <boost/msm/front/euml/stl.hpp>
+
+using namespace std;
+using namespace boost::msm::front::euml;
+namespace msm = boost::msm;
+
+// how long the timer will ring when countdown elapsed.
+#define RINGING_TIME 5
+
+#define m_src_container 0
+#define m_tgt_container 1
+#define m_test_container 2
+#define m_song 0
+#define m_letters 0
+#define m_src_it 0
+
+namespace // Concrete FSM implementation
+{
+ // flag
+ struct SomeFlag : euml_flag<SomeFlag>{};
+
+ // events
+ typedef BOOST_TYPEOF(build_attributes(attributes_ << string() << int()/*m_song*/ )) OneSongDef;
+ struct OneSong : euml_event<OneSong>,OneSongDef
+ {
+ OneSong(){}
+ OneSong(const string& asong)
+ {
+ get_attribute<m_song>()=asong;
+ get_attribute<1>()=1;
+ }
+ OneSong(const OneSong& asong)
+ {
+ get_attribute<m_song>()=asong.get_attribute<m_song>();
+ get_attribute<1>()=1;
+ }
+ const string& get_data() const {return get_attribute<m_song>();}
+ };
+ struct SongComparator : euml_action<SongComparator>
+ {
+ bool operator()(const OneSong& lhs,const OneSong& rhs)const
+ {
+ return lhs.get_data() == rhs.get_data();
+ }
+ };
+ struct SongLessComparator : euml_action<SongLessComparator>
+ {
+ bool operator()(const OneSong& lhs,const OneSong& rhs)const
+ {
+ return lhs.get_data() < rhs.get_data();
+ }
+ };
+ struct Comparator
+ {
+ template <class T>
+ bool operator()(const T& lhs,const T& rhs)const
+ {
+ return lhs < rhs;
+ }
+ };
+ struct RemoveDummy
+ {
+ bool operator()(const OneSong& lhs)const
+ {
+ return (lhs.get_attribute<m_song>().compare(std::string("She-Dummy. Remove this one"))==0 );
+ }
+ };
+ template <int val>
+ struct LookFor
+ {
+ template <class T>
+ bool operator()(const T& lhs)const
+ {
+ return lhs == val;
+ }
+ };
+ template <int val>
+ struct LessThan
+ {
+ template <class T>
+ bool operator()(const T& lhs)const
+ {
+ return lhs < val;
+ }
+ };
+ struct SongDeleter : euml_action<SongDeleter>
+ {
+ bool operator()(const OneSong& lhs)const
+ {
+ return lhs.get_data() == "Twist and Shout";
+ }
+ };
+ struct Generator
+ {
+ int operator()()const
+ {
+ return 1;
+ }
+ };
+ struct Print
+ {
+ template <class T>
+ void operator()(const T& lhs)const
+ {
+ std::cout << "Song:" << lhs.get_data() << endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_attributes(attributes_ << string()/*m_song*/ )) NotFoundDef;
+ struct NotFound : euml_event<NotFound>,NotFoundDef
+ {
+ NotFound(){}
+ NotFound (const string& data)
+ {
+ get_attribute<m_song>()=data;
+ }
+ };
+
+ typedef BOOST_TYPEOF(build_attributes(attributes_ << string()/*m_song*/ )) FoundDef;
+ struct Found : euml_event<Found>,FoundDef
+ {
+ Found(){}
+ Found (const string& data)
+ {
+ get_attribute<m_song>()=data;
+ }
+ int foo()const {std::cout << "foo()" << std::endl; return 0;}
+ int foo(int i)const {std::cout << "foo(int):" << i << std::endl; return 1;}
+ int foo(int i,int j)const {std::cout << "foo(int,int):" << i <<"," << j << std::endl; return 2;}
+
+ };
+ // some functions to call
+ MSM_EUML_METHOD(FoundFoo_ , foo , foo_ , int , int )
+
+ template <class T>
+ int do_print(T& t ) {std::cout << "print(T):" << typeid(T).name() << std::endl;return 1;}
+ MSM_EUML_FUNCTION(PrintState_ , do_print , print_ , int , int )
+
+ struct Done : euml_event<Done> {};
+
+
+ // Concrete FSM implementation
+ struct some_base
+ {
+ int foobar()const {std::cout << "foobar()" << std::endl; return 0;}
+ int foobar(int i)const {std::cout << "foobar(int):" << i << std::endl; return 1;}
+ int foobar(int i,int j)const {std::cout << "foobar(int,int):" << i <<"," << j << std::endl; return 2;}
+ };
+ // some functions to call
+ MSM_EUML_METHOD(FooBar_ , foobar , foobar_ , int , int )
+
+ // The list of FSM states
+ typedef BOOST_TYPEOF(build_state( ( insert_(Fsm_<m_tgt_container>(),end_(Fsm_<m_tgt_container>()),
+ append_(Event_<m_song>(),Fsm_<7>()) ),//foo_(event_(),Int_<0>()) ,
+ //foo_(event_(),Int_<0>(),Int_<1>()),print_(state_()),
+ process_(Done()/*,fsm_()*/),if_then_(True_(),True_()) ),
+ NoAction()
+ )) Insert;
+
+
+ typedef BOOST_TYPEOF(build_state( if_then_else_( (string_find_(Event_<m_song>(),State_<m_letters>(),Size_t_<0>()) != Npos_<string>()&&
+ string_find_(Event_<m_song>(),Char_<'S'>(),Size_t_<0>()) != Npos_<string>()&&
+ string_find_first_of_(Event_<m_song>(),Char_<'S'>()) == Size_t_<0>() &&
+ string_compare_(Event_<m_song>(),Int_<0>(),size_(Event_<m_song>()),Event_<m_song>()) == Int_<0>()
+ //&& is_flag_(SomeFlag(),fsm_())
+ //&& ( attribute_(event_(),Int_<1>()) == Int_<1>())
+ //&& string_find_(Event_<m_song>(),String_<mpl::string<'Sh','e'> >())
+ // != Npos_<string>()
+
+ ),
+ process2_(Found(),
+ //string_insert_(Event_<m_song>(),Size_t_<0>(),Fsm_<6>()) ),
+ string_replace_(
+ string_assign_(
+ string_erase_(
+ string_insert_(
+ substr_(Event_<m_song>(),Size_t_<1>()),
+ Size_t_<0>(),
+ Size_t_<1>(),
+ Char_<'S'>()),
+ Size_t_<0>(),
+ Size_t_<1>() ),
+ Event_<m_song>() ),
+ Size_t_<0>(),
+ Size_t_<1>(),
+ c_str_(Fsm_<6>())
+ /*Size_t_<1>(),
+ Char_<'s'>()*/ ) ),
+ process2_(NotFound(),Event_<m_song>(),fsm_()) ) ,
+ NoAction(),
+ attributes_ << string()/*m_letters*/,
+ configure_<< SomeFlag() ))
+ StringFind;
+
+ typedef BOOST_TYPEOF(build_state( if_then_( (State_<m_src_it>() != end_(Fsm_<m_src_container>()) &&
+ //associative_find_(Fsm_<4>(),Int_<9>()) != end_(Fsm_<4>())&&
+ //associative_count_(Fsm_<4>(),Int_<9>()) == Size_t_<1>() &&
+ //*associative_upper_bound_(Fsm_<4>(),Int_<8>()) == Int_<9>()&&
+ //*associative_lower_bound_(Fsm_<4>(),Int_<9>()) == Int_<9>() &&
+ //second_(associative_equal_range_(Fsm_<4>(),Int_<8>())) == associative_upper_bound_(Fsm_<4>(),Int_<8>()) &&
+ //first_(associative_equal_range_(Fsm_<4>(),Int_<8>())) == associative_lower_bound_(Fsm_<4>(),Int_<8>())&&
+ //second_(*associative_lower_bound_(Fsm_<5>(),Int_<0>())) == Int_<0>() && //map => pair as return
+ //find_if_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Predicate_<LookFor<8> >()) != end_(Fsm_<4>())&&
+ //*lower_bound_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Int_<9>(),Predicate_<std::less<int> >()) == Int_<9>()&&
+ //*upper_bound_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Int_<8>(),Predicate_<std::less<int> >()) == Int_<9>() &&
+ //second_(equal_range_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Int_<8>()))
+ // == upper_bound_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Int_<8>()) &&
+ //first_(equal_range_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Int_<9>(),Predicate_<std::less<int> >()))
+ // == lower_bound_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Int_<9>(),Predicate_<std::less<int> >())&&
+ //binary_search_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Int_<9>(),Predicate_<std::less<int> >())&&
+ //binary_search_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Int_<9>())&&
+ //count_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Int_<9>()) == Int_<1>()&&
+ //count_if_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Predicate_<LookFor<9> >()) == Int_<1>()&&
+ //distance_(begin_(Fsm_<4>()),end_(Fsm_<4>())) == Int_<2>()&&
+ //*min_element_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Predicate_<std::less<int> >()) == Int_<8>()&&
+ //*max_element_(begin_(Fsm_<4>()),end_(Fsm_<4>()),Predicate_<std::less<int> >()) == Int_<9>()&&
+ //adjacent_find_(begin_(Fsm_<4>()),end_(Fsm_<4>())) == end_(Fsm_<4>())&&
+ //*find_end_(begin_(Fsm_<8>()),end_(Fsm_<8>()),begin_(Fsm_<9>()),end_(Fsm_<9>()))
+ // == Int_<1>()&&
+ //*find_first_of_(begin_(Fsm_<8>()),end_(Fsm_<8>()),begin_(Fsm_<9>()),end_(Fsm_<9>()))
+ // == Int_<1>()&&
+ //equal_(begin_(Fsm_<9>()),end_(Fsm_<9>()),begin_(Fsm_<8>()))&&
+ //*search_(begin_(Fsm_<8>()),end_(Fsm_<8>()),begin_(Fsm_<9>()),end_(Fsm_<9>()))
+ // == Int_<1>()&&
+ //includes_(begin_(Fsm_<8>()),end_(Fsm_<8>()),begin_(Fsm_<9>()),end_(Fsm_<9>()))&&
+ //!lexicographical_compare_(begin_(Fsm_<8>()),end_(Fsm_<8>()),
+ // begin_(Fsm_<9>()),end_(Fsm_<9>()))&&
+ //first_(mismatch_(begin_(Fsm_<9>()),end_(Fsm_<9>()),begin_(Fsm_<8>())))
+ // == end_(Fsm_<9>()) &&
+ accumulate_(begin_(Fsm_<9>()),end_(Fsm_<9>()),Int_<1>(),
+ Predicate_<std::plus<int> >()) == Int_<1>()
+ ),
+ (process2_(OneSong(),*(State_<m_src_it>()++))/*,foobar_(fsm_(),Int_<0>())*/ ) ),
+ NoAction(),
+ attributes_ << vector<OneSong>::iterator()/*m_src_it*/
+ , configure_<< SomeFlag() )) Foreach;
+
+
+ // replaces the old transition table
+ typedef BOOST_TYPEOF(build_stt
+ ((Foreach() + OneSong() == StringFind() [if_then_else_(True_(),True_(),True_())],
+ StringFind() + Found() == Insert() / (if_then_(True_(),NoAction())),
+ StringFind() + NotFound() == Foreach() ,
+ Insert() + Done() == Foreach()
+ // +------------------------------------------------------------------------------+
+ ) ) ) transition_table;
+ struct Log_No_Transition : euml_action<Log_No_Transition>
+ {
+ template <class FSM,class Event>
+ void operator()(Event const& e,FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ // create a state machine "on the fly"
+ typedef BOOST_TYPEOF(build_sm( transition_table(), //STT
+ init_ << Foreach(), // Init
+ //insert_(State_<4>(),begin_(State_<2>()),end_(State_<2>())),
+ (insert_(State_<4>(),Int_<5>()),insert_(State_<4>(),Int_<6>()),insert_(State_<4>(),Int_<7>()),
+ insert_(State_<4>(),Int_<8>()),insert_(State_<4>(),Int_<9>()),
+ associative_erase_(State_<4>(),Int_<6>()),associative_erase_(State_<4>(),begin_(State_<4>())),
+ associative_erase_(State_<4>(),begin_(State_<4>()),++begin_(State_<4>())),
+ insert_(State_<2>(),begin_(State_<2>()),begin_(State_<3>()),end_(State_<3>())),
+ State_<5>()[Int_<0>()]=Int_<0>(),State_<5>()[Int_<1>()]=Int_<1>()
+ ,attribute_(substate_(Foreach(),fsm_()),Int_<m_src_it>())
+ = begin_(attribute_(fsm_(),Int_<m_src_container>()))
+ //,fill_(begin_(State_<9>()),end_(State_<9>()),Int_<0>())
+ //,fill_n_(begin_(State_<9>()),Size_t_<2>(),Int_<0>())
+ //,transform_(begin_(State_<4>()),end_(State_<4>()),begin_(State_<2>()),begin_(State_<4>()),
+ // Predicate_<std::plus<int> >())
+ //,process_(Done(),fsm_(),fsm_())
+ //,process_(Done(),fsm_())
+ //,fsm_()
+ //,foobar_(state_(),Int_<0>(),Int_<1>())
+ //,nth_element_(begin_(State_<9>()),++begin_(State_<9>()),end_(State_<9>()),Predicate_<std::less<int> >())
+ //,partial_sort_(begin_(State_<9>()),end_(State_<9>()),end_(State_<9>()),Predicate_<std::less<int> >())
+ //,partial_sort_copy_(begin_(State_<9>()),end_(State_<9>()),begin_(State_<9>()),end_(State_<9>()),Predicate_<std::less<int> >())
+ //,list_sort_(State_<2>())
+ //,sort_(begin_(State_<9>()),end_(State_<9>()),Predicate_<std::less<int> >())
+ //,inner_product_(begin_(State_<9>()),end_(State_<9>()),begin_(State_<9>()),Int_<1>())
+ //,replace_copy_(begin_(State_<4>()),end_(State_<4>()),begin_(State_<4>()),Int_<8>(),Int_<7>())
+ //,replace_copy_if_(begin_(State_<4>()),end_(State_<4>()),begin_(State_<4>()),Predicate_<LookFor<9> >(),Int_<8>())
+ //,replace_(begin_(State_<4>()),end_(State_<4>()),Int_<8>(),Int_<7>())
+ //,replace_if_(begin_(State_<4>()),end_(State_<4>()),Predicate_<LookFor<9> >(),Int_<8>())
+ //,adjacent_difference_(begin_(State_<9>()),end_(State_<9>()),begin_(State_<9>()))
+ //,partial_sum_(begin_(State_<9>()),end_(State_<9>()),begin_(State_<9>()))
+ //,inner_product_(begin_(State_<9>()),end_(State_<9>()),begin_(State_<9>()),Int_<1>())
+ //,next_permutation_(begin_(State_<9>()),end_(State_<9>()),Predicate_<std::less<int> >())
+ //,prev_permutation_(begin_(State_<9>()),end_(State_<9>()),Predicate_<std::less<int> >())
+ //,set_union_(begin_(State_<9>()),end_(State_<9>()),begin_(State_<9>()),end_(State_<9>()),begin_(State_<9>()))
+ //,inplace_merge_(begin_(State_<9>()),end_(State_<9>()),end_(State_<9>()),Predicate_<std::less<int> >())
+ //,merge_(begin_(State_<9>()),end_(State_<9>()),begin_(State_<9>()),end_(State_<9>())
+ // ,begin_(State_<9>()),Predicate_<std::less<int> >())
+ //,stable_sort_(begin_(State_<9>()),end_(State_<9>()),Predicate_<std::less<int> >())
+ //,partition_(begin_(State_<2>()),end_(State_<2>()),Predicate_<LessThan<3> >())
+ //,stable_partition_(begin_(State_<2>()),end_(State_<2>()),Predicate_<LessThan<3> >())
+ //,rotate_copy_(begin_(State_<2>()),++begin_(State_<2>()),end_(State_<2>()),begin_(State_<2>()))
+ //,rotate_(begin_(State_<2>()),++begin_(State_<2>()),end_(State_<2>()))
+ //,unique_(begin_(State_<2>()),end_(State_<2>()))
+ //,unique_copy_(begin_(State_<2>()),end_(State_<2>()),begin_(State_<2>()))
+ //,random_shuffle_(begin_(State_<9>()),end_(State_<9>()))
+ //,generate_(begin_(State_<9>()),end_(State_<9>()),Predicate_<Generator>())
+ //,generate_n_(begin_(State_<9>()),Int_<2>(),Predicate_<Generator>())
+ //,reverse_copy_(begin_(State_<2>()),end_(State_<2>()),begin_(State_<2>()))
+ //erase_(State_<m_src_container>(),
+ // remove_if_(begin_(State_<m_src_container>()),end_(State_<m_src_container>()),
+ // Predicate_<RemoveDummy>()),
+ // end_(State_<m_src_container>())),
+ //list_remove_(State_<2>(),Int_<3>()),
+ //remove_copy_if_(begin_(State_<9>()),end_(State_<9>()),back_inserter_(State_<2>()),
+ // Predicate_<LookFor<2> >() )
+ //for_each_(begin_(State_<m_src_container>()),end_(State_<m_src_container>()),
+ // Predicate_<Print>() ),
+ //copy_(begin_(State_<9>()),end_(State_<9>()),inserter_(State_<2>(),end_(State_<2>()))),
+ //reverse_(begin_(State_<2>()),end_(State_<2>()))
+ ),
+ //NoAction(), // Entry
+ //splice_(State_<2>(),begin_(State_<2>()),State_<3>(),begin_(State_<3>()),end_(State_<3>())),
+ //(list_remove_(State_<2>(),Int_<3>()),list_merge_(State_<2>(),State_<3>(),Comparator())),//NoAction(), // Entry
+ NoAction(), // Exit
+ attributes_ << vector<OneSong>() /*m_src_container*/ // song list
+ << list<OneSong>() /*m_tgt_container*/ // result
+ << list<int>()
+ << list<int>()
+ << std::set<int>()
+ << std::map<int,int>()
+ << std::string()
+ << std::string()
+ << std::vector<int>()
+ << std::vector<int>()
+ << int(),
+ configure_<< no_configure_,
+ Log_No_Transition()
+ )) iPodSearch_helper;
+ struct iPodSearch_ : public iPodSearch_helper, public some_base
+ {
+ };
+
+
+ // choice of back-end
+ typedef msm::back::state_machine<iPodSearch_> iPodSearch;
+
+ void test()
+ {
+ iPodSearch search;
+ // fill our song list
+ //search.get_attribute<m_src_container>().push_back(OneSong("She-Dummy. Remove this one"));
+ search.get_attribute<m_src_container>().push_back(OneSong("Let it be"));
+ search.get_attribute<m_src_container>().push_back(OneSong("Yellow submarine"));
+ search.get_attribute<m_src_container>().push_back(OneSong("Twist and Shout"));
+ search.get_attribute<m_src_container>().push_back(OneSong("She Loves You"));
+
+ search.get_attribute<2>().push_back(1);
+ search.get_attribute<2>().push_back(3);
+ search.get_attribute<2>().push_back(4);
+
+ search.get_attribute<3>().push_back(2);
+ search.get_attribute<3>().push_back(4);
+
+ search.get_attribute<6>() = "S";
+ search.get_attribute<7>() = "- Some text";
+
+ search.get_attribute<8>().push_back(1);
+ search.get_attribute<8>().push_back(2);
+ search.get_attribute<8>().push_back(3);
+ search.get_attribute<8>().push_back(4);
+
+ search.get_attribute<9>().push_back(1);
+ search.get_attribute<9>().push_back(2);
+
+
+ // look for "She Loves You" using the first letters
+ search.get_state<StringFind&>().get_attribute<m_letters>()="Sh";
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ search.start();
+ // display all the songs
+ for (list<OneSong>::const_iterator it = search.get_attribute<m_tgt_container>().begin();
+ it != search.get_attribute<m_tgt_container>().end();++it)
+ {
+ cout << "candidate song:" << (*it).get_data() << endl;
+ }
+ for (list<int>::const_iterator iti = search.get_attribute<2>().begin();
+ iti != search.get_attribute<2>().end();++iti)
+ {
+ cout << "int in attribute<2>:" << (*iti) << endl;
+ }
+ for (set<int>::const_iterator its = search.get_attribute<4>().begin();
+ its != search.get_attribute<4>().end();++its)
+ {
+ cout << "int in attribute<4>:" << (*its) << endl;
+ }
+ cout << "search using more letters" << endl;
+ // look for "She Loves You" using more letters
+ search.get_state<StringFind&>().get_attribute<m_letters>()="She";
+ search.get_attribute<m_tgt_container>().clear();
+ search.start();
+ // display all the songs
+ for (list<OneSong>::const_iterator it = search.get_attribute<m_tgt_container>().begin();
+ it != search.get_attribute<m_tgt_container>().end();++it)
+ {
+ cout << "candidate song:" << (*it).get_data() << endl;
+ }
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/CompositeTutorial.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/CompositeTutorial.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,222 @@
+#include <iostream>
+// back-end
+#include <boost/msm/back/state_machine.hpp>
+//front-end
+#include <boost/msm/front/state_machine_def.hpp>
+
+namespace msm = boost::msm;
+
+namespace // Concrete FSM implementation
+{
+ // events
+ struct play {};
+ struct end_pause {};
+ struct stop {};
+ struct pause {};
+ struct open_close {};
+ struct NextSong {};
+ struct PreviousSong {};
+
+ // A "complicated" event type that carries some data.
+ struct cd_detected
+ {
+ cd_detected(std::string name)
+ : name(name)
+ {}
+
+ std::string name;
+ };
+
+ // front-end: define the FSM structure
+ struct player_ : public msm::front::state_machine_def<player_>
+ {
+ // The list of FSM states
+ struct Empty : public msm::front::state<>
+ {
+ // every (optional) entry/exit methods get the event passed.
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: Empty" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: Empty" << std::endl;}
+ };
+ struct Open : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: Open" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: Open" << std::endl;}
+ };
+
+ struct Stopped : public msm::front::state<>
+ {
+ // when stopped, the CD is loaded
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: Stopped" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: Stopped" << std::endl;}
+ };
+
+ // the player state machine contains a state which is himself a state machine
+ // as you see, no need to declare it anywhere so Playing can be developed separately
+ // by another team in another module. For simplicity I just declare it inside player
+ struct Playing_ : public msm::front::state_machine_def<Playing_>
+ {
+ // when playing, the CD is loaded and we are in either pause or playing (duh)
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: Playing" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: Playing" << std::endl;}
+
+ // The list of FSM states
+ struct Song1 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "starting: First song" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "finishing: First Song" << std::endl;}
+
+ };
+ struct Song2 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "starting: Second song" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "finishing: Second Song" << std::endl;}
+ };
+ struct Song3 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "starting: Third song" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "finishing: Third Song" << std::endl;}
+ };
+ // the initial state. Must be defined
+ typedef Song1 initial_state;
+ // transition actions
+ void start_next_song(NextSong const&) { std::cout << "Playing::start_next_song\n"; }
+ void start_prev_song(PreviousSong const&) { std::cout << "Playing::start_prev_song\n"; }
+ // guard conditions
+
+ typedef Playing_ pl; // makes transition table cleaner
+ // Transition table for Playing
+ struct transition_table : mpl::vector4<
+ // Start Event Next Action Guard
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Song1 , NextSong , Song2 , &pl::start_next_song >,
+ a_row < Song2 , PreviousSong, Song1 , &pl::start_prev_song >,
+ a_row < Song2 , NextSong , Song3 , &pl::start_next_song >,
+ a_row < Song3 , PreviousSong, Song2 , &pl::start_prev_song >
+ // +---------+-------------+---------+---------------------+----------------------+
+ > {};
+ // Replaces the default no-transition response.
+ template <class FSM,class Event>
+ void no_transition(Event const& e, FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ // back-end
+ typedef msm::back::state_machine<Playing_> Playing;
+
+
+ // state not defining any entry or exit
+ struct Paused : public msm::front::state<>
+ {
+ };
+
+ // the initial state of the player SM. Must be defined
+ typedef Empty initial_state;
+
+ // transition actions
+ void start_playback(play const&) { std::cout << "player::start_playback\n"; }
+ void open_drawer(open_close const&) { std::cout << "player::open_drawer\n"; }
+ void close_drawer(open_close const&) { std::cout << "player::close_drawer\n"; }
+ void store_cd_info(cd_detected const& cd) {std::cout << "player::store_cd_info\n";}
+ void stop_playback(stop const&) { std::cout << "player::stop_playback\n"; }
+ void pause_playback(pause const&) { std::cout << "player::pause_playback\n"; }
+ void resume_playback(end_pause const&) { std::cout << "player::resume_playback\n"; }
+ void stop_and_open(open_close const&) { std::cout << "player::stop_and_open\n"; }
+ void stopped_again(stop const&) {std::cout << "player::stopped_again\n";}
+ // guard conditions
+
+ typedef player_ p; // makes transition table cleaner
+
+ // Transition table for player
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Stopped , play , Playing , &p::start_playback >,
+ a_row < Stopped , open_close , Open , &p::open_drawer >,
+ a_row < Stopped , stop , Stopped , &p::stopped_again >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Open , open_close , Empty , &p::close_drawer >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Empty , open_close , Open , &p::open_drawer >,
+ a_row < Empty , cd_detected , Stopped , &p::store_cd_info >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Playing , stop , Stopped , &p::stop_playback >,
+ a_row < Playing , pause , Paused , &p::pause_playback >,
+ a_row < Playing , open_close , Open , &p::stop_and_open >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Paused , end_pause , Playing , &p::resume_playback >,
+ a_row < Paused , stop , Stopped , &p::stop_playback >,
+ a_row < Paused , open_close , Open , &p::stop_and_open >
+ // +---------+-------------+---------+---------------------+----------------------+
+ > {};
+
+ // Replaces the default no-transition response.
+ template <class FSM,class Event>
+ void no_transition(Event const& e, FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+
+ };
+ // Pick a back-end
+ typedef msm::back::state_machine<player_> player;
+
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused" };
+
+ void pstate(player const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+ void test()
+ {
+ player p;
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ p.start();
+ // go to Open, call on_exit on Empty, then action, then on_entry on Open
+ p.process_event(open_close()); pstate(p);
+ p.process_event(open_close()); pstate(p);
+ p.process_event(cd_detected("louie, louie"));
+ p.process_event(play());
+
+ // at this point, Play is active
+ // make transition happen inside it. Player has no idea about this event but it's ok.
+ p.process_event(NextSong());pstate(p); //2nd song active
+ p.process_event(NextSong());pstate(p);//3rd song active
+ p.process_event(PreviousSong());pstate(p);//2nd song active
+
+ p.process_event(pause()); pstate(p);
+ // go back to Playing
+ // as you see, it starts back from the original state
+ p.process_event(end_pause()); pstate(p);
+ p.process_event(pause()); pstate(p);
+ p.process_event(stop()); pstate(p);
+ // event leading to the same state
+ p.process_event(stop()); pstate(p);
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/CompositeTutorial.jpg
==============================================================================
Binary file. No diff available.

Added: sandbox/msm/libs/msm/doc/CompositeTutorialEuml.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/CompositeTutorialEuml.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,174 @@
+#include <vector>
+#include <iostream>
+
+#include <boost/msm/back/state_machine.hpp>
+#include <boost/msm/front/euml/euml.hpp>
+
+using namespace std;
+using namespace boost::msm::front::euml;
+namespace msm = boost::msm;
+
+// entry/exit/action/guard logging functors
+#include "logging_functors.h"
+
+namespace // Concrete FSM implementation
+{
+ // events
+ struct play : euml_event<play>{};
+ struct end_pause : euml_event<end_pause>{};
+ struct stop : euml_event<stop>{};
+ struct pause : euml_event<pause>{};
+ struct open_close : euml_event<open_close>{};
+ struct next_song : euml_event<next_song>{};
+ struct previous_song : euml_event<previous_song>{};
+
+ // A "complicated" event type that carries some data.
+ typedef BOOST_TYPEOF(build_attributes(attributes_ << std::string() << DiskTypeEnum() )) cd_detected_attributes;
+ struct cd_detected : euml_event<cd_detected>, cd_detected_attributes
+ {
+ cd_detected(){}
+ cd_detected(std::string name, DiskTypeEnum diskType)
+ {
+ get_attribute<0>()=name;
+ get_attribute<1>()=diskType;
+ }
+ };
+
+ // Concrete FSM implementation
+
+ // The list of FSM states
+
+ typedef BOOST_TYPEOF(build_state(Empty_Entry(),Empty_Exit())) Empty;
+
+ typedef BOOST_TYPEOF(build_state( Open_Entry(),Open_Exit() )) Open;
+
+ typedef BOOST_TYPEOF(build_state( Stopped_Entry(),Stopped_Exit() )) Stopped;
+
+ // state not defining any entry or exit
+ typedef BOOST_TYPEOF(build_state( )) Paused;
+
+ // Playing is now a state machine itself.
+
+ // It has 3 substates
+ typedef BOOST_TYPEOF(build_state( Song1_Entry(),Song1_Exit() )) Song1;
+
+ typedef BOOST_TYPEOF(build_state( Song2_Entry(),Song2_Exit() )) Song2;
+
+ typedef BOOST_TYPEOF(build_state( Song3_Entry(),Song3_Exit() )) Song3;
+
+
+ // Playing has a transition table
+ typedef BOOST_TYPEOF(build_stt(
+ // +------------------------------------------------------------------------------+
+ ( Song1() + next_song() == Song2() / start_next_song(),
+ Song2() + previous_song() == Song1() / start_prev_song(),
+ Song2() + next_song() == Song3() / start_next_song(),
+ Song3() + previous_song() == Song2() / start_prev_song()
+ // +------------------------------------------------------------------------------+
+ ) ) ) playing_transition_table;
+
+ // VC9 cannot compile the typedef with build_sm if one is also used for player
+#ifndef BOOST_MSVC
+ // create a state machine "on the fly" for Playing
+ typedef BOOST_TYPEOF(build_sm( playing_transition_table(), //STT
+ init_ << Song1() // Init State
+ )) Playing_;
+#else
+ // but this definition is ok
+ struct Playing_ : public BOOST_TYPEOF(build_sm( playing_transition_table(), //STT
+ init_ << Song1() // Init State
+ ))
+ {
+ };
+#endif
+ // choice of back-end
+ typedef msm::back::state_machine<Playing_> Playing;
+
+ // replaces the old transition table
+ typedef BOOST_TYPEOF(build_stt
+ ((Stopped() + play() == Playing() / start_playback() ,
+ Stopped() + open_close() == Open() / open_drawer(),
+ Stopped() + stop() == Stopped(),
+ // +------------------------------------------------------------------------------+
+ Open() + open_close() == Empty() / close_drawer(),
+ // +------------------------------------------------------------------------------+
+ Empty() + open_close() == Open() / open_drawer(),
+ Empty() + cd_detected() == Stopped() [good_disk_format()&&(Event_<1>()==Int_<DISK_CD>())]
+ / (store_cd_info(),process_(play())),
+ // +------------------------------------------------------------------------------+
+ Playing() + stop() == Stopped() / stop_playback(),
+ Playing() + pause() == Paused() / pause_playback(),
+ Playing() + open_close() == Open() / stop_and_open(),
+ // +------------------------------------------------------------------------------+
+ Paused() + end_pause() == Playing() / resume_playback(),
+ Paused() + stop() == Stopped() / stop_playback(),
+ Paused() + open_close() == Open() / stop_and_open()
+ // +------------------------------------------------------------------------------+
+ ) ) ) transition_table;
+
+ // create a state machine "on the fly"
+ typedef BOOST_TYPEOF(build_sm( transition_table(), //STT
+ init_ << Empty(), // Init State
+ NoAction(), // Entry
+ NoAction(), // Exit
+ attributes_ << no_attributes_, // Attributes
+ configure_<< no_configure_, // Flags, Deferred events, configuration
+ Log_No_Transition() // no_transition handler
+ )) player_;
+ // or simply, if no no_transition handler needed:
+ //typedef BOOST_TYPEOF(build_sm( transition_table(), //STT
+ // Empty(), // Init State
+ // )) player_;
+
+ // choice of back-end
+ typedef msm::back::state_machine<player_> player;
+
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused" };
+ void pstate(player const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+ void test()
+ {
+ player p;
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ p.start();
+ // go to Open, call on_exit on Empty, then action, then on_entry on Open
+ p.process_event(open_close()); pstate(p);
+ p.process_event(open_close()); pstate(p);
+ // will be rejected, wrong disk type
+ p.process_event(
+ cd_detected("louie, louie",DISK_DVD)); pstate(p);
+ p.process_event(
+ cd_detected("louie, louie",DISK_CD)); pstate(p);
+ // no need to call play() as the previous event does it in its action method
+ //p.process_event(play());
+
+ // make transition happen inside it. Player has no idea about this event but it's ok.
+ p.process_event(next_song());pstate(p); //2nd song active
+ p.process_event(next_song());pstate(p);//3rd song active
+ p.process_event(previous_song());pstate(p);//2nd song active
+
+ // at this point, Play is active
+ p.process_event(pause()); pstate(p);
+ // go back to Playing
+ p.process_event(end_pause()); pstate(p);
+ p.process_event(pause()); pstate(p);
+ p.process_event(stop()); pstate(p);
+ // event leading to the same state
+ // no action method called as none is defined in the transition table
+ p.process_event(stop()); pstate(p);
+ // test call to no_transition
+ p.process_event(pause()); pstate(p);
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/DirectEntryAndConflicts.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/DirectEntryAndConflicts.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,232 @@
+#include <vector>
+#include <iostream>
+#include "boost/mpl/vector/vector50.hpp"
+#include <boost/msm/back/state_machine.hpp>
+#include <boost/msm/front/state_machine_def.hpp>
+
+namespace msm = boost::msm;
+
+namespace // Concrete FSM implementation
+{
+ // events
+ struct event1 {};
+ struct event2 {};
+ struct event3 {};
+ struct event4 {};
+ struct event5 {};
+ struct event6 {};
+ struct event7 {};
+ // Concrete FSM implementation
+ struct Fsm_ : public msm::front::state_machine_def<Fsm_>
+ {
+ // The list of FSM states
+ struct State1 : public msm::front::state<>
+ {
+ // every (optional) entry/exit methods get the event passed.
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: State1" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State1" << std::endl;}
+ };
+ struct State2 : public msm::front::state<>
+ {
+ // every (optional) entry/exit methods get the event passed.
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: State2" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State2" << std::endl;}
+ };
+ struct SubFsm2_ : public msm::front::state_machine_def<SubFsm2_>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2" << std::endl;}
+
+ struct SubState1 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState1" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState1" << std::endl;}
+ };
+ struct SubState1b : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState1b" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState1b" << std::endl;}
+ };
+ struct SubState2 : public msm::front::state<> , public msm::front::explicit_entry<0>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState2" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState2" << std::endl;}
+ };
+ struct SubState2b : public msm::front::state<> , public msm::front::explicit_entry<1>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState2b" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState2b" << std::endl;}
+ };
+ // test with a pseudo entry
+ struct PseudoEntry1 : public msm::front::entry_pseudo_state<0>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::PseudoEntry1" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::PseudoEntry1" << std::endl;}
+ };
+ struct SubState3 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState3" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState3" << std::endl;}
+ };
+ struct SubState3b : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState3b" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState3b" << std::endl;}
+ };
+ struct PseudoExit1 : public msm::front::exit_pseudo_state<event5>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::PseudoExit1" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::PseudoExit1" << std::endl;}
+ };
+ // action methods
+ void entry_action(event4 const&)
+ {
+ std::cout << "calling entry_action" << std::endl;
+ }
+ void fake_action(event4 const&)
+ {
+ std::cout << "calling fake_action" << std::endl;
+ }
+ bool some_guard(event4 const&)
+ {
+ bool res = false;
+ std::cout << "calling fsm::some_guard with:"<< std::boolalpha << res << std::endl;
+ return res;
+ }
+ // the initial state. Must be defined
+ typedef mpl::vector<SubState1,SubState1b> initial_state;
+
+ typedef mpl::vector<SubState2,SubState2b> explicit_creation;
+
+ // Transition table for SubFsm2
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +--------------+-------------+------------+------------------------+----------------------+
+ a_row < PseudoEntry1 , event4 , SubState3 ,&SubFsm2_::entry_action >,
+ row < PseudoEntry1 , event4 , SubState3 ,&SubFsm2_::fake_action , &SubFsm2_::some_guard >,
+ _row < SubState3 , event5 , PseudoExit1 >
+ // +--------------+-------------+------------+------------------------+----------------------+
+ > {};
+ // Replaces the default no-transition response.
+ template <class FSM,class Event>
+ void no_transition(Event const& e, FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ typedef msm::back::state_machine<SubFsm2_> SubFsm2;
+ // the initial state of the player SM. Must be defined
+ typedef State1 initial_state;
+
+ // transition actions
+ void fake_action(event5 const&)
+ {
+ std::cout << "calling fsm::fake_action" << std::endl;
+ }
+ // guard conditions
+ bool some_guard(event5 const&)
+ {
+ bool res = false;
+ std::cout << "calling fsm::some_guard with:"<< std::boolalpha << res << std::endl;
+ return res;
+ }
+ bool guard_false(event6 const&)
+ {
+ std::cout << "calling fsm::guard_false"<< std::endl;
+ return false;
+ }
+
+ // Transition table for Fsm
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +---------+-------------+---------+---------------------+----------------------+
+ _row < State1 , event1 , SubFsm2 >,
+ _row < State1 , event2 , SubFsm2::direct<SubFsm2_::SubState2> >,
+ _row < State1 , event3 , mpl::vector<SubFsm2::direct<SubFsm2_::SubState2>,
+ SubFsm2::direct<SubFsm2_::SubState2b> > >,
+ _row < State1 , event4 , SubFsm2::entry_pt<SubFsm2_::PseudoEntry1> >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ _row < SubFsm2, event1 , State1 >,
+ _row < SubFsm2::exit_pt<SubFsm2_::PseudoExit1> , event5 , State2 >,
+ g_row < State2 , event6 , State1 , &Fsm_::guard_false >,
+ g_row < State2 , event6 , State1 , &Fsm_::guard_false >
+ // +---------+-------------+---------+---------------------+----------------------+
+ > {};
+
+ // Replaces the default no-transition response.
+ template <class FSM,class Event>
+ void no_transition(Event const& e, FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ typedef msm::back::state_machine<Fsm_> Fsm;
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "State1", "SubFsm2","State2" };
+ void pstate(Fsm const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+ void test()
+ {
+ Fsm p;
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ p.start();
+ std::cout << "Simply move in and out of the composite, activate init states" << std::endl;
+ p.process_event(event1()); pstate(p);
+ // voluntary mistake to check that the transition is only taken if the exit state is active
+ std::cout << "Simulate error. event5 is only valid through an exit pseudo state" << std::endl;
+ p.process_event(event5()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "Direct entry into SubFsm2::SubState2 and back" << std::endl;
+ p.process_event(event2()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "processing fork to SubFsm2::SubState2 and SubFsm2::SubState2b" << std::endl;
+ p.process_event(event3()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "processing entry pseudo state" << std::endl;
+ p.process_event(event4()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "processing entry + exit pseudo state" << std::endl;
+ p.process_event(event4()); pstate(p);
+ std::cout << "using exit pseudo state" << std::endl;
+ p.process_event(event5()); pstate(p);
+ std::cout << "Simulate error. event5 is not valid" << std::endl;
+ p.process_event(event5()); pstate(p);
+ std::cout << "2 false guards" << std::endl;
+ p.process_event(event6()); pstate(p);
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/DirectEntryEuml.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/DirectEntryEuml.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,364 @@
+#include <vector>
+#include <iostream>
+
+#include <boost/msm/back/state_machine.hpp>
+#include <boost/msm/front/euml/euml.hpp>
+
+using namespace std;
+using namespace boost::msm::front::euml;
+namespace msm = boost::msm;
+
+
+namespace // Concrete FSM implementation
+{
+ // events
+ struct event1 : euml_event<event1> {};
+ struct event2 : euml_event<event2> {};
+ struct event3 : euml_event<event3> {};
+ struct event4 : euml_event<event4> {};
+ struct event5 : euml_event<event5> {};
+ struct event6 : euml_event<event6>
+ {
+ event6(){}
+ template <class Event>
+ event6(Event const&){}
+ };
+
+ //Sub fsm state definition
+ struct SubState1_Entry : euml_action<SubState1_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2::SubState1" << std::endl;
+ }
+ };
+ struct SubState1_Exit : euml_action<SubState1_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2::SubState1" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_state(SubState1_Entry(),SubState1_Exit())) SubState1;
+
+ struct SubState1b_Entry : euml_action<SubState1b_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2::SubState1b" << std::endl;
+ }
+ };
+ struct SubState1b_Exit : euml_action<SubState1b_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2::SubState1b" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_state(SubState1b_Entry(),SubState1b_Exit())) SubState1b;
+
+ struct SubState1c_Entry : euml_action<SubState1c_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2::SubState1c" << std::endl;
+ }
+ };
+ struct SubState1c_Exit : euml_action<SubState1c_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2::SubState1c" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_state(SubState1c_Entry(),SubState1c_Exit())) SubState1c;
+
+ struct SubState2_Entry : euml_action<SubState2_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2::SubState2" << std::endl;
+ }
+ };
+ struct SubState2_Exit : euml_action<SubState2_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2::SubState2" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_explicit_entry_state<0>(SubState2_Entry(),SubState2_Exit())) SubState2;
+
+ struct SubState2b_Entry : euml_action<SubState2b_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2::SubState2b" << std::endl;
+ }
+ };
+ struct SubState2b_Exit : euml_action<SubState2b_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2::SubState2b" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_explicit_entry_state<1>(SubState2b_Entry(),SubState2b_Exit())) SubState2b;
+
+ struct SubState2c_Entry : euml_action<SubState2c_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2::SubState2c" << std::endl;
+ }
+ };
+ struct SubState2c_Exit : euml_action<SubState2c_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2::SubState2c" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_explicit_entry_state<2>(SubState2c_Entry(),SubState2c_Exit())) SubState2c;
+
+ struct PseudoEntry1_Entry : euml_action<PseudoEntry1_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2::PseudoEntry1" << std::endl;
+ }
+ };
+ struct PseudoEntry1_Exit : euml_action<PseudoEntry1_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2::PseudoEntry1" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_entry_state<0>(PseudoEntry1_Entry(),PseudoEntry1_Exit())) PseudoEntry1;
+
+ struct SubState3_Entry : euml_action<SubState3_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2::SubState3" << std::endl;
+ }
+ };
+ struct SubState3_Exit : euml_action<SubState3_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2::SubState3" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_state(SubState3_Entry(),SubState3_Exit())) SubState3;
+
+ struct SubState3b_Entry : euml_action<SubState3b_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2::SubState3b" << std::endl;
+ }
+ };
+ struct SubState3b_Exit : euml_action<SubState3b_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2::SubState3b" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_state(SubState3b_Entry(),SubState3b_Exit())) SubState3b;
+
+ struct PseudoExit1_Entry : euml_action<PseudoExit1_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2::PseudoExit1" << std::endl;
+ }
+ };
+ struct PseudoExit1_Exit : euml_action<PseudoExit1_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2::PseudoExit1" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_exit_state(event6(),PseudoExit1_Entry(),PseudoExit1_Exit())) PseudoExit1;
+
+ // actions
+ struct entry_action : euml_action<entry_action>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(FSM& ,EVT const& ,SourceState& ,TargetState& )
+ {
+ cout << "calling entry_action" << endl;
+ }
+ };
+ // SubFsm definition
+ struct SubFsm2_Entry : euml_action<SubFsm2_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: SubFsm2" << std::endl;
+ }
+ };
+ struct SubFsm2_Exit : euml_action<SubFsm2_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: SubFsm2" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_stt(
+ // +------------------------------------------------------------------------------+
+ ( PseudoEntry1() + event4() == SubState3() / entry_action() ,
+ SubState2() + event6() == SubState1() ,
+ SubState3() + event5() == PseudoExit1()
+ // +------------------------------------------------------------------------------+
+ ) ) ) SubFsm2_transition_table;
+
+ struct SubFsm2_ : public BOOST_TYPEOF(build_sm( SubFsm2_transition_table(), //STT
+ init_ << SubState1() << SubState1b() << SubState1c(), // Init State
+ SubFsm2_Entry(), // Entry
+ SubFsm2_Exit()
+ ))
+ {
+ typedef mpl::vector<SubState2b,SubState2c> explicit_creation;
+ };
+
+
+ // back-end
+ typedef msm::back::state_machine<SubFsm2_> SubFsm2;
+
+ // Fsm state definitions
+ struct State1_Entry : euml_action<State1_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: State1" << std::endl;
+ }
+ };
+ struct State1_Exit : euml_action<State1_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: State1" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_state(State1_Entry(),State1_Exit())) State1;
+
+ struct State2_Entry : euml_action<State2_Entry>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "entering: State2" << std::endl;
+ }
+ };
+ struct State2_Exit : euml_action<State2_Exit>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const&,FSM&,STATE& )
+ {
+ std::cout << "leaving: State2" << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_state(State2_Entry(),State2_Exit())) State2;
+
+ // Fsm definition
+ typedef BOOST_TYPEOF(build_stt(
+ // +------------------------------------------------------------------------------+
+ ( State1() + event1() == SubFsm2() ,
+ State1() + event2() == SubFsm2::direct<SubState2>() ,
+ State1() + event3() == (SubFsm2::direct<SubState2>(),SubFsm2::direct<SubState2b>(),
+ SubFsm2::direct<SubState2c>()),
+ State1() + event4() == SubFsm2::entry_pt<PseudoEntry1>(),
+ SubFsm2() + event1() == State1() ,
+ SubFsm2::exit_pt
+ <PseudoExit1>() + event6() == State2()
+ // +------------------------------------------------------------------------------+
+ ) ) ) transition_table;
+
+ struct Log_No_Transition : euml_action<Log_No_Transition>
+ {
+ template <class Event,class FSM,class STATE>
+ void operator()(Event const& e,FSM&,STATE& )
+ {
+ std::cout << "no transition in Fsm"
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ typedef BOOST_TYPEOF(build_sm( transition_table(), //STT
+ init_ << State1(), // Init State
+ NoAction(), // Entry
+ NoAction(), // Exit
+ attributes_ << no_attributes_, // Attributes
+ configure_<< no_configure_, // Flags, Deferred events, configuration
+ Log_No_Transition() // no_transition handler
+ )) Fsm_;
+ //back-end
+ typedef msm::back::state_machine<Fsm_> Fsm;
+
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "State1", "SubFsm2","State2" };
+ void pstate(Fsm const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+ void test()
+ {
+ Fsm p;
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ p.start();
+ std::cout << "Simply move in and out of the composite, activate init states" << std::endl;
+ p.process_event(event1()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "Direct entry into SubFsm2::SubState2, then transition to SubState1 and back to State1" << std::endl;
+ p.process_event(event2()); pstate(p);
+ p.process_event(event6()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "processing fork to SubFsm2::SubState2, SubFsm2::SubState2b and SubFsm2::SubState2c" << std::endl;
+ p.process_event(event3()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "processing entry pseudo state" << std::endl;
+ p.process_event(event4()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "processing entry + exit pseudo state" << std::endl;
+ p.process_event(event4()); pstate(p);
+ std::cout << "using exit pseudo state" << std::endl;
+ p.process_event(event5()); pstate(p);
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/DirectEntryTutorial.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/DirectEntryTutorial.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,210 @@
+#include <vector>
+#include <iostream>
+// back-end
+#include <boost/msm/back/state_machine.hpp>
+//front-end
+#include <boost/msm/front/state_machine_def.hpp>
+
+namespace msm = boost::msm;
+
+namespace
+{
+ // events
+ struct event1 {};
+ struct event2 {};
+ struct event3 {};
+ struct event4 {};
+ struct event5 {};
+ struct event6
+ {
+ event6(){}
+ template <class Event>
+ event6(Event const&){}
+ };
+ // front-end: define the FSM structure
+ struct Fsm_ : public msm::front::state_machine_def<Fsm_>
+ {
+ // The list of FSM states
+ struct State1 : public msm::front::state<>
+ {
+ // every (optional) entry/exit methods get the event passed.
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: State1" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State1" << std::endl;}
+ };
+ struct State2 : public msm::front::state<>
+ {
+ // every (optional) entry/exit methods get the event passed.
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: State2" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: State2" << std::endl;}
+ };
+ struct SubFsm2_ : public msm::front::state_machine_def<SubFsm2_>
+ {
+ typedef msm::back::state_machine<SubFsm2_> SubFsm2;
+
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2" << std::endl;}
+
+ struct SubState1 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState1" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState1" << std::endl;}
+ };
+ struct SubState1b : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState1b" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState1b" << std::endl;}
+ };
+ struct SubState2 : public msm::front::state<> , public msm::front::explicit_entry<0>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState2" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState2" << std::endl;}
+ };
+ struct SubState2b : public msm::front::state<> , public msm::front::explicit_entry<1>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState2b" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState2b" << std::endl;}
+ };
+ // test with a pseudo entry
+ struct PseudoEntry1 : public msm::front::entry_pseudo_state<0>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::PseudoEntry1" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::PseudoEntry1" << std::endl;}
+ };
+ struct SubState3 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState3" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState3" << std::endl;}
+ };
+ struct SubState3b : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::SubState3b" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::SubState3b" << std::endl;}
+ };
+ struct PseudoExit1 : public msm::front::exit_pseudo_state<event6>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: SubFsm2::PseudoExit1" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: SubFsm2::PseudoExit1" << std::endl;}
+ };
+ // action methods
+ void entry_action(event4 const&)
+ {
+ std::cout << "calling entry_action" << std::endl;
+ }
+ // the initial state. Must be defined
+ typedef mpl::vector<SubState1,SubState1b> initial_state;
+
+ typedef mpl::vector<SubState2b> explicit_creation;
+
+ // Transition table for SubFsm2
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +--------------+-------------+------------+------------------------+----------------------+
+ a_row < PseudoEntry1 , event4 , SubState3 ,&SubFsm2_::entry_action >,
+ _row < SubState2 , event6 , SubState1 >,
+ _row < SubState3 , event5 , PseudoExit1 >
+ // +--------------+-------------+------------+------------------------+----------------------+
+ > {};
+ // Replaces the default no-transition response.
+ template <class FSM,class Event>
+ void no_transition(Event const& e, FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ typedef msm::back::state_machine<SubFsm2_> SubFsm2;
+
+ // the initial state of the player SM. Must be defined
+ typedef State1 initial_state;
+
+ // transition actions
+ // guard conditions
+
+ // Transition table for Fsm
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +---------------------+--------+------------------------------------+-------+--------+
+ _row < State1 , event1 , SubFsm2 >,
+ _row < State1 , event2 , SubFsm2::direct<SubFsm2_::SubState2> >,
+ _row < State1 , event3 , mpl::vector<SubFsm2::direct<SubFsm2_::SubState2>,
+ SubFsm2::direct<SubFsm2_::SubState2b> > >,
+ _row < State1 , event4 , SubFsm2::entry_pt
+ <SubFsm2_::PseudoEntry1> >,
+ // +---------------------+--------+------------------------------------+-------+--------+
+ _row < SubFsm2 , event1 , State1 >,
+ _row < SubFsm2::exit_pt
+ <SubFsm2_::PseudoExit1>, event6 , State2 >
+ // +---------------------+--------+------------------------------------+-------+--------+
+ > {};
+
+ // Replaces the default no-transition response.
+ template <class FSM,class Event>
+ void no_transition(Event const& e, FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ typedef msm::back::state_machine<Fsm_> Fsm;
+
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "State1", "SubFsm2","State2" };
+ void pstate(Fsm const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+ void test()
+ {
+ Fsm p;
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ p.start();
+ std::cout << "Simply move in and out of the composite, activate init states" << std::endl;
+ p.process_event(event1()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "Direct entry into SubFsm2::SubState2, then transition to SubState1 and back to State1" << std::endl;
+ p.process_event(event2()); pstate(p);
+ p.process_event(event6()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "processing fork to SubFsm2::SubState2 and SubFsm2::SubState2b" << std::endl;
+ p.process_event(event3()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "processing entry pseudo state" << std::endl;
+ p.process_event(event4()); pstate(p);
+ p.process_event(event1()); pstate(p);
+ std::cout << "processing entry + exit pseudo state" << std::endl;
+ p.process_event(event4()); pstate(p);
+ std::cout << "using exit pseudo state" << std::endl;
+ p.process_event(event5()); pstate(p);
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/EumlSimple.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/EumlSimple.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,234 @@
+// MsmSimple.cpp : Defines the entry point for the console application.
+//
+
+#include "stdafx.h"
+
+#include <boost/msm/back/state_machine.hpp>
+#include <boost/msm/front/state_machine_def.hpp>
+#include <boost/msm/front/euml/euml.hpp>
+#include <boost/msm/front/euml/stl.hpp>
+
+namespace msm = boost::msm;
+namespace mpl = boost::mpl;
+using namespace boost::msm::front::euml;
+
+#include <iostream>
+#ifdef WIN32
+#include "windows.h"
+#else
+#include <sys/time.h>
+#endif
+
+namespace test_fsm // Concrete FSM implementation
+{
+ // events
+ struct play : euml_event<play>{};
+ struct end_pause : euml_event<end_pause>{};
+ struct stop : euml_event<stop>{};
+ struct pause : euml_event<pause>{};
+ struct open_close : euml_event<open_close>{};
+ struct cd_detected : euml_event<cd_detected>{};
+
+ struct start_playback : euml_action<start_playback>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
+ {
+ }
+ };
+ struct open_drawer : euml_action<open_drawer>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
+ {
+ }
+ };
+ struct close_drawer : euml_action<close_drawer>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
+ {
+ }
+ };
+ struct store_cd_info : euml_action<store_cd_info>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const&, FSM& fsm ,SourceState& ,TargetState& )
+ {
+ }
+ };
+ struct stop_playback : euml_action<stop_playback>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
+ {
+ }
+ };
+ struct pause_playback : euml_action<pause_playback>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
+ {
+ }
+ };
+ struct resume_playback : euml_action<resume_playback>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
+ {
+ }
+ };
+ struct stop_and_open : euml_action<stop_and_open>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
+ {
+ }
+ };
+ struct stopped_again : euml_action<stopped_again>
+ {
+ template <class FSM,class EVT,class SourceState,class TargetState>
+ void operator()(EVT const& ,FSM&,SourceState& ,TargetState& )
+ {
+ }
+ };
+
+ // The list of FSM states
+ typedef BOOST_TYPEOF(build_state()) Empty;
+
+ typedef BOOST_TYPEOF(build_state( )) Open;
+
+ typedef BOOST_TYPEOF(build_state( )) Stopped;
+
+ typedef BOOST_TYPEOF(build_state( )) Playing;
+
+ typedef BOOST_TYPEOF(build_state( )) Paused;
+
+ // replaces the old transition table
+ typedef BOOST_TYPEOF(build_stt
+ ((Stopped() + play() == Playing() / start_playback() ,
+ Stopped() + open_close() == Open() / open_drawer(),
+ Stopped() + stop() == Stopped() / stopped_again(),
+ // +------------------------------------------------------------------------------+
+ Open() + open_close() == Empty() / close_drawer(),
+ // +------------------------------------------------------------------------------+
+ Empty() + open_close() == Open() / open_drawer(),
+ Empty() + cd_detected() == Stopped() / store_cd_info(),
+ // +------------------------------------------------------------------------------+
+ Playing() + stop() == Stopped() / stop_playback(),
+ Playing() + pause() == Paused() / pause_playback(),
+ Playing() + open_close() == Open() / stop_and_open(),
+ // +------------------------------------------------------------------------------+
+ Paused() + end_pause() == Playing() / resume_playback(),
+ Paused() + stop() == Stopped() / stop_playback(),
+ Paused() + open_close() == Open() / stop_and_open()
+ // +------------------------------------------------------------------------------+
+ ) ) ) transition_table;
+
+
+ struct Log_No_Transition : euml_action<Log_No_Transition>
+ {
+ template <class FSM,class Event>
+ void operator()(Event const& e,FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+
+ // create a state machine "on the fly"
+ // VC9 sometimes cannot compile the typedef with build_sm
+#ifndef BOOST_MSVC
+ // create a state machine "on the fly" for player
+ typedef BOOST_TYPEOF(build_sm( transition_table(), //STT
+ init_ << Empty(), // Init State
+ NoAction(), // Entry
+ NoAction(), // Exit
+ attributes_ << no_attributes_, // Attributes
+ configure_ << no_exception() << no_msg_queue(),
+ Log_No_Transition() // no_transition handler
+ )) player_;
+#else
+ // but this definition is ok
+ struct player_ : public BOOST_TYPEOF(build_sm( transition_table(), //STT
+ init_ << Empty(), // Init State
+ NoAction(), // Entry
+ NoAction(), // Exit
+ attributes_ << no_attributes_, // Attributes
+ configure_ << no_exception() << no_msg_queue(), // configuration
+ Log_No_Transition() // no_transition handler
+ ))
+ {
+ };
+#endif
+ typedef msm::back::state_machine<player_> player;
+
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused" };
+
+ void pstate(player const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+}
+
+#ifndef WIN32
+long mtime(struct timeval& tv1,struct timeval& tv2)
+{
+ return (tv2.tv_sec-tv1.tv_sec) *1000000 + ((tv2.tv_usec-tv1.tv_usec));
+}
+#endif
+
+
+int main()
+{
+ // for timing
+#ifdef WIN32
+ LARGE_INTEGER res;
+ ::QueryPerformanceFrequency(&res);
+ LARGE_INTEGER li,li2;
+#else
+ struct timeval tv1,tv2;
+ gettimeofday(&tv1,NULL);
+#endif
+
+ test_fsm::player p2;
+ p2.start();
+ // for timing
+#ifdef WIN32
+ ::QueryPerformanceCounter(&li);
+#else
+ gettimeofday(&tv1,NULL);
+#endif
+ for (int i=0;i<100;++i)
+ {
+ p2.process_event(test_fsm::open_close());
+ p2.process_event(test_fsm::open_close());
+ p2.process_event(test_fsm::cd_detected());
+ p2.process_event(test_fsm::play());
+ p2.process_event(test_fsm::pause());
+ // go back to Playing
+ p2.process_event(test_fsm::end_pause());
+ p2.process_event(test_fsm::pause());
+ p2.process_event(test_fsm::stop());
+ // event leading to the same state
+ p2.process_event(test_fsm::stop());
+ p2.process_event(test_fsm::open_close());
+ p2.process_event(test_fsm::open_close());
+ }
+#ifdef WIN32
+ ::QueryPerformanceCounter(&li2);
+#else
+ gettimeofday(&tv2,NULL);
+#endif
+#ifdef WIN32
+ std::cout << "msm took in s:" << (double)(li2.QuadPart-li.QuadPart)/res.QuadPart <<"\n" <<std::endl;
+#else
+ std::cout << "msm took in us:" << mtime(tv1,tv2) <<"\n" <<std::endl;
+#endif
+ return 0;
+}
+

Added: sandbox/msm/libs/msm/doc/Flags.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/Flags.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,243 @@
+#include <iostream>
+// back-end
+#include <boost/msm/back/state_machine.hpp>
+//front-end
+#include <boost/msm/front/state_machine_def.hpp>
+
+namespace msm = boost::msm;
+
+namespace // Concrete FSM implementation
+{
+ // events
+ struct play {};
+ struct end_pause {};
+ struct stop {};
+ struct pause {};
+ struct open_close {};
+ struct NextSong {};
+ struct PreviousSong {};
+
+ // Flags. Allow information about a property of the current state
+ struct PlayingPaused{};
+ struct CDLoaded {};
+ struct FirstSongPlaying {};
+
+ // A "complicated" event type that carries some data.
+ struct cd_detected
+ {
+ cd_detected(std::string name)
+ : name(name)
+ {}
+
+ std::string name;
+ };
+
+ // front-end: define the FSM structure
+ struct player_ : public msm::front::state_machine_def<player_>
+ {
+ // The list of FSM states
+ struct Empty : public msm::front::state<>
+ {
+ // every (optional) entry/exit methods get the event passed.
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: Empty" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: Empty" << std::endl;}
+ };
+ struct Open : public msm::front::state<>
+ {
+ typedef mpl::vector1<CDLoaded> flag_list;
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: Open" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: Open" << std::endl;}
+ };
+
+ struct Stopped : public msm::front::state<>
+ {
+ // when stopped, the CD is loaded
+ typedef mpl::vector1<CDLoaded> flag_list;
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: Stopped" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: Stopped" << std::endl;}
+ };
+
+ // the player state machine contains a state which is himself a state machine
+ // as you see, no need to declare it anywhere so Playing can be developed separately
+ // by another team in another module. For simplicity I just declare it inside player
+ struct Playing_ : public msm::front::state_machine_def<Playing_>
+ {
+ // when playing, the CD is loaded and we are in either pause or playing (duh)
+ typedef mpl::vector2<PlayingPaused,CDLoaded> flag_list;
+
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "entering: Playing" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "leaving: Playing" << std::endl;}
+
+ // The list of FSM states
+ struct Song1 : public msm::front::state<>
+ {
+ typedef mpl::vector1<FirstSongPlaying> flag_list;
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "starting: First song" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "finishing: First Song" << std::endl;}
+
+ };
+ struct Song2 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "starting: Second song" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "finishing: Second Song" << std::endl;}
+ };
+ struct Song3 : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "starting: Third song" << std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "finishing: Third Song" << std::endl;}
+ };
+ // the initial state. Must be defined
+ typedef Song1 initial_state;
+ // transition actions
+ void start_next_song(NextSong const&) { std::cout << "Playing::start_next_song\n"; }
+ void start_prev_song(PreviousSong const&) { std::cout << "Playing::start_prev_song\n"; }
+ // guard conditions
+
+ typedef Playing_ pl; // makes transition table cleaner
+ // Transition table for Playing
+ struct transition_table : mpl::vector4<
+ // Start Event Next Action Guard
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Song1 , NextSong , Song2 , &pl::start_next_song >,
+ a_row < Song2 , PreviousSong, Song1 , &pl::start_prev_song >,
+ a_row < Song2 , NextSong , Song3 , &pl::start_next_song >,
+ a_row < Song3 , PreviousSong, Song2 , &pl::start_prev_song >
+ // +---------+-------------+---------+---------------------+----------------------+
+ > {};
+ // Replaces the default no-transition response.
+ template <class FSM,class Event>
+ void no_transition(Event const& e, FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ // back-end
+ typedef msm::back::state_machine<Playing_> Playing;
+
+ // state not defining any entry or exit
+ struct Paused : public msm::front::state<>
+ {
+ typedef mpl::vector2<PlayingPaused,CDLoaded> flag_list;
+ };
+
+ // the initial state of the player SM. Must be defined
+ typedef Empty initial_state;
+
+ // transition actions
+ void start_playback(play const&) { std::cout << "player::start_playback\n"; }
+ void open_drawer(open_close const&) { std::cout << "player::open_drawer\n"; }
+ void close_drawer(open_close const&) { std::cout << "player::close_drawer\n"; }
+ void store_cd_info(cd_detected const& cd) {std::cout << "player::store_cd_info\n";}
+ void stop_playback(stop const&) { std::cout << "player::stop_playback\n"; }
+ void pause_playback(pause const&) { std::cout << "player::pause_playback\n"; }
+ void resume_playback(end_pause const&) { std::cout << "player::resume_playback\n"; }
+ void stop_and_open(open_close const&) { std::cout << "player::stop_and_open\n"; }
+ void stopped_again(stop const&) {std::cout << "player::stopped_again\n";}
+ // guard conditions
+
+ typedef player_ p; // makes transition table cleaner
+
+ // Transition table for player
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Stopped , play , Playing , &p::start_playback >,
+ a_row < Stopped , open_close , Open , &p::open_drawer >,
+ a_row < Stopped , stop , Stopped , &p::stopped_again >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Open , open_close , Empty , &p::close_drawer >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Empty , open_close , Open , &p::open_drawer >,
+ a_row < Empty , cd_detected , Stopped , &p::store_cd_info >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Playing , stop , Stopped , &p::stop_playback >,
+ a_row < Playing , pause , Paused , &p::pause_playback >,
+ a_row < Playing , open_close , Open , &p::stop_and_open >,
+ // +---------+-------------+---------+---------------------+----------------------+
+ a_row < Paused , end_pause , Playing , &p::resume_playback >,
+ a_row < Paused , stop , Stopped , &p::stop_playback >,
+ a_row < Paused , open_close , Open , &p::stop_and_open >
+ // +---------+-------------+---------+---------------------+----------------------+
+ > {};
+
+ // Replaces the default no-transition response.
+ template <class FSM,class Event>
+ void no_transition(Event const& e, FSM&,int state)
+ {
+ std::cout << "no transition from state " << state
+ << " on event " << typeid(e).name() << std::endl;
+ }
+ };
+ // Pick a back-end
+ typedef msm::back::state_machine<player_> player;
+
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused" };
+
+ void pstate(player const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+ void test()
+ {
+ player p;
+
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ p.start();
+ // tests some flags
+ std::cout << "CDLoaded active:" << std::boolalpha << p.is_flag_active<CDLoaded>() << std::endl; //=> false (no CD yet)
+ // go to Open, call on_exit on Empty, then action, then on_entry on Open
+ p.process_event(open_close()); pstate(p);
+ p.process_event(open_close()); pstate(p);
+ p.process_event(cd_detected("louie, louie"));
+ p.process_event(play());
+
+ // at this point, Play is active
+ std::cout << "PlayingPaused active:" << std::boolalpha << p.is_flag_active<PlayingPaused>() << std::endl;//=> true
+ std::cout << "FirstSong active:" << std::boolalpha << p.is_flag_active<FirstSongPlaying>() << std::endl;//=> true
+
+ // make transition happen inside it. Player has no idea about this event but it's ok.
+ p.process_event(NextSong());pstate(p); //2nd song active
+ p.process_event(NextSong());pstate(p);//3rd song active
+ p.process_event(PreviousSong());pstate(p);//2nd song active
+ std::cout << "FirstSong active:" << std::boolalpha << p.is_flag_active<FirstSongPlaying>() << std::endl;//=> false
+
+ std::cout << "PlayingPaused active:" << std::boolalpha << p.is_flag_active<PlayingPaused>() << std::endl;//=> true
+ p.process_event(pause()); pstate(p);
+ std::cout << "PlayingPaused active:" << std::boolalpha << p.is_flag_active<PlayingPaused>() << std::endl;//=> true
+ // go back to Playing
+ // as you see, it starts back from the original state
+ p.process_event(end_pause()); pstate(p);
+ p.process_event(pause()); pstate(p);
+ p.process_event(stop()); pstate(p);
+ std::cout << "PlayingPaused active:" << std::boolalpha << p.is_flag_active<PlayingPaused>() << std::endl;//=> false
+ std::cout << "CDLoaded active:" << std::boolalpha << p.is_flag_active<CDLoaded>() << std::endl;//=> true
+
+ // event leading to the same state
+ p.process_event(stop()); pstate(p);
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/FlagsTutorial.jpg
==============================================================================
Binary file. No diff available.

Added: sandbox/msm/libs/msm/doc/FlagsTutorialEuml.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/FlagsTutorialEuml.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,202 @@
+#include <iostream>
+
+#include <boost/msm/back/state_machine.hpp>
+#include <boost/msm/front/euml/euml.hpp>
+
+using namespace std;
+using namespace boost::msm::front::euml;
+namespace msm = boost::msm;
+
+// entry/exit/action/guard logging functors
+#include "logging_functors.h"
+
+namespace // Concrete FSM implementation
+{
+ // events
+ struct play : euml_event<play>{};
+ struct end_pause : euml_event<end_pause>{};
+ struct stop : euml_event<stop>{};
+ struct pause : euml_event<pause>{};
+ struct open_close : euml_event<open_close>{};
+ struct next_song : euml_event<next_song>{};
+ struct previous_song : euml_event<previous_song>{};
+
+ // A "complicated" event type that carries some data.
+ typedef BOOST_TYPEOF(build_attributes(attributes_ << std::string() << DiskTypeEnum() )) cd_detected_attributes;
+ struct cd_detected : euml_event<cd_detected>,cd_detected_attributes
+
+ {
+ cd_detected(){}
+ cd_detected(std::string name, DiskTypeEnum diskType)
+ {
+ get_attribute<0>()=name;
+ get_attribute<1>()=diskType;
+ }
+ };
+
+ // Flags. Allow information about a property of the current state
+ struct PlayingPaused: euml_flag<PlayingPaused>{};
+ struct CDLoaded : euml_flag<CDLoaded>{};
+ struct FirstSongPlaying : euml_flag<FirstSongPlaying>{};
+
+ // Concrete FSM implementation
+
+ // The list of FSM states
+
+ typedef BOOST_TYPEOF(build_state(Empty_Entry(),Empty_Exit())) Empty;
+
+ typedef BOOST_TYPEOF(build_state( Open_Entry(),Open_Exit(),
+ attributes_ << no_attributes_,
+ configure_<< CDLoaded() )) Open;
+
+ typedef BOOST_TYPEOF(build_state( Stopped_Entry(),Stopped_Exit(),
+ attributes_ << no_attributes_,
+ configure_<< CDLoaded() )) Stopped;
+
+ // state not defining any entry or exit
+ typedef BOOST_TYPEOF(build_state(NoAction(),NoAction(),
+ attributes_ << no_attributes_,
+ configure_<< PlayingPaused() << CDLoaded() )) Paused;
+
+ // Playing is now a state machine itself.
+
+ // It has 3 substates
+ typedef BOOST_TYPEOF(build_state( Song1_Entry(),Song1_Exit(),
+ attributes_ << no_attributes_,
+ configure_<< FirstSongPlaying() )) Song1;
+
+ typedef BOOST_TYPEOF(build_state( Song2_Entry(),Song2_Exit() )) Song2;
+
+ typedef BOOST_TYPEOF(build_state( Song3_Entry(),Song3_Exit() )) Song3;
+
+
+ // Playing has a transition table
+ typedef BOOST_TYPEOF(build_stt(
+ // +------------------------------------------------------------------------------+
+ ( Song1() + next_song() == Song2() / start_next_song(),
+ Song2() + previous_song() == Song1() / start_prev_song(),
+ Song2() + next_song() == Song3() / start_next_song(),
+ Song3() + previous_song() == Song2() / start_prev_song()
+ // +------------------------------------------------------------------------------+
+ ) ) ) playing_transition_table;
+
+ // VC9 cannot compile the typedef with build_sm if one is also used for player
+#ifndef BOOST_MSVC
+ // create a state machine "on the fly" for Playing
+ typedef BOOST_TYPEOF(build_sm( playing_transition_table(), //STT
+ init_ << Song1() // Init State
+ )) Playing_;
+#else
+ // but this definition is ok
+ struct Playing_ : public BOOST_TYPEOF(build_sm( playing_transition_table(), //STT
+ init_ << Song1(), // Init State
+ NoAction(), // entry
+ NoAction(), // exit
+ attributes_ << no_attributes_, //attributes
+ configure_<< PlayingPaused() << CDLoaded() // Flags, Deferred events, configuration
+ ))
+ {
+ };
+#endif
+ // choice of back-end
+ typedef msm::back::state_machine<Playing_> Playing;
+
+ // replaces the old transition table
+ typedef BOOST_TYPEOF(build_stt
+ ((Stopped() + play() == Playing() / start_playback() ,
+ Stopped() + open_close() == Open() / open_drawer(),
+ Stopped() + stop() == Stopped(),
+ // +------------------------------------------------------------------------------+
+ Open() + open_close() == Empty() / close_drawer(),
+ // +------------------------------------------------------------------------------+
+ Empty() + open_close() == Open() / open_drawer(),
+ Empty() + cd_detected() == Stopped() [good_disk_format()&&(Event_<1>()==Int_<DISK_CD>())]
+ / (store_cd_info(),process_(play())),
+ // +------------------------------------------------------------------------------+
+ Playing() + stop() == Stopped() / stop_playback(),
+ Playing() + pause() == Paused() / pause_playback(),
+ Playing() + open_close() == Open() / stop_and_open(),
+ // +------------------------------------------------------------------------------+
+ Paused() + end_pause() == Playing() / resume_playback(),
+ Paused() + stop() == Stopped() / stop_playback(),
+ Paused() + open_close() == Open() / stop_and_open()
+ // +------------------------------------------------------------------------------+
+ ) ) ) transition_table;
+
+ // create a state machine "on the fly"
+ typedef BOOST_TYPEOF(build_sm( transition_table(), //STT
+ init_ << Empty(), // Init State
+ NoAction(), // Entry
+ NoAction(), // Exit
+ attributes_ << no_attributes_, // Attributes
+ configure_<< no_configure_, // Flags, Deferred events, configuration
+ Log_No_Transition() // no_transition handler
+ )) player_;
+ // or simply, if no no_transition handler needed:
+ //typedef BOOST_TYPEOF(build_sm( transition_table(), //STT
+ // Empty(), // Init State
+ // )) player_;
+
+ // choice of back-end
+ typedef msm::back::state_machine<player_> player;
+
+ //
+ // Testing utilities.
+ //
+ static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused" };
+ void pstate(player const& p)
+ {
+ std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
+ }
+
+ void test()
+ {
+ player p;
+ // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
+ p.start();
+ // tests some flags
+ std::cout << "CDLoaded active:" << std::boolalpha << p.is_flag_active<CDLoaded>() << std::endl; //=> false (no CD yet)
+ // go to Open, call on_exit on Empty, then action, then on_entry on Open
+ p.process_event(open_close()); pstate(p);
+ p.process_event(open_close()); pstate(p);
+ // will be rejected, wrong disk type
+ p.process_event(
+ cd_detected("louie, louie",DISK_DVD)); pstate(p);
+ p.process_event(
+ cd_detected("louie, louie",DISK_CD)); pstate(p);
+ // no need to call play() as the previous event does it in its action method
+ //p.process_event(play());
+
+ // at this point, Play is active
+ std::cout << "PlayingPaused active:" << std::boolalpha << p.is_flag_active<PlayingPaused>() << std::endl;//=> true
+ std::cout << "FirstSong active:" << std::boolalpha << p.is_flag_active<FirstSongPlaying>() << std::endl;//=> true
+
+ // make transition happen inside it. Player has no idea about this event but it's ok.
+ p.process_event(next_song());pstate(p); //2nd song active
+ p.process_event(next_song());pstate(p);//3rd song active
+ p.process_event(previous_song());pstate(p);//2nd song active
+ std::cout << "FirstSong active:" << std::boolalpha << p.is_flag_active<FirstSongPlaying>() << std::endl;//=> false
+ std::cout << "PlayingPaused active:" << std::boolalpha << p.is_flag_active<PlayingPaused>() << std::endl;//=> true
+
+ // at this point, Play is active
+ p.process_event(pause()); pstate(p);
+ std::cout << "PlayingPaused active:" << std::boolalpha << p.is_flag_active<PlayingPaused>() << std::endl;//=> true
+
+ // go back to Playing
+ p.process_event(end_pause()); pstate(p);
+ p.process_event(pause()); pstate(p);
+ p.process_event(stop()); pstate(p);
+ std::cout << "PlayingPaused active:" << std::boolalpha << p.is_flag_active<PlayingPaused>() << std::endl;//=> false
+ std::cout << "CDLoaded active:" << std::boolalpha << p.is_flag_active<CDLoaded>() << std::endl;//=> true
+
+ // event leading to the same state
+ // no action method called as none is defined in the transition table
+ p.process_event(stop()); pstate(p);
+ }
+}
+
+int main()
+{
+ test();
+ return 0;
+}

Added: sandbox/msm/libs/msm/doc/HarelWithEntry.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/HarelWithEntry.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,97 @@
+#include <iostream>
+#include <boost/msm/back/state_machine.hpp>
+#include <boost/msm/front/state_machine_def.hpp>
+
+namespace msm = boost::msm;
+
+namespace {
+ // events
+ struct AnyBtnPressed {};
+ struct AlarmBeeps30s {};
+ struct P1 {};
+ struct P2 {};
+ struct P {};
+ // Concrete FSM implementation
+ struct Clock_ : public msm::front::state_machine_def<Clock_>
+ {
+ struct Displays : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "Entering Displays"<< std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "Leaving Displays"<< std::endl;}
+ };
+ struct AlarmBeeps_ : public msm::front::state_machine_def<AlarmBeeps_>
+ {
+ // states
+ struct Alarm1Beeps : public msm::front::state<>, public msm::front::explicit_entry<0>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "Entering Alarm1Beeps"<< std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "Leaving Alarm1Beeps"<< std::endl;}
+ };
+ struct Alarm2Beeps : public msm::front::state<>, public msm::front::explicit_entry<0>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "Entering Alarm2Beeps"<< std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "Leaving Alarm2Beeps"<< std::endl;}
+ };
+ struct BothBeep : public msm::front::state<>, public msm::front::explicit_entry<0>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "Entering BothBeep"<< std::endl;}
+ template <class Event,class FSM>
+ void on_exit(Event const&,FSM& ) {std::cout << "Leaving BothBeep"<< std::endl;}
+ };
+
+ // the initial state of the AlarmBeeps SM. Must be defined. Will not be used as we use only explicit entries
+ typedef mpl::vector< Alarm1Beeps > initial_state;
+ // as we have no transition table, we need to create the states explicitly
+ typedef mpl::vector<Alarm1Beeps,Alarm2Beeps,BothBeep> explicit_creation;
+
+ // Transition table for AlarmBeeps. Can be empty as no transition defined
+ struct transition_table : mpl::vector<> {};
+ };
+ typedef msm::back::state_machine<AlarmBeeps_> AlarmBeeps;
+ // the initial state of the Clock SM. Must be defined
+ typedef Displays initial_state;
+ // Transition table for Clock
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +-----------+-------------+-------------------------+----------+----------------------+
+ _row < Displays , P1 , AlarmBeeps::direct<AlarmBeeps_::Alarm1Beeps> >,
+ _row < Displays , P2 , AlarmBeeps::direct<AlarmBeeps_::Alarm2Beeps> >,
+ _row < Displays , P , AlarmBeeps::direct<AlarmBeeps_::BothBeep> >,
+ _row < AlarmBeeps,AnyBtnPressed, Displays >,
+ _row < AlarmBeeps,AlarmBeeps30s, Displays >
+ // +-----------+-------------+--------------------------+----------+----------------------+
+ > {};
+ };
+ typedef msm::back::state_machine<Clock_> Clock;
+}
+
+void test()
+{
+ Clock sm;
+ sm.start();
+ std::cout << "Sending P1" << std::endl;
+ sm.process_event(P1());
+ std::cout << "Sending AnyBtnPressed" << std::endl;
+ sm.process_event(AnyBtnPressed());
+ std::cout << "Sending P2" << std::endl;
+ sm.process_event(P2());
+ std::cout << "Sending AnyBtnPressed" << std::endl;
+ sm.process_event(AnyBtnPressed());
+ std::cout << "Sending P" << std::endl;
+ sm.process_event(P());
+
+}
+int main()
+{
+ test();
+ return 0;
+}
+
+

Added: sandbox/msm/libs/msm/doc/HarelWithoutEntry.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/HarelWithoutEntry.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,107 @@
+#include <iostream>
+#include <boost/msm/back/state_machine.hpp>
+#include <boost/msm/front/state_machine_def.hpp>
+
+namespace msm = boost::msm;
+
+namespace {
+ // events
+ struct AnyBtnPressed {};
+ struct AlarmBeeps30s {};
+ struct P
+ {
+ P(int id):index(id){}
+ // the bit(s) of the corresponding alarm
+ int index;
+ };
+ // Concrete FSM implementation
+ struct Clock_ : public msm::front::state_machine_def<Clock_>
+ {
+ struct Displays : public msm::front::state<> {};
+ class AlarmBeeps_ : public msm::front::state_machine_def<AlarmBeeps_>
+ {
+ public:
+ template <class Event,class FSM>
+ void on_entry(Event const& evt,FSM& fsm)
+ {
+ // let each orthogonal zone handle the event (can be handled by more than 1)
+ fsm.process_event(evt);
+ }
+
+ template <int Index>
+ struct Alarm_ : public msm::front::state_machine_def<Alarm_<Index> >
+ {
+ struct NoBeep : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "Entering NoBeep:"<< Index << std::endl;}
+ };
+ struct Beeps : public msm::front::state<>
+ {
+ template <class Event,class FSM>
+ void on_entry(Event const&,FSM& ) {std::cout << "Beeping alarm:"<< Index << std::endl;}
+ };
+ typedef Alarm_<Index> A; // makes transition table cleaner
+ // the initial state of the AlarmBeeps SM. Must be defined
+ typedef NoBeep initial_state;
+ // guard
+ bool check_beep(const P& evt)
+ {
+ // check if our bit is set in the event
+ return ((evt.index & Index)!=0);
+ }
+ // Transition table for AlarmBeeps
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +---------+-------------+---------+------------------------+----------------------+
+ g_row < NoBeep , P , Beeps ,&A::check_beep >
+ // +---------+-------------+---------+------------------------+----------------------+
+ > {};
+ };
+ typedef msm::back::state_machine<Alarm_<1> > Alarm1;
+ typedef msm::back::state_machine<Alarm_<2> > Alarm2;
+ // the initial state of the AlarmBeeps SM. Must be defined
+ typedef mpl::vector<Alarm1,Alarm2 > initial_state;
+
+ // Transition table for AlarmBeeps. Can be empty as no transition defined
+ struct transition_table : mpl::vector<> {};
+ };
+ typedef msm::back::state_machine<AlarmBeeps_> AlarmBeeps;
+ // the initial state of the Clock SM. Must be defined
+ typedef Displays initial_state;
+ // Transition table for Clock
+ struct transition_table : mpl::vector<
+ // Start Event Next Action Guard
+ // +-----------+-------------+------------+------------------------+----------------------+
+ _row < Displays , P , AlarmBeeps >,
+ _row < AlarmBeeps,AnyBtnPressed, Displays >,
+ _row < AlarmBeeps,AlarmBeeps30s, Displays >
+ // +-----------+-------------+------------+------------------------+----------------------+
+ > {};
+ };
+ typedef msm::back::state_machine<Clock_> Clock;
+}
+
+void test()
+{
+ Clock sm;
+ sm.start();
+ std::cout << "Sending P(1)" << std::endl;
+ sm.process_event(P(1));
+ std::cout << "Sending AnyBtnPressed" << std::endl;
+ sm.process_event(AnyBtnPressed());
+ std::cout << "Sending P(2)" << std::endl;
+ sm.process_event(P(2));
+ std::cout << "Sending AnyBtnPressed" << std::endl;
+ sm.process_event(AnyBtnPressed());
+ std::cout << "Sending P(3)" << std::endl;
+ sm.process_event(P(3));
+
+}
+int main()
+{
+ test();
+ return 0;
+}
+
+

Deleted: sandbox/msm/libs/msm/doc/HarelWithoutEntryNoTemplateSM.cpp
==============================================================================
--- sandbox/msm/libs/msm/doc/HarelWithoutEntryNoTemplateSM.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
+++ (empty file)
@@ -1,110 +0,0 @@
-#include <vector>
-#include <iostream>
-#include <boost/mpl/vector/vector50.hpp>
-#include <boost/msm/state_machine.hpp>
-
-using namespace boost::msm;
-
-namespace {
- // events
- struct AnyBtnPressed {};
- struct AlarmBeeps30s {};
- struct P
- {
- P(int id):index(id){}
- // the bit(s) of the corresponding alarm
- int index;
- };
- // Concrete FSM implementation
- struct Clock : public state_machine<Clock>
- {
- struct Displays : public state<> {};
- class AlarmBeeps : public state_machine<AlarmBeeps>
- {
- public:
- template <class Event>
- void on_entry(Event const& evt)
- {
- // let each orthogonal zone handle the event (can be handled by more than 1)
- process_event(evt);
- }
- // g++ refuses to compile if the Alarm submachines are template
- struct AlarmImpl : public state_machine<AlarmImpl >
- {
- AlarmImpl(int index):Index(index){}
- struct NoBeep : public state<> {};
- struct Beeps : public state<> {};
- typedef AlarmImpl A; // makes transition table cleaner
- // the initial state of the AlarmBeeps SM. Must be defined
- typedef NoBeep initial_state;
- // guard
- bool check_beep(const P& evt)
- {
- bool beep = ((evt.index & Index)!=0);
- if (beep)
- std::cout << "Beeping alarm:"<< Index << std::endl;
- // check if our bit is set in the event
- return beep;
- }
- // Transition table for Alarm
- struct transition_table : mpl::vector<
- // Start Event Next Action Guard
- // +---------+-------------+---------+------------------------+----------------------+
- g_row < NoBeep , P , Beeps ,&A::check_beep >
- // +---------+-------------+---------+------------------------+----------------------+
- > {};
- private:
- int Index;
- };
- struct Alarm1 : public AlarmImpl
- {
- Alarm1():AlarmImpl(1){}
- };
- struct Alarm2 : public AlarmImpl
- {
- Alarm2():AlarmImpl(2){}
- };
-
- // the initial state of the AlarmBeeps SM. Must be defined
- typedef mpl::vector<Alarm1,Alarm2 > initial_state;
-
- // Transition table for AlarmBeeps. Can be empty as no transition defined
- struct transition_table : mpl::vector<> {};
- };
- // the initial state of the Clock SM. Must be defined
- typedef Displays initial_state;
- // Transition table for Clock
- struct transition_table : mpl::vector<
- // Start Event Next Action Guard
- // +-----------+-------------+------------+------------------------+----------------------+
- _row < Displays , P , AlarmBeeps >,
- _row < AlarmBeeps,AnyBtnPressed, Displays >,
- _row < AlarmBeeps,AlarmBeeps30s, Displays >
- // +-----------+-------------+------------+------------------------+----------------------+
- > {};
- };
-}
-
-void test()
-{
- Clock sm;
- sm.start();
- std::cout << "Sending P(1)" << std::endl;
- sm.process_event(P(1));
- std::cout << "Sending AnyBtnPressed" << std::endl;
- sm.process_event(AnyBtnPressed());
- std::cout << "Sending P(2)" << std::endl;
- sm.process_event(P(2));
- std::cout << "Sending AnyBtnPressed" << std::endl;
- sm.process_event(AnyBtnPressed());
- std::cout << "Sending P(3)" << std::endl;
- sm.process_event(P(3));
-
-}
-int main()
-{
- test();
- return 0;
-}
-
-

Added: sandbox/msm/libs/msm/doc/History.cpp
==============================================================================
--- (empty file)
+++ sandbox/msm/libs/msm/doc/History.cpp 2009-11-09 17:25:04 EST (Mon, 09 Nov 2009)
@@ -0,0 +1,229 @@
+#include <iostream>
+// back-end
+#include <boost/msm/back/state_machine.hpp>
+//front-end
+#include <boost/msm/front/state_machine_def.hpp>
+
+namespace msm = boost::msm;
+
+namespace
+{
+ // events
+ struct play {};
+ struct end_pa