]> git.sesse.net Git - casparcg/blob - dependencies/boost/boost/xpressive/detail/utility/counted_base.hpp
Manually merged pull request #222
[casparcg] / dependencies / boost / 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