Chris@16
|
1 #ifndef BOOST_STATECHART_STATE_HPP_INCLUDED
|
Chris@16
|
2 #define BOOST_STATECHART_STATE_HPP_INCLUDED
|
Chris@16
|
3 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
4 // Copyright 2002-2006 Andreas Huber Doenni
|
Chris@16
|
5 // Distributed under the Boost Software License, Version 1.0. (See accompany-
|
Chris@16
|
6 // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
8
|
Chris@16
|
9
|
Chris@16
|
10
|
Chris@16
|
11 #include <boost/statechart/simple_state.hpp>
|
Chris@16
|
12
|
Chris@16
|
13 #include <boost/mpl/list.hpp>
|
Chris@16
|
14
|
Chris@16
|
15
|
Chris@16
|
16
|
Chris@16
|
17 namespace boost
|
Chris@16
|
18 {
|
Chris@16
|
19 namespace statechart
|
Chris@16
|
20 {
|
Chris@16
|
21
|
Chris@16
|
22
|
Chris@16
|
23
|
Chris@16
|
24 template< class MostDerived,
|
Chris@16
|
25 class Context,
|
Chris@16
|
26 class InnerInitial = mpl::list<>,
|
Chris@16
|
27 history_mode historyMode = has_no_history >
|
Chris@16
|
28 class state : public simple_state<
|
Chris@16
|
29 MostDerived, Context, InnerInitial, historyMode >
|
Chris@16
|
30 {
|
Chris@16
|
31 typedef simple_state< MostDerived, Context, InnerInitial, historyMode >
|
Chris@16
|
32 base_type;
|
Chris@16
|
33
|
Chris@16
|
34 protected:
|
Chris@16
|
35 //////////////////////////////////////////////////////////////////////////
|
Chris@16
|
36 struct my_context
|
Chris@16
|
37 {
|
Chris@16
|
38 my_context( typename base_type::context_ptr_type pContext ) :
|
Chris@16
|
39 pContext_( pContext )
|
Chris@16
|
40 {
|
Chris@16
|
41 }
|
Chris@16
|
42
|
Chris@16
|
43 typename base_type::context_ptr_type pContext_;
|
Chris@16
|
44 };
|
Chris@16
|
45
|
Chris@16
|
46 typedef state my_base;
|
Chris@16
|
47
|
Chris@16
|
48 state( my_context ctx )
|
Chris@16
|
49 {
|
Chris@16
|
50 this->set_context( ctx.pContext_ );
|
Chris@16
|
51 }
|
Chris@16
|
52
|
Chris@16
|
53 ~state() {}
|
Chris@16
|
54
|
Chris@16
|
55 public:
|
Chris@16
|
56 //////////////////////////////////////////////////////////////////////////
|
Chris@16
|
57 // The following declarations should be private.
|
Chris@16
|
58 // They are only public because many compilers lack template friends.
|
Chris@16
|
59 //////////////////////////////////////////////////////////////////////////
|
Chris@16
|
60 // See base class for documentation
|
Chris@16
|
61 typedef typename base_type::outermost_context_base_type
|
Chris@16
|
62 outermost_context_base_type;
|
Chris@16
|
63 typedef typename base_type::inner_context_ptr_type inner_context_ptr_type;
|
Chris@16
|
64 typedef typename base_type::context_ptr_type context_ptr_type;
|
Chris@16
|
65 typedef typename base_type::inner_initial_list inner_initial_list;
|
Chris@16
|
66
|
Chris@16
|
67 static void initial_deep_construct(
|
Chris@16
|
68 outermost_context_base_type & outermostContextBase )
|
Chris@16
|
69 {
|
Chris@16
|
70 deep_construct( &outermostContextBase, outermostContextBase );
|
Chris@16
|
71 }
|
Chris@16
|
72
|
Chris@16
|
73 // See base class for documentation
|
Chris@16
|
74 static void deep_construct(
|
Chris@16
|
75 const context_ptr_type & pContext,
|
Chris@16
|
76 outermost_context_base_type & outermostContextBase )
|
Chris@16
|
77 {
|
Chris@16
|
78 const inner_context_ptr_type pInnerContext(
|
Chris@16
|
79 shallow_construct( pContext, outermostContextBase ) );
|
Chris@16
|
80 base_type::template deep_construct_inner< inner_initial_list >(
|
Chris@16
|
81 pInnerContext, outermostContextBase );
|
Chris@16
|
82 }
|
Chris@16
|
83
|
Chris@16
|
84 static inner_context_ptr_type shallow_construct(
|
Chris@16
|
85 const context_ptr_type & pContext,
|
Chris@16
|
86 outermost_context_base_type & outermostContextBase )
|
Chris@16
|
87 {
|
Chris@16
|
88 const inner_context_ptr_type pInnerContext(
|
Chris@16
|
89 new MostDerived( my_context( pContext ) ) );
|
Chris@16
|
90 outermostContextBase.add( pInnerContext );
|
Chris@16
|
91 return pInnerContext;
|
Chris@16
|
92 }
|
Chris@16
|
93 };
|
Chris@16
|
94
|
Chris@16
|
95
|
Chris@16
|
96
|
Chris@16
|
97 } // namespace statechart
|
Chris@16
|
98 } // namespace boost
|
Chris@16
|
99
|
Chris@16
|
100
|
Chris@16
|
101
|
Chris@16
|
102 #endif
|