Chris@16
|
1 #ifndef BOOST_STATECHART_EVENT_BASE_HPP_INCLUDED
|
Chris@16
|
2 #define BOOST_STATECHART_EVENT_BASE_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/detail/rtti_policy.hpp>
|
Chris@16
|
12 #include <boost/statechart/detail/counted_base.hpp>
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/assert.hpp>
|
Chris@16
|
15 #include <boost/intrusive_ptr.hpp>
|
Chris@16
|
16 #include <boost/config.hpp>
|
Chris@16
|
17
|
Chris@16
|
18
|
Chris@16
|
19
|
Chris@16
|
20 namespace boost
|
Chris@16
|
21 {
|
Chris@16
|
22 namespace statechart
|
Chris@16
|
23 {
|
Chris@16
|
24 namespace detail
|
Chris@16
|
25 {
|
Chris@16
|
26
|
Chris@16
|
27
|
Chris@16
|
28
|
Chris@16
|
29 // This helper is necessary because there doesn't seem to be consensus among
|
Chris@16
|
30 // compilers on how a friend declaration for a function in another namespace
|
Chris@16
|
31 // has to look like.
|
Chris@16
|
32 class delete_helper
|
Chris@16
|
33 {
|
Chris@16
|
34 public:
|
Chris@16
|
35 template< class T >
|
Chris@16
|
36 static void delete_object( const T * pObject )
|
Chris@16
|
37 {
|
Chris@16
|
38 delete pObject;
|
Chris@16
|
39 }
|
Chris@16
|
40 };
|
Chris@16
|
41
|
Chris@16
|
42
|
Chris@16
|
43
|
Chris@16
|
44 } // namespace detail
|
Chris@16
|
45
|
Chris@16
|
46
|
Chris@16
|
47
|
Chris@16
|
48 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
49 class event_base : public detail::rtti_policy::rtti_base_type<
|
Chris@16
|
50 detail::counted_base<> >
|
Chris@16
|
51 {
|
Chris@16
|
52 typedef detail::rtti_policy::rtti_base_type<
|
Chris@16
|
53 detail::counted_base<> > base_type;
|
Chris@16
|
54 public:
|
Chris@16
|
55 //////////////////////////////////////////////////////////////////////////
|
Chris@16
|
56 intrusive_ptr< const event_base > intrusive_from_this() const;
|
Chris@16
|
57
|
Chris@16
|
58 protected:
|
Chris@16
|
59 //////////////////////////////////////////////////////////////////////////
|
Chris@16
|
60 event_base( detail::rtti_policy::id_provider_type idProvider ) :
|
Chris@16
|
61 base_type( idProvider )
|
Chris@16
|
62 {
|
Chris@16
|
63 }
|
Chris@16
|
64
|
Chris@16
|
65 virtual ~event_base() {}
|
Chris@16
|
66
|
Chris@16
|
67 private:
|
Chris@16
|
68 //////////////////////////////////////////////////////////////////////////
|
Chris@16
|
69 virtual intrusive_ptr< const event_base > clone() const = 0;
|
Chris@16
|
70
|
Chris@16
|
71 friend class detail::delete_helper;
|
Chris@16
|
72 };
|
Chris@16
|
73
|
Chris@16
|
74
|
Chris@16
|
75
|
Chris@16
|
76 #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
|
Chris@16
|
77 } // namespace statechart
|
Chris@16
|
78 #endif
|
Chris@16
|
79
|
Chris@16
|
80
|
Chris@16
|
81
|
Chris@16
|
82 inline void intrusive_ptr_add_ref( const ::boost::statechart::event_base * pBase )
|
Chris@16
|
83 {
|
Chris@16
|
84 pBase->add_ref();
|
Chris@16
|
85 }
|
Chris@16
|
86
|
Chris@16
|
87 inline void intrusive_ptr_release( const ::boost::statechart::event_base * pBase )
|
Chris@16
|
88 {
|
Chris@16
|
89 if ( pBase->release() )
|
Chris@16
|
90 {
|
Chris@16
|
91 ::boost::statechart::detail::delete_helper::delete_object( pBase );
|
Chris@16
|
92 }
|
Chris@16
|
93 }
|
Chris@16
|
94
|
Chris@16
|
95
|
Chris@16
|
96
|
Chris@16
|
97 #ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
|
Chris@16
|
98 } // namespace statechart
|
Chris@16
|
99 #endif
|
Chris@16
|
100 namespace statechart
|
Chris@16
|
101 {
|
Chris@16
|
102
|
Chris@16
|
103
|
Chris@16
|
104
|
Chris@16
|
105 // We're implementing this here so that GCC3.4.2 can find
|
Chris@16
|
106 // intrusive_ptr_add_ref, which is indirectly called from the intrusive_ptr
|
Chris@16
|
107 // ctor.
|
Chris@16
|
108 inline intrusive_ptr< const event_base > event_base::intrusive_from_this() const
|
Chris@16
|
109 {
|
Chris@16
|
110 if ( base_type::ref_counted() )
|
Chris@16
|
111 {
|
Chris@16
|
112 return intrusive_ptr< const event_base >( this );
|
Chris@16
|
113 }
|
Chris@16
|
114 else
|
Chris@16
|
115 {
|
Chris@16
|
116 return clone();
|
Chris@16
|
117 }
|
Chris@16
|
118 }
|
Chris@16
|
119
|
Chris@16
|
120
|
Chris@16
|
121
|
Chris@16
|
122 } // namespace statechart
|
Chris@16
|
123 } // namespace boost
|
Chris@16
|
124
|
Chris@16
|
125
|
Chris@16
|
126
|
Chris@16
|
127 #endif
|