mirror of
https://github.com/boostorg/smart_ptr.git
synced 2025-07-31 05:07:21 +02:00
Use single allocation in deleter and allocator constructors
This commit is contained in:
@ -50,6 +50,15 @@ public:
|
||||
{
|
||||
d_( p );
|
||||
}
|
||||
|
||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
|
||||
|
||||
void operator()( boost::detail::sp_nullptr_t p ) const BOOST_SP_NOEXCEPT
|
||||
{
|
||||
d_( p );
|
||||
}
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
template< class E, class Y > inline void lsp_pointer_construct( boost::local_shared_ptr< E > * ppx, Y * p, boost::detail::local_counted_base * & pn )
|
||||
@ -97,6 +106,32 @@ template< class E, std::size_t N, class Y > inline void lsp_pointer_construct( b
|
||||
pn = pd;
|
||||
}
|
||||
|
||||
template< class E, class P, class D > inline void lsp_deleter_construct( boost::local_shared_ptr< E > * ppx, P p, D const& d, boost::detail::local_counted_base * & pn )
|
||||
{
|
||||
typedef boost::detail::local_sp_deleter<D> D2;
|
||||
|
||||
boost::shared_ptr<E> p2( p, D2( d ) );
|
||||
|
||||
D2 * pd = static_cast< D2 * >( p2._internal_get_untyped_deleter() );
|
||||
|
||||
pd->pn_ = p2;
|
||||
|
||||
pn = pd;
|
||||
}
|
||||
|
||||
template< class E, class P, class D, class A > inline void lsp_allocator_construct( boost::local_shared_ptr< E > * ppx, P p, D const& d, A const& a, boost::detail::local_counted_base * & pn )
|
||||
{
|
||||
typedef boost::detail::local_sp_deleter<D> D2;
|
||||
|
||||
boost::shared_ptr<E> p2( p, D2( d ), a );
|
||||
|
||||
D2 * pd = static_cast< D2 * >( p2._internal_get_untyped_deleter() );
|
||||
|
||||
pd->pn_ = p2;
|
||||
|
||||
pn = pd;
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
//
|
||||
@ -155,30 +190,30 @@ public:
|
||||
boost::detail::lsp_pointer_construct( this, p, pn );
|
||||
}
|
||||
|
||||
template<class Y, class D> local_shared_ptr( Y * p, D d ): px( p ),
|
||||
pn( new boost::detail::local_counted_impl( shared_ptr<T>( p, d ) ) )
|
||||
template<class Y, class D> local_shared_ptr( Y * p, D d ): px( p ), pn( 0 )
|
||||
{
|
||||
boost::detail::lsp_deleter_construct( this, p, d, pn );
|
||||
}
|
||||
|
||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
|
||||
|
||||
template<class D> local_shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ),
|
||||
pn( new boost::detail::local_counted_impl( shared_ptr<T>( p, d ) ) )
|
||||
template<class D> local_shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ), pn( 0 )
|
||||
{
|
||||
boost::detail::lsp_deleter_construct( this, p, d, pn );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
template<class Y, class D, class A> local_shared_ptr( Y * p, D d, A a ): px( p ),
|
||||
pn( new boost::detail::local_counted_impl( shared_ptr<T>( p, d, a ) ) )
|
||||
template<class Y, class D, class A> local_shared_ptr( Y * p, D d, A a ): px( p ), pn( 0 )
|
||||
{
|
||||
boost::detail::lsp_allocator_construct( this, p, d, a, pn );
|
||||
}
|
||||
|
||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
|
||||
|
||||
template<class D, class A> local_shared_ptr( boost::detail::sp_nullptr_t p, D d, A a ): px( p ),
|
||||
pn( new boost::detail::local_counted_impl( shared_ptr<T>( p, d, a ) ) )
|
||||
template<class D, class A> local_shared_ptr( boost::detail::sp_nullptr_t p, D d, A a ): px( p ), pn( 0 )
|
||||
{
|
||||
boost::detail::lsp_allocator_construct( this, p, d, a, pn );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user