aboutsummaryrefslogtreecommitdiff
path: root/libstdc++/stl/memory
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1998-09-02 17:25:15 +0000
committerJason Merrill <jason@gcc.gnu.org>1998-09-02 13:25:15 -0400
commitdf9262681b6bf7e555619c492c5ec9d7fd340ac1 (patch)
treef1b8986118d98ea46eb8767eba9ca67b12541d4f /libstdc++/stl/memory
parent514a1f18eeb8d9b3da90ae36d5913dfabe8203fd (diff)
downloadgcc-df9262681b6bf7e555619c492c5ec9d7fd340ac1.zip
gcc-df9262681b6bf7e555619c492c5ec9d7fd340ac1.tar.gz
gcc-df9262681b6bf7e555619c492c5ec9d7fd340ac1.tar.bz2
algorithm [...]: Update to SGI STL 3.11.
* algorithm alloc.h defalloc.h hash_map.h hash_set.h iterator memory pthread_alloc pthread_alloc.h rope ropeimpl.h stl_algo.h stl_algobase.h stl_alloc.h stl_bvector.h stl_config.h stl_construct.h stl_deque.h stl_function.h stl_hash_fun.h stl_hash_map.h stl_hash_set.h stl_hashtable.h stl_heap.h stl_iterator.h stl_list.h stl_map.h stl_multimap.h stl_multiset.h stl_numeric.h stl_pair.h stl_queue.h stl_raw_storage_iter.h stl_relops.h stl_rope.h stl_set.h stl_slist.h stl_stack.h stl_tempbuf.h stl_tree.h stl_uninitialized.h stl_vector.h tempbuf.h type_traits.h: Update to SGI STL 3.11. From-SVN: r22190
Diffstat (limited to 'libstdc++/stl/memory')
-rw-r--r--libstdc++/stl/memory103
1 files changed, 61 insertions, 42 deletions
diff --git a/libstdc++/stl/memory b/libstdc++/stl/memory
index a806588..168843d 100644
--- a/libstdc++/stl/memory
+++ b/libstdc++/stl/memory
@@ -22,64 +22,83 @@
#include <stl_uninitialized.h>
#include <stl_raw_storage_iter.h>
-// Note: auto_ptr is commented out in this release because the details
-// of the interface are still being discussed by the C++ standardization
-// committee. It will be included once the iterface is finalized.
-#if 0
-#if defined(_MUTABLE_IS_KEYWORD) && defined(_EXPLICIT_IS_KEYWORD) && \
- defined(__STL_MEMBER_TEMPLATES)
+#if defined(__STL_MEMBER_TEMPLATES)
__STL_BEGIN_NAMESPACE
-template <class X> class auto_ptr {
+template <class _Tp> class auto_ptr {
private:
- X* ptr;
- mutable bool owns;
+ _Tp* _M_ptr;
+
public:
- typedef X element_type;
- explicit auto_ptr(X* p = 0) __STL_NOTHROW : ptr(p), owns(p) {}
- auto_ptr(const auto_ptr& a) __STL_NOTHROW : ptr(a.ptr), owns(a.owns) {
- a.owns = 0;
+ typedef _Tp element_type;
+ explicit auto_ptr(_Tp* __p = 0) __STL_NOTHROW : _M_ptr(__p) {}
+ auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
+ template <class _Tp1> auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW
+ : _M_ptr(__a.release()) {}
+ auto_ptr& operator=(auto_ptr& __a) __STL_NOTHROW {
+ if (&__a != this) {
+ delete _M_ptr;
+ _M_ptr = __a.release();
+ }
+ return *this;
}
- template <class T> auto_ptr(const auto_ptr<T>& a) __STL_NOTHROW
- : ptr(a.ptr), owns(a.owns) {
- a.owns = 0;
+ template <class _Tp1>
+ auto_ptr& operator=(auto_ptr<_Tp1>& __a) __STL_NOTHROW {
+ if (__a.get() != this->get()) {
+ delete _M_ptr;
+ _M_ptr = __a.release();
+ }
+ return *this;
}
+ ~auto_ptr() __STL_NOTHROW { delete _M_ptr; }
- auto_ptr& operator=(const auto_ptr& a) __STL_NOTHROW {
- if (&a != this) {
- if (owns)
- delete ptr;
- owns = a.owns;
- ptr = a.ptr;
- a.owns = 0;
- }
+ _Tp& operator*() const __STL_NOTHROW {
+ return *_M_ptr;
}
- template <class T> auto_ptr& operator=(const auto_ptr<T>& a) __STL_NOTHROW {
- if (&a != this) {
- if (owns)
- delete ptr;
- owns = a.owns;
- ptr = a.ptr;
- a.owns = 0;
- }
+ _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;
}
- ~auto_ptr() {
- if (owns)
- delete ptr;
+ void reset(_Tp* __p = 0) __STL_NOTHROW {
+ delete _M_ptr;
+ _M_ptr = __p;
}
- X& operator*() const __STL_NOTHROW { return *ptr; }
- X* operator->() const __STL_NOTHROW { return ptr; }
- X* get() const __STL_NOTHROW { return ptr; }
- X* release const __STL_NOTHROW { owns = false; return ptr }
+ // According to the C++ standard, these conversions are required. Most
+ // present-day compilers, however, do not enforce that requirement---and,
+ // in fact, most present-day compilers do not support the language
+ // features that these conversions rely on.
+
+#ifdef __SGI_STL_USE_AUTO_PTR_CONVERSIONS
+
+private:
+ template<class _Tp1> struct auto_ptr_ref {
+ _Tp1* _M_ptr;
+ auto_ptr_ref(_Tp1* __p) : _M_ptr(__p) {}
+ };
+
+public:
+ auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW
+ : _M_ptr(__ref._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()) }
+
+#endif /* __SGI_STL_USE_AUTO_PTR_CONVERSIONS */
};
__STL_END_NAMESPACE
-#endif /* mutable && explicit && member templates */
-#endif /* 0 */
-
+#endif /* member templates */
#endif /* __SGI_STL_MEMORY */