You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.1 KiB
149 lines
3.1 KiB
#ifndef BOOST_SMART_PTR_DETAIL_LOCAL_COUNTED_BASE_HPP_INCLUDED
|
|
#define BOOST_SMART_PTR_DETAIL_LOCAL_COUNTED_BASE_HPP_INCLUDED
|
|
|
|
// MS compatible compilers support #pragma once
|
|
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|
# pragma once
|
|
#endif
|
|
|
|
// detail/local_counted_base.hpp
|
|
//
|
|
// Copyright 2017 Peter Dimov
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See
|
|
// accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
// See http://www.boost.org/libs/smart_ptr/ for documentation.
|
|
|
|
#include <boost/smart_ptr/detail/shared_count.hpp>
|
|
#include <boost/config.hpp>
|
|
#include <utility>
|
|
|
|
namespace boost
|
|
{
|
|
|
|
namespace detail
|
|
{
|
|
|
|
class BOOST_SYMBOL_VISIBLE local_counted_base
|
|
{
|
|
private:
|
|
|
|
local_counted_base & operator= ( local_counted_base const & );
|
|
|
|
private:
|
|
|
|
// not 'int' or 'unsigned' to avoid aliasing and enable optimizations
|
|
enum count_type { min_ = 0, initial_ = 1, max_ = 2147483647 };
|
|
|
|
count_type local_use_count_;
|
|
|
|
public:
|
|
|
|
BOOST_CONSTEXPR local_counted_base() BOOST_SP_NOEXCEPT: local_use_count_( initial_ )
|
|
{
|
|
}
|
|
|
|
BOOST_CONSTEXPR local_counted_base( local_counted_base const & ) BOOST_SP_NOEXCEPT: local_use_count_( initial_ )
|
|
{
|
|
}
|
|
|
|
virtual ~local_counted_base() /*BOOST_SP_NOEXCEPT*/
|
|
{
|
|
}
|
|
|
|
virtual void local_cb_destroy() BOOST_SP_NOEXCEPT = 0;
|
|
|
|
virtual boost::detail::shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT = 0;
|
|
|
|
void add_ref() BOOST_SP_NOEXCEPT
|
|
{
|
|
#if !defined(__NVCC__)
|
|
#if defined( __has_builtin )
|
|
# if __has_builtin( __builtin_assume )
|
|
|
|
__builtin_assume( local_use_count_ >= 1 );
|
|
|
|
# endif
|
|
#endif
|
|
#endif
|
|
|
|
local_use_count_ = static_cast<count_type>( local_use_count_ + 1 );
|
|
}
|
|
|
|
void release() BOOST_SP_NOEXCEPT
|
|
{
|
|
local_use_count_ = static_cast<count_type>( local_use_count_ - 1 );
|
|
|
|
if( local_use_count_ == 0 )
|
|
{
|
|
local_cb_destroy();
|
|
}
|
|
}
|
|
|
|
long local_use_count() const BOOST_SP_NOEXCEPT
|
|
{
|
|
return local_use_count_;
|
|
}
|
|
};
|
|
|
|
class BOOST_SYMBOL_VISIBLE local_counted_impl: public local_counted_base
|
|
{
|
|
private:
|
|
|
|
local_counted_impl( local_counted_impl const & );
|
|
|
|
private:
|
|
|
|
shared_count pn_;
|
|
|
|
public:
|
|
|
|
explicit local_counted_impl( shared_count const& pn ) BOOST_SP_NOEXCEPT: pn_( pn )
|
|
{
|
|
}
|
|
|
|
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
|
|
|
|
explicit local_counted_impl( shared_count && pn ) BOOST_SP_NOEXCEPT: pn_( std::move(pn) )
|
|
{
|
|
}
|
|
|
|
#endif
|
|
|
|
void local_cb_destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
boost::detail::shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT BOOST_OVERRIDE
|
|
{
|
|
return pn_;
|
|
}
|
|
};
|
|
|
|
class BOOST_SYMBOL_VISIBLE local_counted_impl_em: public local_counted_base
|
|
{
|
|
public:
|
|
|
|
shared_count pn_;
|
|
|
|
void local_cb_destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
|
|
{
|
|
shared_count().swap( pn_ );
|
|
}
|
|
|
|
boost::detail::shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT BOOST_OVERRIDE
|
|
{
|
|
return pn_;
|
|
}
|
|
};
|
|
|
|
} // namespace detail
|
|
|
|
} // namespace boost
|
|
|
|
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LOCAL_COUNTED_BASE_HPP_INCLUDED
|