1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #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
|