mirror of
https://github.com/boostorg/smart_ptr.git
synced 2025-10-05 04:01:04 +02:00
Compare commits
13 Commits
boost-1.46
...
boost-1.48
Author | SHA1 | Date | |
---|---|---|---|
|
6a51cba06a | ||
|
7b097467d6 | ||
|
7cb040edb0 | ||
|
d6ac116b71 | ||
|
8abc8889d1 | ||
|
c5b47e2136 | ||
|
7c0815c567 | ||
|
210288f02e | ||
|
cf7b6904e8 | ||
|
b978919dd1 | ||
|
1086aff971 | ||
|
445e8d1728 | ||
|
545745d649 |
@@ -1,3 +1,6 @@
|
|||||||
|
#ifndef BOOST_SMART_PTR_HPP_INCLUDED
|
||||||
|
#define BOOST_SMART_PTR_HPP_INCLUDED
|
||||||
|
|
||||||
//
|
//
|
||||||
// smart_ptr.hpp
|
// smart_ptr.hpp
|
||||||
//
|
//
|
||||||
@@ -22,4 +25,7 @@
|
|||||||
# include <boost/weak_ptr.hpp>
|
# include <boost/weak_ptr.hpp>
|
||||||
# include <boost/intrusive_ptr.hpp>
|
# include <boost/intrusive_ptr.hpp>
|
||||||
# include <boost/enable_shared_from_this.hpp>
|
# include <boost/enable_shared_from_this.hpp>
|
||||||
|
# include <boost/make_shared.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif // #ifndef BOOST_SMART_PTR_HPP_INCLUDED
|
||||||
|
@@ -52,6 +52,10 @@ int const weak_count_id = 0x298C38A4;
|
|||||||
|
|
||||||
struct sp_nothrow_tag {};
|
struct sp_nothrow_tag {};
|
||||||
|
|
||||||
|
template< class D > struct sp_inplace_tag
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
class weak_count;
|
class weak_count;
|
||||||
|
|
||||||
class shared_count
|
class shared_count
|
||||||
@@ -142,6 +146,40 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
|
||||||
|
|
||||||
|
template< class P, class D > shared_count( P p, sp_inplace_tag<D> ): pi_( 0 )
|
||||||
|
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
|
||||||
|
, id_(shared_count_id)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
#ifndef BOOST_NO_EXCEPTIONS
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
pi_ = new sp_counted_impl_pd< P, D >( p );
|
||||||
|
}
|
||||||
|
catch( ... )
|
||||||
|
{
|
||||||
|
D()( p ); // delete p
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
pi_ = new sp_counted_impl_pd< P, D >( p );
|
||||||
|
|
||||||
|
if( pi_ == 0 )
|
||||||
|
{
|
||||||
|
D()( p ); // delete p
|
||||||
|
boost::throw_exception( std::bad_alloc() );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // #ifndef BOOST_NO_EXCEPTIONS
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
|
||||||
|
|
||||||
template<class P, class D, class A> shared_count( P p, D d, A a ): pi_( 0 )
|
template<class P, class D, class A> shared_count( P p, D d, A a ): pi_( 0 )
|
||||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
|
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
|
||||||
, id_(shared_count_id)
|
, id_(shared_count_id)
|
||||||
@@ -188,6 +226,56 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
|
||||||
|
|
||||||
|
template< class P, class D, class A > shared_count( P p, sp_inplace_tag< D >, A a ): pi_( 0 )
|
||||||
|
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
|
||||||
|
, id_(shared_count_id)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
typedef sp_counted_impl_pda< P, D, A > impl_type;
|
||||||
|
typedef typename A::template rebind< impl_type >::other A2;
|
||||||
|
|
||||||
|
A2 a2( a );
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_EXCEPTIONS
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) );
|
||||||
|
new( static_cast< void* >( pi_ ) ) impl_type( p, a );
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
D()( p );
|
||||||
|
|
||||||
|
if( pi_ != 0 )
|
||||||
|
{
|
||||||
|
a2.deallocate( static_cast< impl_type* >( pi_ ), 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) );
|
||||||
|
|
||||||
|
if( pi_ != 0 )
|
||||||
|
{
|
||||||
|
new( static_cast< void* >( pi_ ) ) impl_type( p, a );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
D()( p );
|
||||||
|
boost::throw_exception( std::bad_alloc() );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // #ifndef BOOST_NO_EXCEPTIONS
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
|
||||||
|
|
||||||
#ifndef BOOST_NO_AUTO_PTR
|
#ifndef BOOST_NO_AUTO_PTR
|
||||||
|
|
||||||
// auto_ptr<Y> is special cased to provide the strong guarantee
|
// auto_ptr<Y> is special cased to provide the strong guarantee
|
||||||
|
@@ -37,9 +37,12 @@ inline void atomic_increment( int * pw )
|
|||||||
__asm__ __volatile__
|
__asm__ __volatile__
|
||||||
(
|
(
|
||||||
"0:\n\t"
|
"0:\n\t"
|
||||||
|
".set push\n\t"
|
||||||
|
".set mips2\n\t"
|
||||||
"ll %0, %1\n\t"
|
"ll %0, %1\n\t"
|
||||||
"addiu %0, 1\n\t"
|
"addiu %0, 1\n\t"
|
||||||
"sc %0, %1\n\t"
|
"sc %0, %1\n\t"
|
||||||
|
".set pop\n\t"
|
||||||
"beqz %0, 0b":
|
"beqz %0, 0b":
|
||||||
"=&r"( tmp ), "=m"( *pw ):
|
"=&r"( tmp ), "=m"( *pw ):
|
||||||
"m"( *pw )
|
"m"( *pw )
|
||||||
@@ -55,9 +58,12 @@ inline int atomic_decrement( int * pw )
|
|||||||
__asm__ __volatile__
|
__asm__ __volatile__
|
||||||
(
|
(
|
||||||
"0:\n\t"
|
"0:\n\t"
|
||||||
|
".set push\n\t"
|
||||||
|
".set mips2\n\t"
|
||||||
"ll %1, %2\n\t"
|
"ll %1, %2\n\t"
|
||||||
"addiu %0, %1, -1\n\t"
|
"addiu %0, %1, -1\n\t"
|
||||||
"sc %0, %2\n\t"
|
"sc %0, %2\n\t"
|
||||||
|
".set pop\n\t"
|
||||||
"beqz %0, 0b\n\t"
|
"beqz %0, 0b\n\t"
|
||||||
"addiu %0, %1, -1":
|
"addiu %0, %1, -1":
|
||||||
"=&r"( rv ), "=&r"( tmp ), "=m"( *pw ):
|
"=&r"( rv ), "=&r"( tmp ), "=m"( *pw ):
|
||||||
@@ -78,10 +84,13 @@ inline int atomic_conditional_increment( int * pw )
|
|||||||
__asm__ __volatile__
|
__asm__ __volatile__
|
||||||
(
|
(
|
||||||
"0:\n\t"
|
"0:\n\t"
|
||||||
|
".set push\n\t"
|
||||||
|
".set mips2\n\t"
|
||||||
"ll %0, %2\n\t"
|
"ll %0, %2\n\t"
|
||||||
"beqz %0, 1f\n\t"
|
"beqz %0, 1f\n\t"
|
||||||
"addiu %1, %0, 1\n\t"
|
"addiu %1, %0, 1\n\t"
|
||||||
"sc %1, %2\n\t"
|
"sc %1, %2\n\t"
|
||||||
|
".set pop\n\t"
|
||||||
"beqz %1, 0b\n\t"
|
"beqz %1, 0b\n\t"
|
||||||
"addiu %0, %0, 1\n\t"
|
"addiu %0, %0, 1\n\t"
|
||||||
"1:":
|
"1:":
|
||||||
|
@@ -135,7 +135,11 @@ public:
|
|||||||
|
|
||||||
// pre: d(p) must not throw
|
// pre: d(p) must not throw
|
||||||
|
|
||||||
sp_counted_impl_pd( P p, D d ): ptr(p), del(d)
|
sp_counted_impl_pd( P p, D & d ): ptr( p ), del( d )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
sp_counted_impl_pd( P p ): ptr( p ), del()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,7 +199,11 @@ public:
|
|||||||
|
|
||||||
// pre: d( p ) must not throw
|
// pre: d( p ) must not throw
|
||||||
|
|
||||||
sp_counted_impl_pda( P p, D d, A a ): p_( p ), d_( d ), a_( a )
|
sp_counted_impl_pda( P p, D & d, A a ): p_( p ), d_( d ), a_( a )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
sp_counted_impl_pda( P p, A a ): p_( p ), d_(), a_( a )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,7 +20,7 @@
|
|||||||
// are available.
|
// are available.
|
||||||
//
|
//
|
||||||
|
|
||||||
#if defined(__GNUC__) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 )
|
#if defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 ) && !defined( BOOST_SP_NO_SYNC )
|
||||||
|
|
||||||
#define BOOST_SP_HAS_SYNC
|
#define BOOST_SP_HAS_SYNC
|
||||||
|
|
||||||
@@ -36,6 +36,10 @@
|
|||||||
#undef BOOST_SP_HAS_SYNC
|
#undef BOOST_SP_HAS_SYNC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined( __sh__ )
|
||||||
|
#undef BOOST_SP_HAS_SYNC
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined( __sparc__ )
|
#if defined( __sparc__ )
|
||||||
#undef BOOST_SP_HAS_SYNC
|
#undef BOOST_SP_HAS_SYNC
|
||||||
#endif
|
#endif
|
||||||
|
@@ -31,7 +31,10 @@
|
|||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
#include <boost/smart_ptr/detail/sp_has_sync.hpp>
|
#include <boost/smart_ptr/detail/sp_has_sync.hpp>
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined( __arm__ ) && !defined( __thumb__ )
|
#if defined( BOOST_SP_USE_PTHREADS )
|
||||||
|
# include <boost/smart_ptr/detail/spinlock_pt.hpp>
|
||||||
|
|
||||||
|
#elif defined(__GNUC__) && defined( __arm__ ) && !defined( __thumb__ )
|
||||||
# include <boost/smart_ptr/detail/spinlock_gcc_arm.hpp>
|
# include <boost/smart_ptr/detail/spinlock_gcc_arm.hpp>
|
||||||
|
|
||||||
#elif defined( BOOST_SP_HAS_SYNC )
|
#elif defined( BOOST_SP_HAS_SYNC )
|
||||||
|
@@ -41,7 +41,11 @@ public:
|
|||||||
|
|
||||||
static spinlock & spinlock_for( void const * pv )
|
static spinlock & spinlock_for( void const * pv )
|
||||||
{
|
{
|
||||||
|
#if defined(__VMS) && __INITIAL_POINTER_SIZE == 64
|
||||||
|
std::size_t i = reinterpret_cast< unsigned long long >( pv ) % 41;
|
||||||
|
#else
|
||||||
std::size_t i = reinterpret_cast< std::size_t >( pv ) % 41;
|
std::size_t i = reinterpret_cast< std::size_t >( pv ) % 41;
|
||||||
|
#endif
|
||||||
return pool_[ i ];
|
return pool_[ i ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,11 +15,6 @@
|
|||||||
|
|
||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
|
|
||||||
#ifdef BOOST_MSVC // moved here to work around VC++ compiler crash
|
|
||||||
# pragma warning(push)
|
|
||||||
# pragma warning(disable:4284) // odd return type for operator->
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/detail/workaround.hpp>
|
#include <boost/detail/workaround.hpp>
|
||||||
#include <boost/smart_ptr/detail/sp_convertible.hpp>
|
#include <boost/smart_ptr/detail/sp_convertible.hpp>
|
||||||
@@ -292,8 +287,4 @@ template<class E, class T, class Y> std::basic_ostream<E, T> & operator<< (std::
|
|||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#ifdef BOOST_MSVC
|
|
||||||
# pragma warning(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // #ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
|
#endif // #ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
|
||||||
|
@@ -49,7 +49,18 @@ private:
|
|||||||
{
|
{
|
||||||
if( initialized_ )
|
if( initialized_ )
|
||||||
{
|
{
|
||||||
|
#if defined( __GNUC__ )
|
||||||
|
|
||||||
|
// fixes incorrect aliasing warning
|
||||||
|
T * p = reinterpret_cast< T* >( storage_.data_ );
|
||||||
|
p->~T();
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
reinterpret_cast< T* >( storage_.data_ )->~T();
|
reinterpret_cast< T* >( storage_.data_ )->~T();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
initialized_ = false;
|
initialized_ = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,13 +108,19 @@ template< class T > T&& sp_forward( T & t )
|
|||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
|
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
|
||||||
|
# define BOOST_SP_MSD( T ) boost::detail::sp_inplace_tag< boost::detail::sp_ms_deleter< T > >()
|
||||||
|
#else
|
||||||
|
# define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
|
||||||
|
#endif
|
||||||
|
|
||||||
// Zero-argument versions
|
// Zero-argument versions
|
||||||
//
|
//
|
||||||
// Used even when variadic templates are available because of the new T() vs new T issue
|
// Used even when variadic templates are available because of the new T() vs new T issue
|
||||||
|
|
||||||
template< class T > boost::shared_ptr< T > make_shared()
|
template< class T > boost::shared_ptr< T > make_shared()
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -120,7 +137,7 @@ template< class T > boost::shared_ptr< T > make_shared()
|
|||||||
|
|
||||||
template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a )
|
template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -141,7 +158,7 @@ template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a
|
|||||||
|
|
||||||
template< class T, class Arg1, class... Args > boost::shared_ptr< T > make_shared( Arg1 && arg1, Args && ... args )
|
template< class T, class Arg1, class... Args > boost::shared_ptr< T > make_shared( Arg1 && arg1, Args && ... args )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -158,7 +175,7 @@ template< class T, class Arg1, class... Args > boost::shared_ptr< T > make_share
|
|||||||
|
|
||||||
template< class T, class A, class Arg1, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Arg1 && arg1, Args && ... args )
|
template< class T, class A, class Arg1, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Arg1 && arg1, Args && ... args )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -173,6 +190,460 @@ template< class T, class A, class Arg1, class... Args > boost::shared_ptr< T > a
|
|||||||
return boost::shared_ptr< T >( pt, pt2 );
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined( BOOST_HAS_RVALUE_REFS )
|
||||||
|
|
||||||
|
// For example MSVC 10.0
|
||||||
|
|
||||||
|
template< class T, class A1 >
|
||||||
|
boost::shared_ptr< T > make_shared( A1 && a1 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A, class A1 >
|
||||||
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A1, class A2 >
|
||||||
|
boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A, class A1, class A2 >
|
||||||
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A1, class A2, class A3 >
|
||||||
|
boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A, class A1, class A2, class A3 >
|
||||||
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A1, class A2, class A3, class A4 >
|
||||||
|
boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A, class A1, class A2, class A3, class A4 >
|
||||||
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A1, class A2, class A3, class A4, class A5 >
|
||||||
|
boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 ),
|
||||||
|
boost::detail::sp_forward<A5>( a5 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
|
||||||
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 ),
|
||||||
|
boost::detail::sp_forward<A5>( a5 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
|
||||||
|
boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 ),
|
||||||
|
boost::detail::sp_forward<A5>( a5 ),
|
||||||
|
boost::detail::sp_forward<A6>( a6 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
|
||||||
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 ),
|
||||||
|
boost::detail::sp_forward<A5>( a5 ),
|
||||||
|
boost::detail::sp_forward<A6>( a6 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
|
||||||
|
boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 ),
|
||||||
|
boost::detail::sp_forward<A5>( a5 ),
|
||||||
|
boost::detail::sp_forward<A6>( a6 ),
|
||||||
|
boost::detail::sp_forward<A7>( a7 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
|
||||||
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 ),
|
||||||
|
boost::detail::sp_forward<A5>( a5 ),
|
||||||
|
boost::detail::sp_forward<A6>( a6 ),
|
||||||
|
boost::detail::sp_forward<A7>( a7 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
|
||||||
|
boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 ),
|
||||||
|
boost::detail::sp_forward<A5>( a5 ),
|
||||||
|
boost::detail::sp_forward<A6>( a6 ),
|
||||||
|
boost::detail::sp_forward<A7>( a7 ),
|
||||||
|
boost::detail::sp_forward<A8>( a8 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
|
||||||
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 ),
|
||||||
|
boost::detail::sp_forward<A5>( a5 ),
|
||||||
|
boost::detail::sp_forward<A6>( a6 ),
|
||||||
|
boost::detail::sp_forward<A7>( a7 ),
|
||||||
|
boost::detail::sp_forward<A8>( a8 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
|
||||||
|
boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 ),
|
||||||
|
boost::detail::sp_forward<A5>( a5 ),
|
||||||
|
boost::detail::sp_forward<A6>( a6 ),
|
||||||
|
boost::detail::sp_forward<A7>( a7 ),
|
||||||
|
boost::detail::sp_forward<A8>( a8 ),
|
||||||
|
boost::detail::sp_forward<A9>( a9 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
|
||||||
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
|
||||||
|
{
|
||||||
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
|
void * pv = pd->address();
|
||||||
|
|
||||||
|
::new( pv ) T(
|
||||||
|
boost::detail::sp_forward<A1>( a1 ),
|
||||||
|
boost::detail::sp_forward<A2>( a2 ),
|
||||||
|
boost::detail::sp_forward<A3>( a3 ),
|
||||||
|
boost::detail::sp_forward<A4>( a4 ),
|
||||||
|
boost::detail::sp_forward<A5>( a5 ),
|
||||||
|
boost::detail::sp_forward<A6>( a6 ),
|
||||||
|
boost::detail::sp_forward<A7>( a7 ),
|
||||||
|
boost::detail::sp_forward<A8>( a8 ),
|
||||||
|
boost::detail::sp_forward<A9>( a9 )
|
||||||
|
);
|
||||||
|
|
||||||
|
pd->set_initialized();
|
||||||
|
|
||||||
|
T * pt2 = static_cast< T* >( pv );
|
||||||
|
|
||||||
|
boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
|
||||||
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// C++03 version
|
// C++03 version
|
||||||
@@ -180,7 +651,7 @@ template< class T, class A, class Arg1, class... Args > boost::shared_ptr< T > a
|
|||||||
template< class T, class A1 >
|
template< class T, class A1 >
|
||||||
boost::shared_ptr< T > make_shared( A1 const & a1 )
|
boost::shared_ptr< T > make_shared( A1 const & a1 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -198,7 +669,7 @@ boost::shared_ptr< T > make_shared( A1 const & a1 )
|
|||||||
template< class T, class A, class A1 >
|
template< class T, class A, class A1 >
|
||||||
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1 )
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -216,7 +687,7 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1 )
|
|||||||
template< class T, class A1, class A2 >
|
template< class T, class A1, class A2 >
|
||||||
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2 )
|
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -234,7 +705,7 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2 )
|
|||||||
template< class T, class A, class A1, class A2 >
|
template< class T, class A, class A1, class A2 >
|
||||||
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2 )
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -252,7 +723,7 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
|
|||||||
template< class T, class A1, class A2, class A3 >
|
template< class T, class A1, class A2, class A3 >
|
||||||
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3 )
|
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -270,7 +741,7 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3
|
|||||||
template< class T, class A, class A1, class A2, class A3 >
|
template< class T, class A, class A1, class A2, class A3 >
|
||||||
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 )
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -288,7 +759,7 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
|
|||||||
template< class T, class A1, class A2, class A3, class A4 >
|
template< class T, class A1, class A2, class A3, class A4 >
|
||||||
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
|
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -306,7 +777,7 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
|
|||||||
template< class T, class A, class A1, class A2, class A3, class A4 >
|
template< class T, class A, class A1, class A2, class A3, class A4 >
|
||||||
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -324,7 +795,7 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
|
|||||||
template< class T, class A1, class A2, class A3, class A4, class A5 >
|
template< class T, class A1, class A2, class A3, class A4, class A5 >
|
||||||
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
|
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -342,7 +813,7 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
|
|||||||
template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
|
template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
|
||||||
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -360,7 +831,7 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
|
|||||||
template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
|
template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
|
||||||
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
|
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -378,7 +849,7 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
|
|||||||
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
|
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
|
||||||
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -396,7 +867,7 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
|
|||||||
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
|
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
|
||||||
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
|
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -414,7 +885,7 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
|
|||||||
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
|
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
|
||||||
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -432,7 +903,7 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
|
|||||||
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
|
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
|
||||||
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )
|
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -450,7 +921,7 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
|
|||||||
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
|
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
|
||||||
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -468,7 +939,7 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
|
|||||||
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
|
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
|
||||||
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )
|
boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -486,7 +957,7 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
|
|||||||
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
|
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
|
||||||
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )
|
boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )
|
||||||
{
|
{
|
||||||
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
@@ -503,6 +974,8 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#undef BOOST_SP_MSD
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
|
#endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
|
||||||
|
@@ -69,7 +69,25 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
// generated copy constructor, assignment, destructor are fine
|
// generated copy constructor, destructor are fine...
|
||||||
|
|
||||||
|
#if defined( BOOST_HAS_RVALUE_REFS )
|
||||||
|
|
||||||
|
// ... except in C++0x, move disables the implicit copy
|
||||||
|
|
||||||
|
shared_array( shared_array const & r ): px( r.px ), pn( r.pn ) // never throws
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// assignment
|
||||||
|
|
||||||
|
shared_array & operator=( shared_array const & r ) // never throws
|
||||||
|
{
|
||||||
|
this_type( r ).swap( *this );
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
void reset(T * p = 0)
|
void reset(T * p = 0)
|
||||||
{
|
{
|
||||||
|
@@ -41,6 +41,7 @@
|
|||||||
#include <algorithm> // for std::swap
|
#include <algorithm> // for std::swap
|
||||||
#include <functional> // for std::less
|
#include <functional> // for std::less
|
||||||
#include <typeinfo> // for std::bad_cast
|
#include <typeinfo> // for std::bad_cast
|
||||||
|
#include <cstddef> // for std::size_t
|
||||||
|
|
||||||
#if !defined(BOOST_NO_IOSTREAM)
|
#if !defined(BOOST_NO_IOSTREAM)
|
||||||
#if !defined(BOOST_NO_IOSFWD)
|
#if !defined(BOOST_NO_IOSFWD)
|
||||||
@@ -50,11 +51,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BOOST_MSVC // moved here to work around VC++ compiler crash
|
|
||||||
# pragma warning(push)
|
|
||||||
# pragma warning(disable:4284) // odd return type for operator->
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -207,7 +203,17 @@ public:
|
|||||||
boost::detail::sp_enable_shared_from_this( this, p, p );
|
boost::detail::sp_enable_shared_from_this( this, p, p );
|
||||||
}
|
}
|
||||||
|
|
||||||
// generated copy constructor, destructor are fine
|
// generated copy constructor, destructor are fine...
|
||||||
|
|
||||||
|
#if defined( BOOST_HAS_RVALUE_REFS )
|
||||||
|
|
||||||
|
// ... except in C++0x, move disables the implicit copy
|
||||||
|
|
||||||
|
shared_ptr( shared_ptr const & r ): px( r.px ), pn( r.pn ) // never throws
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
template<class Y>
|
template<class Y>
|
||||||
explicit shared_ptr(weak_ptr<Y> const & r): pn(r.pn) // may throw
|
explicit shared_ptr(weak_ptr<Y> const & r): pn(r.pn) // may throw
|
||||||
@@ -688,14 +694,19 @@ template<class T> inline bool atomic_compare_exchange_explicit( shared_ptr<T> *
|
|||||||
return atomic_compare_exchange( p, v, w ); // std::move( w )
|
return atomic_compare_exchange( p, v, w ); // std::move( w )
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif // !defined(BOOST_SP_NO_ATOMIC_ACCESS)
|
||||||
|
|
||||||
|
// hash_value
|
||||||
|
|
||||||
|
template< class T > struct hash;
|
||||||
|
|
||||||
|
template< class T > std::size_t hash_value( boost::shared_ptr<T> const & p )
|
||||||
|
{
|
||||||
|
return boost::hash< T* >()( p.get() );
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#ifdef BOOST_MSVC
|
|
||||||
# pragma warning(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
|
#endif // #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
|
||||||
|
|
||||||
#endif // #ifndef BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED
|
#endif // #ifndef BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED
|
||||||
|
@@ -40,8 +40,24 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
// generated copy constructor, assignment, destructor are fine
|
// generated copy constructor, assignment, destructor are fine...
|
||||||
|
|
||||||
|
#if defined( BOOST_HAS_RVALUE_REFS )
|
||||||
|
|
||||||
|
// ... except in C++0x, move disables the implicit copy
|
||||||
|
|
||||||
|
weak_ptr( weak_ptr const & r ): px( r.px ), pn( r.pn ) // never throws
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
weak_ptr & operator=( weak_ptr const & r ) // never throws
|
||||||
|
{
|
||||||
|
px = r.px;
|
||||||
|
pn = r.pn;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// The "obvious" converting constructor implementation:
|
// The "obvious" converting constructor implementation:
|
||||||
|
@@ -64,5 +64,6 @@ import testing ;
|
|||||||
[ run atomic_count_test2.cpp ]
|
[ run atomic_count_test2.cpp ]
|
||||||
[ run sp_typeinfo_test.cpp ]
|
[ run sp_typeinfo_test.cpp ]
|
||||||
[ compile make_shared_fp_test.cpp ]
|
[ compile make_shared_fp_test.cpp ]
|
||||||
|
[ run sp_hash_test.cpp ]
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@@ -12,14 +12,14 @@
|
|||||||
#include <boost/make_shared.hpp>
|
#include <boost/make_shared.hpp>
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
#if !defined( BOOST_HAS_RVALUE_REFS ) || !defined( BOOST_HAS_VARIADIC_TMPL )
|
#if !defined( BOOST_HAS_RVALUE_REFS )
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // BOOST_HAS_RVALUE_REFS, BOOST_HAS_VARIADIC_TMPL
|
#else // BOOST_HAS_RVALUE_REFS
|
||||||
|
|
||||||
class myarg
|
class myarg
|
||||||
{
|
{
|
||||||
|
@@ -33,10 +33,7 @@
|
|||||||
# pragma warn -8092 // template argument passed to 'find' is not an iterator
|
# pragma warn -8092 // template argument passed to 'find' is not an iterator
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <boost/scoped_ptr.hpp>
|
#include <boost/smart_ptr.hpp>
|
||||||
#include <boost/scoped_array.hpp>
|
|
||||||
#include <boost/shared_ptr.hpp>
|
|
||||||
#include <boost/shared_array.hpp>
|
|
||||||
|
|
||||||
#include <boost/detail/lightweight_test.hpp>
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
|
||||||
|
34
test/sp_hash_test.cpp
Normal file
34
test/sp_hash_test.cpp
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// sp_hash_test.cpp
|
||||||
|
//
|
||||||
|
// Copyright 2011 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
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include <boost/functional/hash.hpp>
|
||||||
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
boost::hash< boost::shared_ptr<int> > hasher;
|
||||||
|
|
||||||
|
boost::shared_ptr< int > p1, p2( p1 ), p3( new int ), p4( p3 ), p5( new int );
|
||||||
|
|
||||||
|
BOOST_TEST_EQ( p1, p2 );
|
||||||
|
BOOST_TEST_EQ( hasher( p1 ), hasher( p2 ) );
|
||||||
|
|
||||||
|
BOOST_TEST_NE( p1, p3 );
|
||||||
|
BOOST_TEST_NE( hasher( p1 ), hasher( p3 ) );
|
||||||
|
|
||||||
|
BOOST_TEST_EQ( p3, p4 );
|
||||||
|
BOOST_TEST_EQ( hasher( p3 ), hasher( p4 ) );
|
||||||
|
|
||||||
|
BOOST_TEST_NE( p3, p5 );
|
||||||
|
BOOST_TEST_NE( hasher( p3 ), hasher( p5 ) );
|
||||||
|
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
Reference in New Issue
Block a user