|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r67376 - trunk/boost/msm/back
From: christophe.j.henry_at_[hidden]
Date: 2010-12-20 17:59:19
Author: chenry
Date: 2010-12-20 17:59:17 EST (Mon, 20 Dec 2010)
New Revision: 67376
URL: http://svn.boost.org/trac/boost/changeset/67376
Log:
added possibility to choose the container for the message and deferred events queues
Added:
trunk/boost/msm/back/queue_container_circular.hpp (contents, props changed)
trunk/boost/msm/back/queue_container_deque.hpp (contents, props changed)
Text files modified:
trunk/boost/msm/back/state_machine.hpp | 71 +++++++++++++++++++++++++++++----------
1 files changed, 52 insertions(+), 19 deletions(-)
Added: trunk/boost/msm/back/queue_container_circular.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/msm/back/queue_container_circular.hpp 2010-12-20 17:59:17 EST (Mon, 20 Dec 2010)
@@ -0,0 +1,32 @@
+// 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_QUEUE_CONTAINER_CIRCULAR_H
+#define BOOST_MSM_BACK_QUEUE_CONTAINER_CIRCULAR_H
+
+#include <boost/circular_buffer.hpp>
+
+namespace boost { namespace msm { namespace back
+{
+ struct queue_container_circular
+ {
+ typedef int queue_container_policy;
+
+ template <class Element>
+ struct In
+ {
+ typedef typename boost::circular_buffer<Element> type;
+ };
+ };
+
+} } }//boost::msm::back
+
+
+#endif //BOOST_MSM_BACK_QUEUE_CONTAINER_CIRCULAR_H
Added: trunk/boost/msm/back/queue_container_deque.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/msm/back/queue_container_deque.hpp 2010-12-20 17:59:17 EST (Mon, 20 Dec 2010)
@@ -0,0 +1,32 @@
+// 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_QUEUE_CONTAINER_DEQUE_H
+#define BOOST_MSM_BACK_QUEUE_CONTAINER_DEQUE_H
+
+#include <deque>
+
+namespace boost { namespace msm { namespace back
+{
+ struct queue_container_deque
+ {
+ typedef int queue_container_policy;
+
+ template <class Element>
+ struct In
+ {
+ typedef typename std::deque<Element> type;
+ };
+ };
+
+} } }//boost::msm::back
+
+
+#endif //BOOST_MSM_BACK_QUEUE_CONTAINER_DEQUE_H
Modified: trunk/boost/msm/back/state_machine.hpp
==============================================================================
--- trunk/boost/msm/back/state_machine.hpp (original)
+++ trunk/boost/msm/back/state_machine.hpp 2010-12-20 17:59:17 EST (Mon, 20 Dec 2010)
@@ -13,7 +13,6 @@
#include <exception>
#include <vector>
-#include <queue>
#include <functional>
#include <numeric>
#include <utility>
@@ -63,6 +62,7 @@
#include <boost/msm/back/default_compile_policy.hpp>
#include <boost/msm/back/dispatch_table.hpp>
#include <boost/msm/back/no_fsm_check.hpp>
+#include <boost/msm/back/queue_container_deque.hpp>
BOOST_MPL_HAS_XXX_TRAIT_DEF(accept_sig)
BOOST_MPL_HAS_XXX_TRAIT_DEF(no_automatic_create)
@@ -73,6 +73,7 @@
BOOST_MPL_HAS_XXX_TRAIT_DEF(history_policy)
BOOST_MPL_HAS_XXX_TRAIT_DEF(fsm_check)
BOOST_MPL_HAS_XXX_TRAIT_DEF(compile_policy)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(queue_container_policy)
#ifndef BOOST_MSM_CONSTRUCTOR_ARG_SIZE
#define BOOST_MSM_CONSTRUCTOR_ARG_SIZE 5 // default max number of arguments for constructors
@@ -100,6 +101,7 @@
BOOST_PARAMETER_TEMPLATE_KEYWORD(history_policy)
BOOST_PARAMETER_TEMPLATE_KEYWORD(compile_policy)
BOOST_PARAMETER_TEMPLATE_KEYWORD(fsm_check_policy)
+BOOST_PARAMETER_TEMPLATE_KEYWORD(queue_container_policy)
typedef ::boost::parameter::parameters<
::boost::parameter::required< ::boost::msm::back::tag::front_end >
@@ -112,6 +114,10 @@
, ::boost::parameter::optional<
::boost::parameter::deduced< ::boost::msm::back::tag::fsm_check_policy>, has_fsm_check< ::boost::mpl::_ >
>
+ , ::boost::parameter::optional<
+ ::boost::parameter::deduced< ::boost::msm::back::tag::queue_container_policy>,
+ has_queue_container_policy< ::boost::mpl::_ >
+ >
> state_machine_signature;
@@ -124,16 +130,17 @@
, class A1 = parameter::void_
, class A2 = parameter::void_
, class A3 = parameter::void_
+ , class A4 = parameter::void_
>
class state_machine : //public Derived
public ::boost::parameter::binding<
- typename state_machine_signature::bind<A0,A1,A2,A3>::type, ::boost::msm::back::tag::front_end
+ typename state_machine_signature::bind<A0,A1,A2,A3,A4>::type, ::boost::msm::back::tag::front_end
>::type
{
public:
// Create ArgumentPack
typedef typename
- state_machine_signature::bind<A0,A1,A2,A3>::type
+ state_machine_signature::bind<A0,A1,A2,A3,A4>::type
state_machine_args;
// Extract first logical parameter.
@@ -141,30 +148,36 @@
state_machine_args, ::boost::msm::back::tag::front_end>::type Derived;
typedef typename ::boost::parameter::binding<
- state_machine_args, ::boost::msm::back::tag::history_policy, NoHistory >::type HistoryPolicy;
+ state_machine_args, ::boost::msm::back::tag::history_policy, NoHistory >::type HistoryPolicy;
typedef typename ::boost::parameter::binding<
- state_machine_args, ::boost::msm::back::tag::compile_policy, favor_runtime_speed >::type CompilePolicy;
+ state_machine_args, ::boost::msm::back::tag::compile_policy, favor_runtime_speed >::type CompilePolicy;
typedef typename ::boost::parameter::binding<
- state_machine_args, ::boost::msm::back::tag::fsm_check_policy, no_fsm_check >::type FsmCheckPolicy;
+ state_machine_args, ::boost::msm::back::tag::fsm_check_policy, no_fsm_check >::type FsmCheckPolicy;
+ typedef typename ::boost::parameter::binding<
+ state_machine_args, ::boost::msm::back::tag::queue_container_policy,
+ queue_container_deque >::type QueueContainerPolicy;
private:
typedef boost::msm::back::state_machine<
- A0,A1,A2,A3> library_sm;
+ A0,A1,A2,A3,A4> library_sm;
typedef ::boost::function<
execute_return ()> transition_fct;
typedef ::boost::function<
execute_return () > deferred_fct;
- typedef std::deque<deferred_fct > deferred_events_queue_t;
- typedef std::queue<transition_fct > events_queue_t;
+ typedef typename QueueContainerPolicy::
+ template In<deferred_fct>::type deferred_events_queue_t;
+ typedef typename QueueContainerPolicy::
+ template In<transition_fct>::type events_queue_t;
+
typedef bool (*flag_handler)(library_sm const&);
// all state machines are friend with each other to allow embedding any of them in another fsm
- template <class ,class , class, class
+ template <class ,class , class, class, class
> friend class boost::msm::back::state_machine;
// helper to add, if needed, visitors to all states
@@ -1079,7 +1092,7 @@
&library_sm::process_event;
transition_fct f = ::boost::bind(pf,this,evt);
- m_events_queue.m_events_queue.push(f);
+ m_events_queue.m_events_queue.push_back(f);
}
template <class EventType>
void enqueue_event_helper(EventType const& evt, ::boost::mpl::true_ const &)
@@ -1090,7 +1103,7 @@
void execute_queued_events_helper(::boost::mpl::false_ const &)
{
transition_fct to_call = m_events_queue.m_events_queue.front();
- m_events_queue.m_events_queue.pop();
+ m_events_queue.m_events_queue.pop_front();
to_call();
}
void execute_queued_events_helper(::boost::mpl::true_ const &)
@@ -1119,6 +1132,26 @@
return m_events_queue.m_events_queue.size();
}
+ events_queue_t& get_message_queue()
+ {
+ return m_events_queue.m_events_queue;
+ }
+
+ const events_queue_t& get_message_queue() const
+ {
+ return m_events_queue.m_events_queue;
+ }
+
+ deferred_events_queue_t& get_deferred_queue()
+ {
+ return m_deferred_events_queue;
+ }
+
+ const deferred_events_queue_t& get_deferred_queue() const
+ {
+ return m_deferred_events_queue;
+ }
+
// Getter that returns the current state of the FSM
const int* current_state() const
{
@@ -1323,7 +1356,7 @@
}
// Construct with the default initial states
- state_machine<A0,A1,A2,A3 >()
+ state_machine<A0,A1,A2,A3,A4 >()
:Derived()
,m_events_queue()
,m_deferred_events_queue()
@@ -1341,7 +1374,7 @@
fill_states(this);
}
template <class Expr>
- state_machine<A0,A1,A2,A3 >
+ state_machine<A0,A1,A2,A3,A4 >
(Expr const& expr,typename ::boost::enable_if<typename ::boost::proto::is_expr<Expr>::type >::type* =0)
:Derived()
,m_events_queue()
@@ -1369,7 +1402,7 @@
#define MSM_CONSTRUCTOR_HELPER_EXECUTE_SUB(z, n, unused) ARG ## n t ## n
#define MSM_CONSTRUCTOR_HELPER_EXECUTE(z, n, unused) \
template <BOOST_PP_ENUM_PARAMS(n, class ARG)> \
- state_machine<A0,A1,A2,A3 \
+ state_machine<A0,A1,A2,A3,A4 \
>(BOOST_PP_ENUM(n, MSM_CONSTRUCTOR_HELPER_EXECUTE_SUB, ~ ), \
typename ::boost::disable_if<typename ::boost::proto::is_expr<ARG0>::type >::type* =0 ) \
:Derived(BOOST_PP_ENUM_PARAMS(n,t)) \
@@ -1387,7 +1420,7 @@
fill_states(this); \
} \
template <class Expr,BOOST_PP_ENUM_PARAMS(n, class ARG)> \
- state_machine<A0,A1,A2,A3 \
+ state_machine<A0,A1,A2,A3,A4 \
>(Expr const& expr,BOOST_PP_ENUM(n, MSM_CONSTRUCTOR_HELPER_EXECUTE_SUB, ~ ), \
typename ::boost::enable_if<typename ::boost::proto::is_expr<Expr>::type >::type* =0 ) \
:Derived(BOOST_PP_ENUM_PARAMS(n,t)) \
@@ -1428,7 +1461,7 @@
}
return *this;
}
- state_machine<A0,A1,A2,A3>
+ state_machine<A0,A1,A2,A3,A4>
(library_sm const& rhs)
: Derived(rhs)
{
@@ -1479,7 +1512,7 @@
{
// event has to be put into the queue
transition_fct f = ::boost::bind(pf,this,evt);
- m_events_queue.m_events_queue.push(f);
+ m_events_queue.m_events_queue.push_back(f);
return false;
}
// event can be handled, processing
@@ -2316,7 +2349,7 @@
if (!m_events_queue.m_events_queue.empty())
{
transition_fct to_call = m_events_queue.m_events_queue.front();
- m_events_queue.m_events_queue.pop();
+ m_events_queue.m_events_queue.pop_front();
to_call();
}
}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk