////////////////////////////////////////////////////////////////////////////// | |
// (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 |