#ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED #define BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED // make_shared.hpp // // Copyright (c) 2007, 2008 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // // See http://www.boost.org/libs/smart_ptr/make_shared.html // for documentation. #include #include #include #include #include #include // std::auto_ptr #include // std::bad_alloc #include namespace boost { namespace detail { #if defined( BOOST_HAS_RVALUE_REFS ) template< class T > T&& sp_forward( T & t ) { return static_cast< T&& >( t ); } #endif #ifdef BOOST_NO_EXCEPTIONS template void verify_allocation(T*) {} #else template void verify_allocation(T* p) { if (!p) { boost::throw_exception(std::bad_alloc()); } } #endif // #ifdef BOOST_NO_EXCEPTIONS // scoped holder of sp counter object allocated with custom allocator template class scoped_sp_counter : private boost::noncopyable { typedef typename Alloc::template rebind::other sp_counter_alloc_t; public: scoped_sp_counter(const Alloc& a) : a_(a) { p_ = a_.allocate(1, NULL); boost::detail::verify_allocation(p_); new (p_) SpCounter(a); // nothrow if a's copy ctor doesn't throw } ~scoped_sp_counter() { if (p_) { p_->~SpCounter(); a_.deallocate(p_, 1); } } SpCounter* operator->() const { return p_; } SpCounter* release() { SpCounter* released = p_; p_ = NULL; return released; } private: SpCounter* p_; sp_counter_alloc_t a_; }; } // namespace detail // Zero-argument versions // // 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() { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new ( pv ) T(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a ) { boost::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new ( pv ) T(); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } #if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS ) // Variadic templates, rvalue reference template< class T, class Arg1, class... Args > boost::shared_ptr< T > make_shared( Arg1 && arg1, Args && ... args ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new ( pv ) T( boost::detail::sp_forward( arg1 ), boost::detail::sp_forward( args )... ); T* pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } template< class T, class A, class Arg1, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Arg1 && arg1, Args && ... args ) { boost::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new( pv ) T( boost::detail::sp_forward( arg1 ), boost::detail::sp_forward( args )... ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } #elif defined( BOOST_HAS_RVALUE_REFS ) // For example MSVC 10.0 template< class T, class A1 > boost::shared_ptr< T > make_shared( A1 && a1 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( boost::detail::sp_forward( a1 ) ); T* pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } template< class T, class A, class A1 > boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1 ) { boost::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new ( pv ) T( boost::detail::sp_forward( a1 ) ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } template< class T, class A1, class A2 > boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ) ); T* pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } template< class T, class A, class A1, class A2 > boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2 ) { boost::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new ( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ) ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } template< class T, class A1, class A2, class A3 > boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ) ); T* pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new ( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ) ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ) ); T* pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new ( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ) ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ) ); T* pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new ( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ) ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ), boost::detail::sp_forward( a6 ) ); T* pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new ( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ), boost::detail::sp_forward( a6 ) ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ), boost::detail::sp_forward( a6 ), boost::detail::sp_forward( a7 ) ); T* pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new ( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ), boost::detail::sp_forward( a6 ), boost::detail::sp_forward( a7 ) ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ), boost::detail::sp_forward( a6 ), boost::detail::sp_forward( a7 ), boost::detail::sp_forward( a8 ) ); T* pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new ( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ), boost::detail::sp_forward( a6 ), boost::detail::sp_forward( a7 ), boost::detail::sp_forward( a8 ) ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ), boost::detail::sp_forward( a6 ), boost::detail::sp_forward( a7 ), boost::detail::sp_forward( a8 ), boost::detail::sp_forward( a9 ) ); T* pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new ( pv ) T( boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ), boost::detail::sp_forward( a6 ), boost::detail::sp_forward( a7 ), boost::detail::sp_forward( a8 ), boost::detail::sp_forward( a9 ) ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } #else // C++03 version template< class T, class A1 > boost::shared_ptr< T > make_shared( A1 const & a1 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( a1 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } template< class T, class A, class A1 > boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1 ) { boost::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new( pv ) T( a1 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } template< class T, class A1, class A2 > boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } template< class T, class A1, class A2, class A3 > boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4, a5 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4, a5 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4, a5, a6 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4, a5, a6 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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 ) { std::auto_ptr< boost::detail::sp_counted_impl_ms > counter( new boost::detail::sp_counted_impl_ms() ); boost::detail::verify_allocation( counter.get() ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } 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::detail::scoped_sp_counter< boost::detail::sp_counted_impl_ms_a, A > counter( a ); void * pv = counter->get_pointer(); ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); T * pt2 = static_cast< T* >( pv ); boost::detail::sp_counted_base_ms* c = counter.release(); boost::shared_ptr pt( c->get_pointer(), static_cast< boost::detail::sp_counted_base* >( c ) ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); return pt; } #endif } // namespace boost #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED