diff options
author | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2000-07-04 01:21:24 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2000-07-04 01:21:24 +0000 |
commit | 4f647814cefff8ee95ac918a8484d5da8c415825 (patch) | |
tree | 0a468a34f9b3ef6e61ceaef10e84924c276245e5 | |
parent | c14286b068b0dd35349304b82e50085144253c25 (diff) | |
download | gcc-4f647814cefff8ee95ac918a8484d5da8c415825.zip gcc-4f647814cefff8ee95ac918a8484d5da8c415825.tar.gz gcc-4f647814cefff8ee95ac918a8484d5da8c415825.tar.bz2 |
std_memory.h: Revert.
2000-07-03 Benjamin Kosnik <bkoz@purist.soma.redhat.com>
* bits/std_memory.h: Revert.
From-SVN: r34858
-rw-r--r-- | libstdc++-v3/bits/std_memory.h | 78 |
1 files changed, 27 insertions, 51 deletions
diff --git a/libstdc++-v3/bits/std_memory.h b/libstdc++-v3/bits/std_memory.h index e31634d..5ee126b 100644 --- a/libstdc++-v3/bits/std_memory.h +++ b/libstdc++-v3/bits/std_memory.h @@ -25,28 +25,19 @@ __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; - } +#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 /* auto ptr conversions && member templates */ -#endif /* _GLIBCPP_RESOLVE_LIB_DEFECTS */ +#endif template <class _Tp> class auto_ptr { private: - void* _M_ptr; + _Tp* _M_ptr; public: typedef _Tp element_type; @@ -55,10 +46,8 @@ public: 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; - } + 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 { @@ -78,24 +67,23 @@ 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 this->get(); } + ~auto_ptr() { delete _M_ptr; } _Tp& operator*() const __STL_NOTHROW { - return this->get(); + return *_M_ptr; } _Tp* operator->() const __STL_NOTHROW { - return static_cast<_Tp*>(_M_ptr); + return _M_ptr; } _Tp* get() const __STL_NOTHROW { - return static_cast<_Tp*>(_M_ptr); + return _M_ptr; } _Tp* release() __STL_NOTHROW { - _Tp* const __tmp = this->get(); + _Tp* __tmp = _M_ptr; _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; @@ -110,35 +98,23 @@ public: #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 + : _M_ptr(__ref._M_ptr) {} + auto_ptr& operator=(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW { - reset(__ref._M_release()); - return *this; + if (__ref._M_ptr != this->get()) { + delete _M_ptr; + _M_ptr = __ref._M_ptr; + } + 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_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()); } + { return auto_ptr<_Tp1>(this->release()); } + #endif /* auto ptr conversions && member templates */ }; |