mirror of
https://github.com/boostorg/smart_ptr.git
synced 2025-08-01 05:34:36 +02:00
Use single allocation in deleter and allocator constructors
This commit is contained in:
@@ -50,6 +50,15 @@ public:
|
|||||||
{
|
{
|
||||||
d_( p );
|
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 )
|
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;
|
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
|
} // namespace detail
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -155,30 +190,30 @@ public:
|
|||||||
boost::detail::lsp_pointer_construct( this, p, pn );
|
boost::detail::lsp_pointer_construct( this, p, pn );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Y, class D> local_shared_ptr( Y * p, D d ): px( p ),
|
template<class Y, class D> local_shared_ptr( Y * p, D d ): px( p ), pn( 0 )
|
||||||
pn( new boost::detail::local_counted_impl( shared_ptr<T>( p, d ) ) )
|
|
||||||
{
|
{
|
||||||
|
boost::detail::lsp_deleter_construct( this, p, d, pn );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
|
#if !defined( BOOST_NO_CXX11_NULLPTR )
|
||||||
|
|
||||||
template<class D> local_shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ),
|
template<class D> local_shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ), pn( 0 )
|
||||||
pn( new boost::detail::local_counted_impl( shared_ptr<T>( p, d ) ) )
|
|
||||||
{
|
{
|
||||||
|
boost::detail::lsp_deleter_construct( this, p, d, pn );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template<class Y, class D, class A> local_shared_ptr( Y * p, D d, A a ): px( p ),
|
template<class Y, class D, class A> local_shared_ptr( Y * p, D d, A a ): px( p ), pn( 0 )
|
||||||
pn( new boost::detail::local_counted_impl( shared_ptr<T>( p, d, a ) ) )
|
|
||||||
{
|
{
|
||||||
|
boost::detail::lsp_allocator_construct( this, p, d, a, pn );
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
|
#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 ),
|
template<class D, class A> local_shared_ptr( boost::detail::sp_nullptr_t p, D d, A a ): px( p ), pn( 0 )
|
||||||
pn( new boost::detail::local_counted_impl( shared_ptr<T>( p, d, a ) ) )
|
|
||||||
{
|
{
|
||||||
|
boost::detail::lsp_allocator_construct( this, p, d, a, pn );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user