From: Branko Cibej Date: Thu, 29 Jun 2000 21:07:04 +0000 (+0000) Subject: std_memory.h (auto_ptr_ref): Reworked and defined only if _GLIBCPP_RESOLVE_LIB_DEFECTS. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c011e2ad8adc191c6c38089cf05ae9f3daaf5a08;p=platform%2Fupstream%2Fgcc.git std_memory.h (auto_ptr_ref): Reworked and defined only if _GLIBCPP_RESOLVE_LIB_DEFECTS. 2000-06-29 Branko Cibej * bits/std_memory.h (auto_ptr_ref): Reworked and defined only if _GLIBCPP_RESOLVE_LIB_DEFECTS. (auto_ptr): _M_ptr changed to void*. (suto_ptr::get): Cast _M_ptr to element type. (auto_ptr::auto_ptr(auto_ptr)): Test implicit convetsion. (auto_ptr::~auto_ptr): Use this->get() instead of _M_ptr. (auto_ptr::operator*): Likewise. (auto_ptr::operator->): Likewise. (auto_ptr::release): Likewise. (auto_ptr::reset): Likewise. (auto_ptr::auto_ptr(auto_ptr_ref)): Initialize from __ref._M_release. (auto_ptr::operator auto_ptr_rev<_Tp1>): Updated. Define nested auto_ptr_ref unless _GLIBCPP_RESOLVE_LIB_DEFECTS. Define operator=(auto_ptr_ref) if _GLIBCPP_RESOLVE_LIB_DEFECTS. From-SVN: r34792 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 605040a..4e2454c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,26 @@ +2000-06-29 + + * bits/char_traits.h (char_traits::eos): Non standard member + function, uglify to __eos. Return char_type(). + * bits/std_ostream.h: Change. + +2000-06-29 Branko Cibej + + * bits/std_memory.h (auto_ptr_ref): Reworked and defined only if + _GLIBCPP_RESOLVE_LIB_DEFECTS. + (auto_ptr): _M_ptr changed to void*. + (suto_ptr::get): Cast _M_ptr to element type. + (auto_ptr::auto_ptr(auto_ptr)): Test implicit convetsion. + (auto_ptr::~auto_ptr): Use this->get() instead of _M_ptr. + (auto_ptr::operator*): Likewise. + (auto_ptr::operator->): Likewise. + (auto_ptr::release): Likewise. + (auto_ptr::reset): Likewise. + (auto_ptr::auto_ptr(auto_ptr_ref)): Initialize from __ref._M_release. + (auto_ptr::operator auto_ptr_rev<_Tp1>): Updated. + Define nested auto_ptr_ref unless _GLIBCPP_RESOLVE_LIB_DEFECTS. + Define operator=(auto_ptr_ref) if _GLIBCPP_RESOLVE_LIB_DEFECTS. + 2000-06-28 Benjamin Kosnik * testsuite/27_io/filebuf.cc: Tweak. diff --git a/libstdc++-v3/bits/std_memory.h b/libstdc++-v3/bits/std_memory.h index 5ee126b..e31634d 100644 --- a/libstdc++-v3/bits/std_memory.h +++ b/libstdc++-v3/bits/std_memory.h @@ -25,19 +25,28 @@ __STL_BEGIN_NAMESPACE -#if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \ - defined(__STL_MEMBER_TEMPLATES) - - template struct auto_ptr_ref { - _Tp1* _M_ptr; - auto_ptr_ref(_Tp1* __p) : _M_ptr(__p) {} +#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS +# if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \ + defined(__STL_MEMBER_TEMPLATES) + +template class auto_ptr_ref { + template 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 +# endif /* auto ptr conversions && member templates */ +#endif /* _GLIBCPP_RESOLVE_LIB_DEFECTS */ template class auto_ptr { private: - _Tp* _M_ptr; + void* _M_ptr; public: typedef _Tp element_type; @@ -46,8 +55,10 @@ public: auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {} #ifdef __STL_MEMBER_TEMPLATES - template auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW - : _M_ptr(__a.release()) {} + template 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 { @@ -67,23 +78,24 @@ public: // 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; } + ~auto_ptr() { delete this->get(); } _Tp& operator*() const __STL_NOTHROW { - return *_M_ptr; + return this->get(); } _Tp* operator->() const __STL_NOTHROW { - return _M_ptr; + return static_cast<_Tp*>(_M_ptr); } _Tp* get() const __STL_NOTHROW { - return _M_ptr; + return static_cast<_Tp*>(_M_ptr); } _Tp* release() __STL_NOTHROW { - _Tp* __tmp = _M_ptr; + _Tp* const __tmp = this->get(); _M_ptr = 0; return __tmp; } void reset(_Tp* __p = 0) __STL_NOTHROW { + _Tp* const __tmp = this->get(); if (__p != _M_ptr) { delete _M_ptr; _M_ptr = __p; @@ -98,23 +110,35 @@ public: #if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \ defined(__STL_MEMBER_TEMPLATES) +# ifndef _GLIBCPP_RESOLVE_LIB_DEFECTS +private: + template 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_ptr) {} - + : _M_ptr(__ref._M_release()) {} + +# ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS 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; + reset(__ref._M_release()); + return *this; } - - template operator auto_ptr_ref<_Tp1>() __STL_NOTHROW - { return auto_ptr_ref<_Tp>(this->release()); } +# endif /* _GLIBCPP_RESOLVE_LIB_DEFECTS */ + + template operator auto_ptr_ref<_Tp1>() __STL_NOTHROW + { return auto_ptr_ref<_Tp1>(this->get(), _M_ptr); } template operator auto_ptr<_Tp1>() __STL_NOTHROW - { return auto_ptr<_Tp1>(this->release()); } - + { return auto_ptr<_Tp1>(this->release()); } #endif /* auto ptr conversions && member templates */ };