Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // (c) Copyright Andreas Huber Doenni 2002-2005, Eric Niebler 2006 Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompany- Chris@16: // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: #ifndef BOOST_XPRESSIVE_DETAIL_UTILITY_COUNTED_BASE_HPP_EAN_04_16_2006 Chris@16: #define BOOST_XPRESSIVE_DETAIL_UTILITY_COUNTED_BASE_HPP_EAN_04_16_2006 Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace xpressive { namespace detail Chris@16: { Chris@16: template Chris@16: struct counted_base_access; Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // counted_base Chris@16: template Chris@16: struct counted_base Chris@16: { Chris@16: long use_count() const Chris@16: { Chris@16: return this->count_; Chris@16: } Chris@16: Chris@16: protected: Chris@16: counted_base() Chris@16: : count_(0) Chris@16: { Chris@16: } Chris@16: Chris@16: counted_base(counted_base const &) Chris@16: : count_(0) Chris@16: { Chris@16: } Chris@16: Chris@16: counted_base &operator =(counted_base const &) Chris@16: { Chris@16: return *this; Chris@16: } Chris@16: Chris@16: private: Chris@16: friend struct counted_base_access; Chris@16: mutable boost::detail::atomic_count count_; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // counted_base_access Chris@16: template Chris@16: struct counted_base_access Chris@16: { Chris@16: static void add_ref(counted_base const *that) Chris@16: { Chris@16: ++that->count_; Chris@16: } Chris@16: Chris@16: static void release(counted_base const *that) Chris@16: { Chris@16: BOOST_ASSERT(0 < that->count_); Chris@16: if(0 == --that->count_) Chris@16: { Chris@16: boost::checked_delete(static_cast(that)); Chris@16: } Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: inline void intrusive_ptr_add_ref(counted_base const *that) Chris@16: { Chris@16: counted_base_access::add_ref(that); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void intrusive_ptr_release(counted_base const *that) Chris@16: { Chris@16: counted_base_access::release(that); Chris@16: } Chris@16: Chris@16: }}} // namespace boost::xpressive::detail Chris@16: Chris@16: #endif