Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r81337 - in branches/release/boost: . smart_ptr
From: pdimov_at_[hidden]
Date: 2012-11-14 08:26:31


Author: pdimov
Date: 2012-11-14 08:26:30 EST (Wed, 14 Nov 2012)
New Revision: 81337
URL: http://svn.boost.org/trac/boost/changeset/81337

Log:
Merged revision(s) 57197, 57206, 57423, 57518 from trunk:
Renamed enable_shared_from_this2 to enable_shared_from_raw and
added shared_from_raw free function. These changes fix the pointer
value in shared_ptr which were obtained before an external shared_ptr has
taken ownership of the object (for example when a shared_ptr to
this is obtained in an object's constructor).

........
Brought back code which fixes get_deleter when it is called on a deleter
which has been wrapped inside a deleter_wrapper by "shared_from_raw() in
constructors" support.

........
Added weak_from_raw(), for use in conjunction with
enable_shared_from_raw base class.

........
Fixed access to enable_shared_from_raw::weak_this_ when
BOOST_NO_MEMBER_TEMPLATE_FRIENDS is defined.

........

Added:
   branches/release/boost/smart_ptr/enable_shared_from_raw.hpp (contents, props changed)
      - copied, changed from r57197, /trunk/boost/smart_ptr/enable_shared_from_raw.hpp
Removed:
   branches/release/boost/smart_ptr/enable_shared_from_this2.hpp
Properties modified:
   branches/release/boost/ (props changed)
Text files modified:
   branches/release/boost/smart_ptr/enable_shared_from_raw.hpp | 45 ++++++++++-------------------
   branches/release/boost/smart_ptr/shared_ptr.hpp | 59 +++++++++++++++++++++++++++++++++------
   branches/release/boost/smart_ptr/weak_ptr.hpp | 5 ++-
   3 files changed, 68 insertions(+), 41 deletions(-)

Copied: branches/release/boost/smart_ptr/enable_shared_from_raw.hpp (from r57197, /trunk/boost/smart_ptr/enable_shared_from_raw.hpp)
==============================================================================
--- /trunk/boost/smart_ptr/enable_shared_from_raw.hpp (original)
+++ branches/release/boost/smart_ptr/enable_shared_from_raw.hpp 2012-11-14 08:26:30 EST (Wed, 14 Nov 2012)
@@ -21,35 +21,12 @@
 namespace boost
 {
 template<typename T> boost::shared_ptr<T> shared_from_raw(T *);
+template<typename T> boost::weak_ptr<T> weak_from_raw(T *);
 
 namespace detail
 {
 template< class X, class Y > inline void sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe );
 
-class esft2_deleter_wrapper
-{
-private:
-
- shared_ptr<void> deleter_;
-
-public:
-
- esft2_deleter_wrapper()
- {
- }
-
- template< class T > void set_deleter( shared_ptr<T> const & deleter )
- {
- deleter_ = deleter;
- }
-
- template< class T> void operator()( T* )
- {
- BOOST_ASSERT( deleter_.use_count() <= 1 );
- deleter_.reset();
- }
-};
-
 } // namespace detail
 
 class enable_shared_from_raw
@@ -76,11 +53,6 @@
 
 private:
 
- mutable weak_ptr<void> weak_this_;
- mutable shared_ptr<void> shared_this_;
-
-private:
-
     void init_weak_once() const
     {
         if( weak_this_.expired() )
@@ -96,6 +68,7 @@
 private:
     template<class Y> friend class shared_ptr;
     template<typename T> friend boost::shared_ptr<T> shared_from_raw(T *);
+ template<typename T> friend boost::weak_ptr<T> weak_from_raw(T *);
     template< class X, class Y > friend inline void detail::sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe );
 #endif
 
@@ -133,14 +106,28 @@
             shared_this_.reset();
         }
     }
+
+ mutable weak_ptr<void> weak_this_;
+private:
+ mutable shared_ptr<void> shared_this_;
 };
 
 template<typename T>
 boost::shared_ptr<T> shared_from_raw(T *p)
 {
+ BOOST_ASSERT(p != 0);
     return boost::shared_ptr<T>(p->enable_shared_from_raw::shared_from_this(), p);
 }
 
+template<typename T>
+boost::weak_ptr<T> weak_from_raw(T *p)
+{
+ BOOST_ASSERT(p != 0);
+ boost::weak_ptr<T> result;
+ result._internal_aliasing_assign(p->enable_shared_from_raw::weak_this_, p);
+ return result;
+}
+
 namespace detail
 {
     template< class X, class Y > inline void sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe )

Deleted: branches/release/boost/smart_ptr/enable_shared_from_this2.hpp
==============================================================================
--- branches/release/boost/smart_ptr/enable_shared_from_this2.hpp 2012-11-14 08:26:30 EST (Wed, 14 Nov 2012)
+++ (empty file)
@@ -1,132 +0,0 @@
-#ifndef BOOST_ENABLE_SHARED_FROM_THIS2_HPP_INCLUDED
-#define BOOST_ENABLE_SHARED_FROM_THIS2_HPP_INCLUDED
-
-//
-// enable_shared_from_this2.hpp
-//
-// Copyright 2002, 2009 Peter Dimov
-// Copyright 2008 Frank Mori Hess
-//
-// Distributed under the Boost Software License, Version 1.0.
-// See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt
-//
-
-#include <boost/config.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/assert.hpp>
-#include <boost/detail/workaround.hpp>
-
-namespace boost
-{
-
-namespace detail
-{
-
-class esft2_deleter_wrapper
-{
-private:
-
- shared_ptr<void> deleter_;
-
-public:
-
- esft2_deleter_wrapper()
- {
- }
-
- template< class T > void set_deleter( shared_ptr<T> const & deleter )
- {
- deleter_ = deleter;
- }
-
- template< class T> void operator()( T* )
- {
- BOOST_ASSERT( deleter_.use_count() <= 1 );
- deleter_.reset();
- }
-};
-
-} // namespace detail
-
-template< class T > class enable_shared_from_this2
-{
-protected:
-
- enable_shared_from_this2()
- {
- }
-
- enable_shared_from_this2( enable_shared_from_this2 const & )
- {
- }
-
- enable_shared_from_this2 & operator=( enable_shared_from_this2 const & )
- {
- return *this;
- }
-
- ~enable_shared_from_this2()
- {
- BOOST_ASSERT( shared_this_.use_count() <= 1 ); // make sure no dangling shared_ptr objects exist
- }
-
-private:
-
- mutable weak_ptr<T> weak_this_;
- mutable shared_ptr<T> shared_this_;
-
-public:
-
- shared_ptr<T> shared_from_this()
- {
- init_weak_once();
- return shared_ptr<T>( weak_this_ );
- }
-
- shared_ptr<T const> shared_from_this() const
- {
- init_weak_once();
- return shared_ptr<T>( weak_this_ );
- }
-
-private:
-
- void init_weak_once() const
- {
- if( weak_this_._empty() )
- {
- shared_this_.reset( static_cast< T* >( 0 ), detail::esft2_deleter_wrapper() );
- weak_this_ = shared_this_;
- }
- }
-
-public: // actually private, but avoids compiler template friendship issues
-
- // Note: invoked automatically by shared_ptr; do not call
- template<class X, class Y> void _internal_accept_owner( shared_ptr<X> * ppx, Y * py ) const
- {
- BOOST_ASSERT( ppx != 0 );
-
- if( weak_this_.use_count() == 0 )
- {
- weak_this_ = shared_ptr<T>( *ppx, py );
- }
- else if( shared_this_.use_count() != 0 )
- {
- BOOST_ASSERT( ppx->unique() ); // no weak_ptrs should exist either, but there's no way to check that
-
- detail::esft2_deleter_wrapper * pd = boost::get_deleter<detail::esft2_deleter_wrapper>( shared_this_ );
- BOOST_ASSERT( pd != 0 );
-
- pd->set_deleter( *ppx );
-
- ppx->reset( shared_this_, ppx->get() );
- shared_this_.reset();
- }
- }
-};
-
-} // namespace boost
-
-#endif // #ifndef BOOST_ENABLE_SHARED_FROM_THIS2_HPP_INCLUDED

Modified: branches/release/boost/smart_ptr/shared_ptr.hpp
==============================================================================
--- branches/release/boost/smart_ptr/shared_ptr.hpp (original)
+++ branches/release/boost/smart_ptr/shared_ptr.hpp 2012-11-14 08:26:30 EST (Wed, 14 Nov 2012)
@@ -57,7 +57,7 @@
 template<class T> class shared_ptr;
 template<class T> class weak_ptr;
 template<class T> class enable_shared_from_this;
-template<class T> class enable_shared_from_this2;
+class enable_shared_from_raw;
 
 namespace detail
 {
@@ -106,13 +106,7 @@
     }
 }
 
-template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_this2< T > const * pe )
-{
- if( pe != 0 )
- {
- pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) );
- }
-}
+template< class X, class Y > inline void sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe );
 
 #ifdef _MANAGED
 
@@ -612,6 +606,9 @@
 
 // get_deleter
 
+namespace detail
+{
+
 #if ( defined(__GNUC__) && BOOST_WORKAROUND(__GNUC__, < 3) ) || \
     ( defined(__EDG_VERSION__) && BOOST_WORKAROUND(__EDG_VERSION__, <= 238) ) || \
     ( defined(__HP_aCC) && BOOST_WORKAROUND(__HP_aCC, <= 33500) )
@@ -619,7 +616,7 @@
 // g++ 2.9x doesn't allow static_cast<X const *>(void *)
 // apparently EDG 2.38 and HP aCC A.03.35 also don't accept it
 
-template<class D, class T> D * get_deleter(shared_ptr<T> const & p)
+template<class D, class T> D * basic_get_deleter(shared_ptr<T> const & p)
 {
     void const * q = p._internal_get_deleter(BOOST_SP_TYPEID(D));
     return const_cast<D *>(static_cast<D const *>(q));
@@ -627,13 +624,55 @@
 
 #else
 
-template<class D, class T> D * get_deleter(shared_ptr<T> const & p)
+template<class D, class T> D * basic_get_deleter(shared_ptr<T> const & p)
 {
     return static_cast<D *>(p._internal_get_deleter(BOOST_SP_TYPEID(D)));
 }
 
 #endif
 
+class esft2_deleter_wrapper
+{
+private:
+
+ shared_ptr<void> deleter_;
+
+public:
+
+ esft2_deleter_wrapper()
+ {
+ }
+
+ template< class T > void set_deleter( shared_ptr<T> const & deleter )
+ {
+ deleter_ = deleter;
+ }
+ template<typename D> D* get_deleter() const
+ {
+ return boost::detail::basic_get_deleter<D>(deleter_);
+ }
+ template< class T> void operator()( T* )
+ {
+ BOOST_ASSERT( deleter_.use_count() <= 1 );
+ deleter_.reset();
+ }
+};
+
+} // namespace detail
+
+template<class D, class T> D * get_deleter(shared_ptr<T> const & p)
+{
+ D *del = detail::basic_get_deleter<D>(p);
+ if(del == 0)
+ {
+ detail::esft2_deleter_wrapper *del_wrapper = detail::basic_get_deleter<detail::esft2_deleter_wrapper>(p);
+// The following get_deleter method call is fully qualified because
+// older versions of gcc (2.95, 3.2.3) fail to compile it when written del_wrapper->get_deleter<D>()
+ if(del_wrapper) del = del_wrapper->::boost::detail::esft2_deleter_wrapper::get_deleter<D>();
+ }
+ return del;
+}
+
 // atomic access
 
 #if !defined(BOOST_SP_NO_ATOMIC_ACCESS)

Modified: branches/release/boost/smart_ptr/weak_ptr.hpp
==============================================================================
--- branches/release/boost/smart_ptr/weak_ptr.hpp (original)
+++ branches/release/boost/smart_ptr/weak_ptr.hpp 2012-11-14 08:26:30 EST (Wed, 14 Nov 2012)
@@ -194,10 +194,11 @@
         pn.swap(other.pn);
     }
 
- void _internal_assign(T * px2, boost::detail::shared_count const & pn2)
+ template<typename Y>
+ void _internal_aliasing_assign(weak_ptr<Y> const & r, T * px2)
     {
         px = px2;
- pn = pn2;
+ pn = r.pn;
     }
 
     template<class Y> bool owner_before( weak_ptr<Y> const & rhs ) const


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk