19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997-1999 39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc. 49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999 69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev 79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed 99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk. 109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted 129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies. 139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted, 149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was 159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice. 169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_AUTO_PTR_H 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define _STLP_AUTO_PTR_H 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// implementation primitive 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass __ptr_base { 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void* _M_p; 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void __set(const volatile void* p) { _M_p = __CONST_CAST(void*,p); } 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void __set(void* p) { _M_p = p; } 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass auto_ptr_ref { 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __ptr_base& _M_r; 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* const _M_p; 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block auto_ptr_ref(__ptr_base& __r, _Tp* __p) : _M_r(__r), _M_p(__p) { } 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Tp* release() const { _M_r.__set(__STATIC_CAST(void*, 0)); return _M_p; } 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate: 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //explicitely defined as private to avoid warnings: 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef auto_ptr_ref<_Tp> _Self; 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator = (_Self const&); 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _Tp> 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass auto_ptr : public __ptr_base { 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Tp element_type; 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef auto_ptr<_Tp> _Self; 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* release() _STLP_NOTHROW { 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* __px = this->get(); 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->_M_p = 0; 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __px; 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void reset(_Tp* __px = 0) _STLP_NOTHROW { 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* __pt = this->get(); 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__px != __pt) 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block delete __pt; 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->__set(__px); 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* get() const _STLP_NOTHROW 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (__GNUC__) || (__GNUC__ > 2) 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { return __STATIC_CAST(_Tp*, _M_p); } 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { return __REINTERPRET_CAST(_Tp*, _M_p); } 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_ARROW_OPERATOR) 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* operator->() const _STLP_NOTHROW { 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_VERBOSE_ASSERT(get() != 0, _StlMsg_AUTO_PTR_NULL) 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return get(); 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp& operator*() const _STLP_NOTHROW { 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_VERBOSE_ASSERT(get() != 0, _StlMsg_AUTO_PTR_NULL) 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *get(); 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block explicit auto_ptr(_Tp* __px = 0) _STLP_NOTHROW { this->__set(__px); } 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if !defined (_STLP_NO_TEMPLATE_CONVERSIONS) 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template<class _Tp1> auto_ptr(auto_ptr<_Tp1>& __r) _STLP_NOTHROW { 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* __conversionCheck = __r.release(); 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block this->__set(__conversionCheck); 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template<class _Tp1> auto_ptr<_Tp>& operator=(auto_ptr<_Tp1>& __r) _STLP_NOTHROW { 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* __conversionCheck = __r.release(); 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reset(__conversionCheck); 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block auto_ptr(_Self& __r) _STLP_NOTHROW { this->__set(__r.release()); } 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator=(_Self& __r) _STLP_NOTHROW { 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reset(__r.release()); 1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~auto_ptr() _STLP_NOTHROW { /* boris : reset(0) might be better */ delete this->get(); } 1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block auto_ptr(auto_ptr_ref<_Tp> __r) _STLP_NOTHROW 1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { this->__set(__r.release()); } 1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Self& operator=(auto_ptr_ref<_Tp> __r) _STLP_NOTHROW { 1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block reset(__r.release()); 1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *this; 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined(_STLP_MEMBER_TEMPLATES) && !defined(_STLP_NO_TEMPLATE_CONVERSIONS) 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template<class _Tp1> operator auto_ptr_ref<_Tp1>() _STLP_NOTHROW 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return auto_ptr_ref<_Tp1>(*this, this->get()); } 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template<class _Tp1> operator auto_ptr<_Tp1>() _STLP_NOTHROW 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return auto_ptr<_Tp1>(release()); } 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block operator auto_ptr_ref<_Tp>() _STLP_NOTHROW 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return auto_ptr_ref<_Tp>(*this, this->get()); } 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_AUTO_PTR_H */ 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables: 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++ 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End: 134