This is the mail archive of the libstdc++@sourceware.cygnus.com mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: auto_ptr patch, second try


I've updated the patch to sync with the STL update.

    Brane

-- 
Branko Čibej                 <branko.cibej@hermes.si>
HERMES SoftLab, Litijska 51, 1000 Ljubljana, Slovenia
voice: (+386 1) 586 53 49     fax: (+386 1) 586 52 70
Index: bits/std_memory.h
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/bits/std_memory.h,v
retrieving revision 1.2
diff -c -p -r1.2 std_memory.h
*** std_memory.h	2000/06/27 20:57:10	1.2
--- std_memory.h	2000/06/29 18:41:37
***************
*** 25,43 ****
  
  __STL_BEGIN_NAMESPACE
  
! #if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \
       defined(__STL_MEMBER_TEMPLATES)
!  
!  template<class _Tp1> struct auto_ptr_ref {
!    _Tp1* _M_ptr;
!    auto_ptr_ref(_Tp1* __p) : _M_ptr(__p) {}
  };
  
! #endif
  
  template <class _Tp> class auto_ptr {
  private:
!   _Tp* _M_ptr;
  
  public:
    typedef _Tp element_type;
--- 25,52 ----
  
  __STL_BEGIN_NAMESPACE
  
! #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
! # if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \
       defined(__STL_MEMBER_TEMPLATES)
! 
! template<typename _Tp> class auto_ptr_ref {
!   template<typename _Tp1> friend class auto_ptr;
!   _Tp* _M_ptr;
!   void*& _M_ptr_ref;
!   explicit auto_ptr_ref(_Tp* __p, void*& __r) __STL_NOTHROW
!     : _M_ptr(__p), _M_ptr_ref(__r) {}
!   _Tp* _M_release() const __STL_NOTHROW {
!     _M_ptr_ref = 0;
!     return _M_ptr;
!   }
  };
  
! # endif /* auto ptr conversions && member templates */
! #endif /* _GLIBCPP_RESOLVE_LIB_DEFECTS */
  
  template <class _Tp> class auto_ptr {
  private:
!   void* _M_ptr;
  
  public:
    typedef _Tp element_type;
*************** public:
*** 46,53 ****
    auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
  
  #ifdef __STL_MEMBER_TEMPLATES
!   template <class _Tp1> auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW
!     : _M_ptr(__a.release()) {}
  #endif /* __STL_MEMBER_TEMPLATES */
  
    auto_ptr& operator=(auto_ptr& __a) __STL_NOTHROW {
--- 55,64 ----
    auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
  
  #ifdef __STL_MEMBER_TEMPLATES
!   template <class _Tp1> auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW {
!     _Tp* const __tmp = __a.release(); // Must have implicit conversion
!     _M_ptr = __tmp;
!   }
  #endif /* __STL_MEMBER_TEMPLATES */
  
    auto_ptr& operator=(auto_ptr& __a) __STL_NOTHROW {
*************** public:
*** 67,93 ****
    // specification here, but omitting it is standard conforming.  Its 
    // presence can be detected only if _Tp::~_Tp() throws, but (17.4.3.6/2)
    // this is prohibited.
!   ~auto_ptr() { delete _M_ptr; }
   
    _Tp& operator*() const __STL_NOTHROW {
!     return *_M_ptr;
    }
    _Tp* operator->() const __STL_NOTHROW {
!     return _M_ptr;
    }
    _Tp* get() const __STL_NOTHROW {
!     return _M_ptr;
    }
    _Tp* release() __STL_NOTHROW {
!     _Tp* __tmp = _M_ptr;
      _M_ptr = 0;
      return __tmp;
    }
    void reset(_Tp* __p = 0) __STL_NOTHROW {
!     if (__p != _M_ptr) {
!       delete _M_ptr;
        _M_ptr = __p;
!     }    
    }
  
    // According to the C++ standard, these conversions are required.  Most
--- 78,105 ----
    // specification here, but omitting it is standard conforming.  Its 
    // presence can be detected only if _Tp::~_Tp() throws, but (17.4.3.6/2)
    // this is prohibited.
!   ~auto_ptr() { delete this->get(); }
   
    _Tp& operator*() const __STL_NOTHROW {
!     return *this->get();
    }
    _Tp* operator->() const __STL_NOTHROW {
!     return this->get();
    }
    _Tp* get() const __STL_NOTHROW {
!     return static_cast<_Tp*>(_M_ptr);
    }
    _Tp* release() __STL_NOTHROW {
!     _Tp* const __tmp = this->get();
      _M_ptr = 0;
      return __tmp;
    }
    void reset(_Tp* __p = 0) __STL_NOTHROW {
!     _Tp* const __tmp = this->get();
!     if (__p != __tmp) {
!       delete __tmp;
        _M_ptr = __p;
!     }
    }
  
    // According to the C++ standard, these conversions are required.  Most
*************** public:
*** 98,117 ****
  #if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \
      defined(__STL_MEMBER_TEMPLATES)
  
  public:
    auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW
!     : _M_ptr(__ref._M_ptr) {}
  
    auto_ptr& operator=(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW {
!     if (__ref._M_ptr != this->get()) {
!       delete _M_ptr;
!       _M_ptr = __ref._M_ptr;
!     }
      return *this;
    }
  
    template <class _Tp1> operator auto_ptr_ref<_Tp1>() __STL_NOTHROW 
!     { return auto_ptr_ref<_Tp>(this->release()); }
    template <class _Tp1> operator auto_ptr<_Tp1>() __STL_NOTHROW
      { return auto_ptr<_Tp1>(this->release()); }
  
--- 110,142 ----
  #if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \
      defined(__STL_MEMBER_TEMPLATES)
  
+ # ifndef _GLIBCPP_RESOLVE_LIB_DEFECTS
+ private:
+   template<typename _Tp1> struct auto_ptr_ref {
+     _Tp1* _M_ptr;
+     void*& _M_ptr_ref;
+     explicit auto_ptr_ref(_Tp1* __p, void*& __r) __STL_NOTHROW
+       : _M_ptr(__p), _M_ptr_ref(__r) {}
+     _Tp1* _M_release() const __STL_NOTHROW {
+       _M_ptr_ref = 0;
+       return _M_ptr;
+     }
+   };
+ # endif /* !_GLIBCPP_RESOLVE_LIB_DEFECTS */
+ 
  public:
    auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW
!     : _M_ptr(__ref._M_release()) {}
  
+ # ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
    auto_ptr& operator=(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW {
!     reset(__ref._M_release());
      return *this;
    }
+ # endif /* _GLIBCPP_RESOLVE_LIB_DEFECTS */
  
    template <class _Tp1> operator auto_ptr_ref<_Tp1>() __STL_NOTHROW 
!     { return auto_ptr_ref<_Tp1>(this->get(), _M_ptr); }
    template <class _Tp1> operator auto_ptr<_Tp1>() __STL_NOTHROW
      { return auto_ptr<_Tp1>(this->release()); }
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]