--- shared_ptr.hpp.clean 2014-03-12 10:32:10.054102239 -0400 +++ shared_ptr.hpp 2014-03-12 10:34:09.413172291 -0400 @@ -51,6 +51,13 @@ #endif #endif +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS +void boost_debug_shared_ptr_operator_equals (void const *, void const *, int, void const*, int); +void boost_debug_shared_ptr_reset (void const *, void const *, int, void const*, int); +void boost_debug_shared_ptr_destructor (void const *, void const *, int); +void boost_debug_shared_ptr_constructor (void const *, void const *, int); +#endif + namespace boost { @@ -177,12 +184,31 @@ shared_ptr(): px(0), pn() // never throws in 1.30+ { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif + } + + ~shared_ptr() + { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_destructor (this, get(), use_count()); +#endif + } + + shared_ptr(const shared_ptr& r ) : px (r.px), pn (r.pn) { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } template explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete { boost::detail::sp_enable_shared_from_this( this, p, p ); +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } // @@ -193,7 +219,10 @@ template shared_ptr(Y * p, D d): px(p), pn(p, d) { - boost::detail::sp_enable_shared_from_this( this, p, p ); + boost::detail::sp_enable_shared_from_this( this, p, p ); +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } // As above, but with allocator. A's copy constructor shall not throw. @@ -201,6 +230,9 @@ template shared_ptr( Y * p, D d, A a ): px( p ), pn( p, d, a ) { boost::detail::sp_enable_shared_from_this( this, p, p ); +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } // generated copy constructor, destructor are fine... @@ -220,6 +252,9 @@ { // it is now safe to copy r.px, as pn(r.pn) did not throw px = r.px; +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } template @@ -229,6 +264,9 @@ { px = r.px; } +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } template @@ -243,22 +281,34 @@ #endif : px( r.px ), pn( r.pn ) // never throws { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } // aliasing template< class Y > shared_ptr( shared_ptr const & r, T * p ): px( p ), pn( r.pn ) // never throws { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } template shared_ptr(shared_ptr const & r, boost::detail::static_cast_tag): px(static_cast(r.px)), pn(r.pn) { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } template shared_ptr(shared_ptr const & r, boost::detail::const_cast_tag): px(const_cast(r.px)), pn(r.pn) { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } template @@ -268,6 +318,9 @@ { pn = boost::detail::shared_count(); } +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } template @@ -277,6 +330,9 @@ { boost::throw_exception(std::bad_cast()); } +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } #ifndef BOOST_NO_AUTO_PTR @@ -287,6 +343,9 @@ Y * tmp = r.get(); pn = boost::detail::shared_count(r); boost::detail::sp_enable_shared_from_this( this, tmp, tmp ); +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } #if !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) @@ -297,6 +356,9 @@ typename Ap::element_type * tmp = r.get(); pn = boost::detail::shared_count( r ); boost::detail::sp_enable_shared_from_this( this, tmp, tmp ); +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } @@ -308,6 +370,9 @@ shared_ptr & operator=( shared_ptr const & r ) // never throws { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_operator_equals (this, get(), use_count(), r.get(), r.use_count()); +#endif this_type(r).swap(*this); return *this; } @@ -317,6 +382,9 @@ template shared_ptr & operator=(shared_ptr const & r) // never throws { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_operator_equals (this, get(), use_count(), r.get(), r.use_count()); +#endif this_type(r).swap(*this); return *this; } @@ -328,6 +396,9 @@ template shared_ptr & operator=( std::auto_ptr & r ) { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_operator_equals (this, get(), use_count(), r.get(), r.use_count()); +#endif this_type(r).swap(*this); return *this; } @@ -354,6 +425,9 @@ { pn.swap( r.pn ); r.px = 0; +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_constructor (this, px, use_count()); +#endif } template @@ -370,10 +444,16 @@ { pn.swap( r.pn ); r.px = 0; ++#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS ++ boost_debug_shared_ptr_operator_equals (this, get(), use_count(), r.get(), r.use_count()); ++#endif } shared_ptr & operator=( shared_ptr && r ) // never throws { ++#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS ++ boost_debug_shared_ptr_operator_equals (this, get(), use_count(), r.get(), r.use_count()); ++#endif this_type( static_cast< shared_ptr && >( r ) ).swap( *this ); return *this; } @@ -381,6 +461,9 @@ template shared_ptr & operator=( shared_ptr && r ) // never throws { ++#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS ++ boost_debug_shared_ptr_operator_equals (this, get(), use_count(), r.get(), r.use_count()); ++#endif this_type( static_cast< shared_ptr && >( r ) ).swap( *this ); return *this; } @@ -389,27 +472,42 @@ void reset() // never throws in 1.30+ { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_reset (this, get(), use_count(), 0, 0); +#endif this_type().swap(*this); } template void reset(Y * p) // Y must be complete { BOOST_ASSERT(p == 0 || p != px); // catch self-reset errors +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_reset (this, get(), use_count(), p, 0); +#endif this_type(p).swap(*this); } template void reset( Y * p, D d ) { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_reset (this, get(), use_count(), p, 0); +#endif this_type( p, d ).swap( *this ); } template void reset( Y * p, D d, A a ) { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_reset (this, get(), use_count(), p, 0); +#endif this_type( p, d, a ).swap( *this ); } template void reset( shared_ptr const & r, T * p ) { +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + boost_debug_shared_ptr_reset (this, get(), use_count(), r.get(), r.use_count()); +#endif this_type( r, p ).swap( *this ); }