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