Chris@16
|
1 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
2 // (c) Copyright Andreas Huber Doenni 2002-2005, Eric Niebler 2006
|
Chris@16
|
3 // Distributed under the Boost Software License, Version 1.0. (See accompany-
|
Chris@16
|
4 // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
6
|
Chris@16
|
7 #ifndef BOOST_XPRESSIVE_DETAIL_UTILITY_COUNTED_BASE_HPP_EAN_04_16_2006
|
Chris@16
|
8 #define BOOST_XPRESSIVE_DETAIL_UTILITY_COUNTED_BASE_HPP_EAN_04_16_2006
|
Chris@16
|
9
|
Chris@16
|
10 #include <boost/assert.hpp>
|
Chris@16
|
11 #include <boost/checked_delete.hpp>
|
Chris@16
|
12 #include <boost/detail/atomic_count.hpp>
|
Chris@16
|
13
|
Chris@16
|
14 namespace boost { namespace xpressive { namespace detail
|
Chris@16
|
15 {
|
Chris@16
|
16 template<typename Derived>
|
Chris@16
|
17 struct counted_base_access;
|
Chris@16
|
18
|
Chris@16
|
19 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
20 // counted_base
|
Chris@16
|
21 template<typename Derived>
|
Chris@16
|
22 struct counted_base
|
Chris@16
|
23 {
|
Chris@16
|
24 long use_count() const
|
Chris@16
|
25 {
|
Chris@16
|
26 return this->count_;
|
Chris@16
|
27 }
|
Chris@16
|
28
|
Chris@16
|
29 protected:
|
Chris@16
|
30 counted_base()
|
Chris@16
|
31 : count_(0)
|
Chris@16
|
32 {
|
Chris@16
|
33 }
|
Chris@16
|
34
|
Chris@16
|
35 counted_base(counted_base<Derived> const &)
|
Chris@16
|
36 : count_(0)
|
Chris@16
|
37 {
|
Chris@16
|
38 }
|
Chris@16
|
39
|
Chris@16
|
40 counted_base &operator =(counted_base<Derived> const &)
|
Chris@16
|
41 {
|
Chris@16
|
42 return *this;
|
Chris@16
|
43 }
|
Chris@16
|
44
|
Chris@16
|
45 private:
|
Chris@16
|
46 friend struct counted_base_access<Derived>;
|
Chris@16
|
47 mutable boost::detail::atomic_count count_;
|
Chris@16
|
48 };
|
Chris@16
|
49
|
Chris@16
|
50 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
51 // counted_base_access
|
Chris@16
|
52 template<typename Derived>
|
Chris@16
|
53 struct counted_base_access
|
Chris@16
|
54 {
|
Chris@16
|
55 static void add_ref(counted_base<Derived> const *that)
|
Chris@16
|
56 {
|
Chris@16
|
57 ++that->count_;
|
Chris@16
|
58 }
|
Chris@16
|
59
|
Chris@16
|
60 static void release(counted_base<Derived> const *that)
|
Chris@16
|
61 {
|
Chris@16
|
62 BOOST_ASSERT(0 < that->count_);
|
Chris@16
|
63 if(0 == --that->count_)
|
Chris@16
|
64 {
|
Chris@16
|
65 boost::checked_delete(static_cast<Derived const *>(that));
|
Chris@16
|
66 }
|
Chris@16
|
67 }
|
Chris@16
|
68 };
|
Chris@16
|
69
|
Chris@16
|
70 template<typename Derived>
|
Chris@16
|
71 inline void intrusive_ptr_add_ref(counted_base<Derived> const *that)
|
Chris@16
|
72 {
|
Chris@16
|
73 counted_base_access<Derived>::add_ref(that);
|
Chris@16
|
74 }
|
Chris@16
|
75
|
Chris@16
|
76 template<typename Derived>
|
Chris@16
|
77 inline void intrusive_ptr_release(counted_base<Derived> const *that)
|
Chris@16
|
78 {
|
Chris@16
|
79 counted_base_access<Derived>::release(that);
|
Chris@16
|
80 }
|
Chris@16
|
81
|
Chris@16
|
82 }}} // namespace boost::xpressive::detail
|
Chris@16
|
83
|
Chris@16
|
84 #endif
|