You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
84 lines
2.3 KiB
84 lines
2.3 KiB
////////////////////////////////////////////////////////////////////////////// |
|
// (c) Copyright Andreas Huber Doenni 2002-2005, Eric Niebler 2006 |
|
// Distributed under the Boost Software License, Version 1.0. (See accompany- |
|
// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
#ifndef BOOST_XPRESSIVE_DETAIL_UTILITY_COUNTED_BASE_HPP_EAN_04_16_2006 |
|
#define BOOST_XPRESSIVE_DETAIL_UTILITY_COUNTED_BASE_HPP_EAN_04_16_2006 |
|
|
|
#include <boost/assert.hpp> |
|
#include <boost/checked_delete.hpp> |
|
#include <boost/detail/atomic_count.hpp> |
|
|
|
namespace boost { namespace xpressive { namespace detail |
|
{ |
|
template<typename Derived> |
|
struct counted_base_access; |
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
// counted_base |
|
template<typename Derived> |
|
struct counted_base |
|
{ |
|
long use_count() const |
|
{ |
|
return this->count_; |
|
} |
|
|
|
protected: |
|
counted_base() |
|
: count_(0) |
|
{ |
|
} |
|
|
|
counted_base(counted_base<Derived> const &) |
|
: count_(0) |
|
{ |
|
} |
|
|
|
counted_base &operator =(counted_base<Derived> const &) |
|
{ |
|
return *this; |
|
} |
|
|
|
private: |
|
friend struct counted_base_access<Derived>; |
|
mutable boost::detail::atomic_count count_; |
|
}; |
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
// counted_base_access |
|
template<typename Derived> |
|
struct counted_base_access |
|
{ |
|
static void add_ref(counted_base<Derived> const *that) |
|
{ |
|
++that->count_; |
|
} |
|
|
|
static void release(counted_base<Derived> const *that) |
|
{ |
|
BOOST_ASSERT(0 < that->count_); |
|
if(0 == --that->count_) |
|
{ |
|
boost::checked_delete(static_cast<Derived const *>(that)); |
|
} |
|
} |
|
}; |
|
|
|
template<typename Derived> |
|
inline void intrusive_ptr_add_ref(counted_base<Derived> const *that) |
|
{ |
|
counted_base_access<Derived>::add_ref(that); |
|
} |
|
|
|
template<typename Derived> |
|
inline void intrusive_ptr_release(counted_base<Derived> const *that) |
|
{ |
|
counted_base_access<Derived>::release(that); |
|
} |
|
|
|
}}} // namespace boost::xpressive::detail |
|
|
|
#endif
|
|
|