2 * Copyright (c) 1997-1999
3 * Silicon Graphics Computer Systems, Inc.
8 * This material is provided "as is", with absolutely no warranty expressed
9 * or implied. Any use is at your own risk.
11 * Permission to use or copy this software for any purpose is hereby granted
12 * without fee, provided the above notices are retained on all copies.
13 * Permission to modify the code and to distribute modified code is granted,
14 * provided the above notices are retained, and a notice that the code was
15 * modified is included with the above copyright notice.
19 #ifndef _STLP_AUTO_PTR_H
20 #define _STLP_AUTO_PTR_H
23 // implementation primitive
27 void __set(const volatile void* p
) { _M_p
= __CONST_CAST(void*,p
); }
28 void __set(void* p
) { _M_p
= p
; }
37 auto_ptr_ref(__ptr_base
& __r
, _Tp
* __p
) : _M_r(__r
), _M_p(__p
) { }
39 _Tp
* release() const { _M_r
.__set(__STATIC_CAST(void*, 0)); return _M_p
; }
42 //explicitely defined as private to avoid warnings:
43 typedef auto_ptr_ref
<_Tp
> _Self
;
44 _Self
& operator = (_Self
const&);
48 class auto_ptr
: public __ptr_base
{
50 typedef _Tp element_type
;
51 typedef auto_ptr
<_Tp
> _Self
;
53 _Tp
* release() _STLP_NOTHROW
{
54 _Tp
* __px
= this->get();
59 void reset(_Tp
* __px
= 0) _STLP_NOTHROW
{
60 _Tp
* __pt
= this->get();
66 _Tp
* get() const _STLP_NOTHROW
67 #if !defined (__GNUC__) || (__GNUC__ > 2)
68 { return __STATIC_CAST(_Tp
*, _M_p
); }
70 { return __REINTERPRET_CAST(_Tp
*, _M_p
); }
73 #if !defined (_STLP_NO_ARROW_OPERATOR)
74 _Tp
* operator->() const _STLP_NOTHROW
{
75 _STLP_VERBOSE_ASSERT(get() != 0, _StlMsg_AUTO_PTR_NULL
)
79 _Tp
& operator*() const _STLP_NOTHROW
{
80 _STLP_VERBOSE_ASSERT(get() != 0, _StlMsg_AUTO_PTR_NULL
)
84 explicit auto_ptr(_Tp
* __px
= 0) _STLP_NOTHROW
{ this->__set(__px
); }
86 #if defined (_STLP_MEMBER_TEMPLATES)
87 # if !defined (_STLP_NO_TEMPLATE_CONVERSIONS)
88 template<class _Tp1
> auto_ptr(auto_ptr
<_Tp1
>& __r
) _STLP_NOTHROW
{
89 _Tp
* __conversionCheck
= __r
.release();
90 this->__set(__conversionCheck
);
93 template<class _Tp1
> auto_ptr
<_Tp
>& operator=(auto_ptr
<_Tp1
>& __r
) _STLP_NOTHROW
{
94 _Tp
* __conversionCheck
= __r
.release();
95 reset(__conversionCheck
);
100 auto_ptr(_Self
& __r
) _STLP_NOTHROW
{ this->__set(__r
.release()); }
102 _Self
& operator=(_Self
& __r
) _STLP_NOTHROW
{
103 reset(__r
.release());
107 ~auto_ptr() _STLP_NOTHROW
{ /* boris : reset(0) might be better */ delete this->get(); }
109 auto_ptr(auto_ptr_ref
<_Tp
> __r
) _STLP_NOTHROW
110 { this->__set(__r
.release()); }
112 _Self
& operator=(auto_ptr_ref
<_Tp
> __r
) _STLP_NOTHROW
{
113 reset(__r
.release());
117 #if defined(_STLP_MEMBER_TEMPLATES) && !defined(_STLP_NO_TEMPLATE_CONVERSIONS)
118 template<class _Tp1
> operator auto_ptr_ref
<_Tp1
>() _STLP_NOTHROW
119 { return auto_ptr_ref
<_Tp1
>(*this, this->get()); }
120 template<class _Tp1
> operator auto_ptr
<_Tp1
>() _STLP_NOTHROW
121 { return auto_ptr
<_Tp1
>(release()); }
123 operator auto_ptr_ref
<_Tp
>() _STLP_NOTHROW
124 { return auto_ptr_ref
<_Tp
>(*this, this->get()); }
129 #endif /* _STLP_AUTO_PTR_H */