Chris@16: #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED Chris@16: #define BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED Chris@16: Chris@16: // make_shared_object.hpp Chris@16: // Chris@16: // Copyright (c) 2007, 2008, 2012 Peter Dimov Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt Chris@16: // Chris@16: // See http://www.boost.org/libs/smart_ptr/make_shared.html Chris@16: // for documentation. Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: Chris@16: template< std::size_t N, std::size_t A > struct sp_aligned_storage Chris@16: { Chris@16: union type Chris@16: { Chris@16: char data_[ N ]; Chris@16: typename boost::type_with_alignment< A >::type align_; Chris@16: }; Chris@16: }; Chris@16: Chris@16: template< class T > class sp_ms_deleter Chris@16: { Chris@16: private: Chris@16: Chris@16: typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type; Chris@16: Chris@16: bool initialized_; Chris@16: storage_type storage_; Chris@16: Chris@16: private: Chris@16: Chris@16: void destroy() Chris@16: { Chris@16: if( initialized_ ) Chris@16: { Chris@16: #if defined( __GNUC__ ) Chris@16: Chris@16: // fixes incorrect aliasing warning Chris@16: T * p = reinterpret_cast< T* >( storage_.data_ ); Chris@16: p->~T(); Chris@16: Chris@16: #else Chris@16: Chris@16: reinterpret_cast< T* >( storage_.data_ )->~T(); Chris@16: Chris@16: #endif Chris@16: Chris@16: initialized_ = false; Chris@16: } Chris@16: } Chris@16: Chris@16: public: Chris@16: Chris@16: sp_ms_deleter() BOOST_NOEXCEPT : initialized_( false ) Chris@16: { Chris@16: } Chris@16: Chris@101: template explicit sp_ms_deleter( A const & ) BOOST_NOEXCEPT : initialized_( false ) Chris@101: { Chris@101: } Chris@101: Chris@16: // optimization: do not copy storage_ Chris@16: sp_ms_deleter( sp_ms_deleter const & ) BOOST_NOEXCEPT : initialized_( false ) Chris@16: { Chris@16: } Chris@16: Chris@16: ~sp_ms_deleter() Chris@16: { Chris@16: destroy(); Chris@16: } Chris@16: Chris@16: void operator()( T * ) Chris@16: { Chris@16: destroy(); Chris@16: } Chris@16: Chris@16: static void operator_fn( T* ) // operator() can't be static Chris@16: { Chris@16: } Chris@16: Chris@16: void * address() BOOST_NOEXCEPT Chris@16: { Chris@16: return storage_.data_; Chris@16: } Chris@16: Chris@16: void set_initialized() BOOST_NOEXCEPT Chris@16: { Chris@16: initialized_ = true; Chris@16: } Chris@16: }; Chris@16: Chris@101: template< class T, class A > class sp_as_deleter Chris@101: { Chris@101: private: Chris@101: Chris@101: typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type; Chris@101: Chris@101: storage_type storage_; Chris@101: A a_; Chris@101: bool initialized_; Chris@101: Chris@101: private: Chris@101: Chris@101: void destroy() Chris@101: { Chris@101: if( initialized_ ) Chris@101: { Chris@101: T * p = reinterpret_cast< T* >( storage_.data_ ); Chris@101: Chris@101: #if !defined( BOOST_NO_CXX11_ALLOCATOR ) Chris@101: Chris@101: std::allocator_traits::destroy( a_, p ); Chris@101: Chris@101: #else Chris@101: Chris@101: p->~T(); Chris@101: Chris@101: #endif Chris@101: Chris@101: initialized_ = false; Chris@101: } Chris@101: } Chris@101: Chris@101: public: Chris@101: Chris@101: sp_as_deleter( A const & a ) BOOST_NOEXCEPT : a_( a ), initialized_( false ) Chris@101: { Chris@101: } Chris@101: Chris@101: // optimization: do not copy storage_ Chris@101: sp_as_deleter( sp_as_deleter const & r ) BOOST_NOEXCEPT : a_( r.a_), initialized_( false ) Chris@101: { Chris@101: } Chris@101: Chris@101: ~sp_as_deleter() Chris@101: { Chris@101: destroy(); Chris@101: } Chris@101: Chris@101: void operator()( T * ) Chris@101: { Chris@101: destroy(); Chris@101: } Chris@101: Chris@101: static void operator_fn( T* ) // operator() can't be static Chris@101: { Chris@101: } Chris@101: Chris@101: void * address() BOOST_NOEXCEPT Chris@101: { Chris@101: return storage_.data_; Chris@101: } Chris@101: Chris@101: void set_initialized() BOOST_NOEXCEPT Chris@101: { Chris@101: initialized_ = true; Chris@101: } Chris@101: }; Chris@101: Chris@16: template< class T > struct sp_if_not_array Chris@16: { Chris@16: typedef boost::shared_ptr< T > type; Chris@16: }; Chris@16: Chris@16: #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) Chris@16: Chris@16: template< class T > struct sp_if_not_array< T[] > Chris@16: { Chris@16: }; Chris@16: Chris@16: #if !defined( __BORLANDC__ ) || !BOOST_WORKAROUND( __BORLANDC__, < 0x600 ) Chris@16: Chris@16: template< class T, std::size_t N > struct sp_if_not_array< T[N] > Chris@16: { Chris@16: }; Chris@16: Chris@16: #endif Chris@16: Chris@16: #endif Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: #if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING ) Chris@16: # define BOOST_SP_MSD( T ) boost::detail::sp_inplace_tag< boost::detail::sp_ms_deleter< T > >() Chris@16: #else Chris@16: # define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >() Chris@16: #endif Chris@16: Chris@101: // _noinit versions Chris@16: Chris@16: template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared_noinit() Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T; Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared_noinit( A const & a ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T; Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: #if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) Chris@16: Chris@16: // Variadic templates, rvalue reference Chris@16: Chris@101: template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@101: ::new( pv ) T( boost::detail::sp_forward( args )... ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@101: template< class T, class A, class... Args > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, Args && ... args ) Chris@16: { Chris@101: #if !defined( BOOST_NO_CXX11_ALLOCATOR ) Chris@16: Chris@101: typedef typename std::allocator_traits::template rebind_alloc A2; Chris@101: A2 a2( a ); Chris@16: Chris@101: typedef boost::detail::sp_as_deleter< T, A2 > D; Chris@101: Chris@101: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag(), a2 ); Chris@101: Chris@101: #else Chris@101: Chris@101: typedef boost::detail::sp_ms_deleter< T > D; Chris@101: Chris@101: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag(), a ); Chris@101: Chris@101: #endif Chris@101: Chris@101: D * pd = static_cast< D* >( pt._internal_get_untyped_deleter() ); Chris@16: void * pv = pd->address(); Chris@16: Chris@101: #if !defined( BOOST_NO_CXX11_ALLOCATOR ) Chris@101: Chris@101: std::allocator_traits::construct( a2, static_cast< T* >( pv ), boost::detail::sp_forward( args )... ); Chris@101: Chris@101: #else Chris@101: Chris@101: ::new( pv ) T( boost::detail::sp_forward( args )... ); Chris@101: Chris@101: #endif Chris@101: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@101: #else // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) Chris@101: Chris@101: // Common zero-argument versions Chris@101: Chris@101: template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared() Chris@101: { Chris@101: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@101: Chris@101: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@101: Chris@101: void * pv = pd->address(); Chris@101: Chris@101: ::new( pv ) T(); Chris@101: pd->set_initialized(); Chris@101: Chris@101: T * pt2 = static_cast< T* >( pv ); Chris@101: Chris@101: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@101: return boost::shared_ptr< T >( pt, pt2 ); Chris@101: } Chris@101: Chris@101: template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a ) Chris@101: { Chris@101: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@101: Chris@101: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@101: Chris@101: void * pv = pd->address(); Chris@101: Chris@101: ::new( pv ) T(); Chris@101: pd->set_initialized(); Chris@101: Chris@101: T * pt2 = static_cast< T* >( pv ); Chris@101: Chris@101: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@101: return boost::shared_ptr< T >( pt, pt2 ); Chris@101: } Chris@101: Chris@101: #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) Chris@16: Chris@16: // For example MSVC 10.0 Chris@16: Chris@16: template< class T, class A1 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4, class A5 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ), Chris@16: boost::detail::sp_forward( a5 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4, class A5 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ), Chris@16: boost::detail::sp_forward( a5 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4, class A5, class A6 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ), Chris@16: boost::detail::sp_forward( a5 ), Chris@16: boost::detail::sp_forward( a6 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ), Chris@16: boost::detail::sp_forward( a5 ), Chris@16: boost::detail::sp_forward( a6 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ), Chris@16: boost::detail::sp_forward( a5 ), Chris@16: boost::detail::sp_forward( a6 ), Chris@16: boost::detail::sp_forward( a7 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ), Chris@16: boost::detail::sp_forward( a5 ), Chris@16: boost::detail::sp_forward( a6 ), Chris@16: boost::detail::sp_forward( a7 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ), Chris@16: boost::detail::sp_forward( a5 ), Chris@16: boost::detail::sp_forward( a6 ), Chris@16: boost::detail::sp_forward( a7 ), Chris@16: boost::detail::sp_forward( a8 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ), Chris@16: boost::detail::sp_forward( a5 ), Chris@16: boost::detail::sp_forward( a6 ), Chris@16: boost::detail::sp_forward( a7 ), Chris@16: boost::detail::sp_forward( a8 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ), Chris@16: boost::detail::sp_forward( a5 ), Chris@16: boost::detail::sp_forward( a6 ), Chris@16: boost::detail::sp_forward( a7 ), Chris@16: boost::detail::sp_forward( a8 ), Chris@16: boost::detail::sp_forward( a9 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( Chris@16: boost::detail::sp_forward( a1 ), Chris@16: boost::detail::sp_forward( a2 ), Chris@16: boost::detail::sp_forward( a3 ), Chris@16: boost::detail::sp_forward( a4 ), Chris@16: boost::detail::sp_forward( a5 ), Chris@16: boost::detail::sp_forward( a6 ), Chris@16: boost::detail::sp_forward( a7 ), Chris@16: boost::detail::sp_forward( a8 ), Chris@16: boost::detail::sp_forward( a9 ) Chris@16: ); Chris@16: Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@101: #else // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) Chris@16: Chris@16: // C++03 version Chris@16: Chris@16: template< class T, class A1 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4, class A5 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4, a5 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4, class A5 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4, a5 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4, class A5, class A6 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4, a5, a6 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 > Chris@16: typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4, a5, a6 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > Chris@16: typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > Chris@16: typename boost::detail::sp_if_not_array< T >::type 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 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > Chris@16: typename boost::detail::sp_if_not_array< T >::type 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 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > Chris@16: typename boost::detail::sp_if_not_array< T >::type 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 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > Chris@16: typename boost::detail::sp_if_not_array< T >::type 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 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@16: template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > Chris@16: typename boost::detail::sp_if_not_array< T >::type 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 ) Chris@16: { Chris@16: boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); Chris@16: Chris@16: boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); Chris@16: Chris@16: void * pv = pd->address(); Chris@16: Chris@16: ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); Chris@16: pd->set_initialized(); Chris@16: Chris@16: T * pt2 = static_cast< T* >( pv ); Chris@16: Chris@16: boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); Chris@16: return boost::shared_ptr< T >( pt, pt2 ); Chris@16: } Chris@16: Chris@101: #endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) Chris@101: Chris@101: #endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) Chris@16: Chris@16: #undef BOOST_SP_MSD Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED