| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #ifndef BOOST_STATECHART_DETAIL_COUNTED_BASE_HPP_INCLUDED
- #define BOOST_STATECHART_DETAIL_COUNTED_BASE_HPP_INCLUDED
- //////////////////////////////////////////////////////////////////////////////
- // Copyright 2002-2006 Andreas Huber Doenni
- // 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)
- //////////////////////////////////////////////////////////////////////////////
- #include <boost/detail/atomic_count.hpp>
- #include <boost/config.hpp> // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
- namespace boost
- {
- namespace statechart
- {
- namespace detail
- {
-
- template< bool NeedsLocking >
- struct count_base
- {
- count_base() : count_( 0 ) {}
- mutable boost::detail::atomic_count count_;
- };
- template<>
- struct count_base< false >
- {
- count_base() : count_( 0 ) {}
- mutable long count_;
- };
- //////////////////////////////////////////////////////////////////////////////
- template< bool NeedsLocking = true >
- class counted_base : private count_base< NeedsLocking >
- {
- typedef count_base< NeedsLocking > base_type;
- public:
- //////////////////////////////////////////////////////////////////////////
- bool ref_counted() const
- {
- return base_type::count_ != 0;
- }
- long ref_count() const
- {
- return base_type::count_;
- }
- protected:
- //////////////////////////////////////////////////////////////////////////
- counted_base() {}
- ~counted_base() {}
- // do nothing copy implementation is intentional (the number of
- // referencing pointers of the source and the destination is not changed
- // through the copy operation)
- counted_base( const counted_base & ) : base_type() {}
- counted_base & operator=( const counted_base & ) { return *this; }
- public:
- //////////////////////////////////////////////////////////////////////////
- // The following declarations should be private.
- // They are only public because many compilers lack template friends.
- //////////////////////////////////////////////////////////////////////////
- void add_ref() const
- {
- ++base_type::count_;
- }
- bool release() const
- {
- BOOST_ASSERT( base_type::count_ > 0 );
- return --base_type::count_ == 0;
- }
- };
- } // namespace detail
- } // namespace statechart
- } // namespace boost
- #endif
|