From 47ee1e09e979077051dd246526bca2eed8d3b833 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 13 Jun 2017 18:29:18 +0300 Subject: [PATCH] Use single allocation in deleter and allocator constructors --- include/boost/smart_ptr/local_shared_ptr.hpp | 51 +++++++++++++++++--- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/include/boost/smart_ptr/local_shared_ptr.hpp b/include/boost/smart_ptr/local_shared_ptr.hpp index 9ca464b..71f31a4 100644 --- a/include/boost/smart_ptr/local_shared_ptr.hpp +++ b/include/boost/smart_ptr/local_shared_ptr.hpp @@ -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 D2; + + boost::shared_ptr 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 D2; + + boost::shared_ptr 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 local_shared_ptr( Y * p, D d ): px( p ), - pn( new boost::detail::local_counted_impl( shared_ptr( p, d ) ) ) + template 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 local_shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ), - pn( new boost::detail::local_counted_impl( shared_ptr( p, d ) ) ) + template 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 local_shared_ptr( Y * p, D d, A a ): px( p ), - pn( new boost::detail::local_counted_impl( shared_ptr( p, d, a ) ) ) + template 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 local_shared_ptr( boost::detail::sp_nullptr_t p, D d, A a ): px( p ), - pn( new boost::detail::local_counted_impl( shared_ptr( p, d, a ) ) ) + template 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