mirror of
https://github.com/boostorg/smart_ptr.git
synced 2025-10-06 12:41:01 +02:00
Compare commits
19 Commits
boost-1.43
...
boost-1.48
Author | SHA1 | Date | |
---|---|---|---|
|
6a51cba06a | ||
|
7b097467d6 | ||
|
7cb040edb0 | ||
|
d6ac116b71 | ||
|
8abc8889d1 | ||
|
c5b47e2136 | ||
|
7c0815c567 | ||
|
210288f02e | ||
|
cf7b6904e8 | ||
|
b978919dd1 | ||
|
1086aff971 | ||
|
445e8d1728 | ||
|
545745d649 | ||
|
d71cc6ab08 | ||
|
0d77fd0678 | ||
|
6ca6d3ce6f | ||
|
cfc82854d3 | ||
|
b9d77d877e | ||
|
1f50e3abe4 |
@@ -74,7 +74,13 @@ template<class T> struct sp_typeid_
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T> sp_typeinfo sp_typeid_< T >::ti_( sp_typeid_< T >::name() );
|
#if defined(__SUNPRO_CC)
|
||||||
|
// see #4199, the Sun Studio compiler gets confused about static initialization
|
||||||
|
// constructor arguments. But an assignment works just fine.
|
||||||
|
template<class T> sp_typeinfo sp_typeid_< T >::ti_ = sp_typeid_< T >::name();
|
||||||
|
#else
|
||||||
|
template<class T> sp_typeinfo sp_typeid_< T >::ti_(sp_typeid_< T >::name());
|
||||||
|
#endif
|
||||||
|
|
||||||
template<class T> struct sp_typeid_< T & >: sp_typeid_< T >
|
template<class T> struct sp_typeid_< T & >: sp_typeid_< T >
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
|
@@ -45,7 +45,7 @@ template< class Y, class T > struct sp_convertible
|
|||||||
static yes f( T* );
|
static yes f( T* );
|
||||||
static no f( ... );
|
static no f( ... );
|
||||||
|
|
||||||
enum _vt { value = sizeof( f( static_cast<Y*>(0) ) ) == sizeof(yes) };
|
enum _vt { value = sizeof( (f)( static_cast<Y*>(0) ) ) == sizeof(yes) };
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sp_empty
|
struct sp_empty
|
||||||
|
@@ -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 ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -55,7 +55,7 @@ namespace detail
|
|||||||
{
|
{
|
||||||
|
|
||||||
#if !defined( BOOST_USE_WINDOWS_H )
|
#if !defined( BOOST_USE_WINDOWS_H )
|
||||||
extern "C" void __stdcall Sleep( unsigned ms );
|
extern "C" void __stdcall Sleep( unsigned long ms );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
inline void yield( unsigned k )
|
inline void yield( unsigned k )
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,23 +98,31 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
#if defined( BOOST_HAS_RVALUE_REFS )
|
#if defined( BOOST_HAS_RVALUE_REFS )
|
||||||
template< class T > T&& forward( T &&t )
|
|
||||||
|
template< class T > T&& sp_forward( T & t )
|
||||||
{
|
{
|
||||||
return t;
|
return static_cast< T&& >( t );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // 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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -118,9 +137,9 @@ 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -137,15 +156,15 @@ template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a
|
|||||||
|
|
||||||
// Variadic templates, rvalue reference
|
// Variadic templates, rvalue reference
|
||||||
|
|
||||||
template< class T, class... Args > boost::shared_ptr< T > make_shared( 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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
::new( pv ) T( detail::forward<Args>( args )... );
|
::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
|
||||||
pd->set_initialized();
|
pd->set_initialized();
|
||||||
|
|
||||||
T * pt2 = static_cast< T* >( pv );
|
T * pt2 = static_cast< T* >( pv );
|
||||||
@@ -154,15 +173,469 @@ template< class T, class... Args > boost::shared_ptr< T > make_shared( Args && .
|
|||||||
return boost::shared_ptr< T >( pt, pt2 );
|
return boost::shared_ptr< T >( pt, pt2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
template< class T, class A, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
::new( pv ) T( detail::forward<Args>( args )... );
|
::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
#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();
|
pd->set_initialized();
|
||||||
|
|
||||||
T * pt2 = static_cast< T* >( pv );
|
T * pt2 = static_cast< T* >( pv );
|
||||||
@@ -178,9 +651,9 @@ template< class T, class A, class... Args > boost::shared_ptr< T > allocate_shar
|
|||||||
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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -196,9 +669,9 @@ 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -214,9 +687,9 @@ 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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -232,9 +705,9 @@ 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -250,9 +723,9 @@ 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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -268,9 +741,9 @@ 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -286,9 +759,9 @@ 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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -304,9 +777,9 @@ 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -322,9 +795,9 @@ 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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -340,9 +813,9 @@ 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -358,9 +831,9 @@ 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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -376,9 +849,9 @@ 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -394,9 +867,9 @@ 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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -412,9 +885,9 @@ 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -430,9 +903,9 @@ 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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -448,9 +921,9 @@ 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -466,9 +939,9 @@ 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 ), detail::sp_ms_deleter< T >() );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -484,9 +957,9 @@ 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 ), detail::sp_ms_deleter< T >(), a );
|
boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
|
||||||
|
|
||||||
detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
|
boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
|
||||||
|
|
||||||
void * pv = pd->address();
|
void * pv = pd->address();
|
||||||
|
|
||||||
@@ -501,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:
|
||||||
|
@@ -63,5 +63,7 @@ import testing ;
|
|||||||
[ compile-fail auto_ptr_lv_fail.cpp ]
|
[ compile-fail auto_ptr_lv_fail.cpp ]
|
||||||
[ 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 ]
|
||||||
|
[ run sp_hash_test.cpp ]
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
19
test/make_shared_fp_test.cpp
Normal file
19
test/make_shared_fp_test.cpp
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// make_shared_fp_test.cpp
|
||||||
|
//
|
||||||
|
// Copyright 2010 Georg Fritzsche
|
||||||
|
//
|
||||||
|
// 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/make_shared.hpp>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
typedef boost::shared_ptr<int>(*FP)();
|
||||||
|
FP fp = boost::make_shared<int>;
|
||||||
|
}
|
@@ -12,7 +12,7 @@
|
|||||||
#include <boost/make_shared.hpp>
|
#include <boost/make_shared.hpp>
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
#ifndef BOOST_HAS_RVALUE_REFS
|
#if !defined( BOOST_HAS_RVALUE_REFS )
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
@@ -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();
|
||||||
|
}
|
@@ -914,7 +914,6 @@ void test()
|
|||||||
BOOST_TEST(wp2.use_count() == 0);
|
BOOST_TEST(wp2.use_count() == 0);
|
||||||
BOOST_TEST(!(wp < wp3 || wp3 < wp));
|
BOOST_TEST(!(wp < wp3 || wp3 < wp));
|
||||||
|
|
||||||
using std::swap;
|
|
||||||
swap(wp, wp2);
|
swap(wp, wp2);
|
||||||
|
|
||||||
BOOST_TEST(wp.use_count() == 0);
|
BOOST_TEST(wp.use_count() == 0);
|
||||||
@@ -950,7 +949,6 @@ void test()
|
|||||||
BOOST_TEST(wp2.use_count() == 0);
|
BOOST_TEST(wp2.use_count() == 0);
|
||||||
BOOST_TEST(!(wp < wp3 || wp3 < wp));
|
BOOST_TEST(!(wp < wp3 || wp3 < wp));
|
||||||
|
|
||||||
using std::swap;
|
|
||||||
swap(wp, wp2);
|
swap(wp, wp2);
|
||||||
|
|
||||||
BOOST_TEST(wp.use_count() == 0);
|
BOOST_TEST(wp.use_count() == 0);
|
||||||
@@ -965,7 +963,6 @@ void test()
|
|||||||
BOOST_TEST(wp2.use_count() == 0);
|
BOOST_TEST(wp2.use_count() == 0);
|
||||||
BOOST_TEST(!(wp < wp3 || wp3 < wp));
|
BOOST_TEST(!(wp < wp3 || wp3 < wp));
|
||||||
|
|
||||||
using std::swap;
|
|
||||||
swap(wp, wp2);
|
swap(wp, wp2);
|
||||||
|
|
||||||
BOOST_TEST(wp.use_count() == 0);
|
BOOST_TEST(wp.use_count() == 0);
|
||||||
|
Reference in New Issue
Block a user