1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/epoc32/include/stdapis/stlport/stl/_auto_ptr.h Wed Mar 31 12:33:34 2010 +0100
1.3 @@ -0,0 +1,175 @@
1.4 +/*
1.5 + * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved.
1.6 + * Copyright (c) 1997-1999
1.7 + * Silicon Graphics Computer Systems, Inc.
1.8 + *
1.9 + * Copyright (c) 1999
1.10 + * Boris Fomitchev
1.11 + *
1.12 + * This material is provided "as is", with absolutely no warranty expressed
1.13 + * or implied. Any use is at your own risk.
1.14 + *
1.15 + * Permission to use or copy this software for any purpose is hereby granted
1.16 + * without fee, provided the above notices are retained on all copies.
1.17 + * Permission to modify the code and to distribute modified code is granted,
1.18 + * provided the above notices are retained, and a notice that the code was
1.19 + * modified is included with the above copyright notice.
1.20 + *
1.21 + */
1.22 +
1.23 +#ifndef _STLP_AUTO_PTR_H
1.24 +# define _STLP_AUTO_PTR_H
1.25 +
1.26 +_STLP_BEGIN_NAMESPACE
1.27 +// implementation primitive
1.28 +class __ptr_base {
1.29 +public:
1.30 + void* _M_p;
1.31 + void __set(const void* __p) { _M_p = __CONST_CAST(void*,__p); }
1.32 + void __set(void* __p) { _M_p = __p; }
1.33 +};
1.34 +
1.35 +template <class _Tp> class auto_ptr_ref {
1.36 +public:
1.37 + __ptr_base& _M_r;
1.38 + _Tp* const _M_p;
1.39 +
1.40 + auto_ptr_ref(__ptr_base& __r, _Tp* __p) : _M_r(__r), _M_p(__p) { }
1.41 +
1.42 + _Tp* release() const { _M_r.__set((void*)0); return _M_p; }
1.43 +
1.44 +};
1.45 +
1.46 +template<class _Tp> class auto_ptr : public __ptr_base {
1.47 +public:
1.48 + typedef _Tp element_type;
1.49 + typedef auto_ptr<_Tp> _Self;
1.50 +
1.51 + _Tp* release() {
1.52 + _Tp* __px = this->get();
1.53 + this->_M_p = 0;
1.54 + return __px;
1.55 + }
1.56 +
1.57 + void reset(_Tp* __px=0) {
1.58 + _Tp* __pt = this->get();
1.59 + if (__px != __pt)
1.60 + delete __pt;
1.61 + this->__set(__px);
1.62 + }
1.63 +
1.64 + _Tp* get() const { return __REINTERPRET_CAST(_Tp*,__CONST_CAST(void*,_M_p)); }
1.65 +
1.66 +# if !defined (_STLP_NO_ARROW_OPERATOR)
1.67 + _Tp* operator->() const {
1.68 + _STLP_VERBOSE_ASSERT(get()!=0, _StlMsg_AUTO_PTR_NULL)
1.69 + return get();
1.70 + }
1.71 +# endif
1.72 + _Tp& operator*() const {
1.73 + _STLP_VERBOSE_ASSERT(get()!=0, _StlMsg_AUTO_PTR_NULL)
1.74 + return *get();
1.75 + }
1.76 +
1.77 + auto_ptr() {
1.78 + this->_M_p = 0;
1.79 +# ifdef _STLP_USE_TRAP_LEAVE
1.80 + CleanupStack::PushL(TCleanupItem(Close, (void*)this));
1.81 +# endif
1.82 + }
1.83 +
1.84 + explicit auto_ptr(_Tp* __px) {
1.85 + this->__set(__px);
1.86 +# ifdef _STLP_USE_TRAP_LEAVE
1.87 + CleanupStack::PushL(TCleanupItem(Close, (void*)this));
1.88 +# endif
1.89 + }
1.90 +
1.91 +#if defined (_STLP_MEMBER_TEMPLATES)
1.92 +# if !defined (_STLP_NO_TEMPLATE_CONVERSIONS)
1.93 + template<class _Tp1> auto_ptr(auto_ptr<_Tp1>& __r) {
1.94 + _Tp* __conversionCheck = __r.release();
1.95 + this->__set(__conversionCheck);
1.96 +# ifdef _STLP_USE_TRAP_LEAVE
1.97 + CleanupStack::PushL(TCleanupItem(Close, (void*)this));
1.98 +# endif
1.99 + }
1.100 +# endif
1.101 + template<class _Tp1> auto_ptr<_Tp>& operator=(auto_ptr<_Tp1>& __r) {
1.102 + _Tp* __conversionCheck = __r.release();
1.103 + reset(__conversionCheck);
1.104 + return *this;
1.105 + }
1.106 +#endif /* _STLP_MEMBER_TEMPLATES */
1.107 +
1.108 + auto_ptr(_Self& __r)
1.109 + { this->__set(__r.release());
1.110 +# ifdef _STLP_USE_TRAP_LEAVE
1.111 + CleanupStack::PushL(TCleanupItem(Close, (void*)this));
1.112 +# endif
1.113 + }
1.114 +
1.115 + _Self& operator=(_Self& __r) {
1.116 + reset(__r.release());
1.117 + return *this;
1.118 + }
1.119 +
1.120 + ~auto_ptr() { _STLP_POP_ITEM reset(0); }
1.121 +
1.122 + auto_ptr(auto_ptr_ref<_Tp> __r) {
1.123 + this->__set(__r.release());
1.124 +# ifdef _STLP_USE_TRAP_LEAVE
1.125 + CleanupStack::PushL(TCleanupItem(Close, (void*)this));
1.126 +# endif
1.127 + }
1.128 +
1.129 + _Self& operator=(auto_ptr_ref<_Tp> __r) {
1.130 + reset(__r.release());
1.131 + return *this;
1.132 + }
1.133 +
1.134 +
1.135 + _Self& operator=(_Tp* __px) {
1.136 + reset(__px);
1.137 + return *this;
1.138 + }
1.139 +
1.140 +
1.141 +
1.142 +# if defined(_STLP_MEMBER_TEMPLATES) && !defined(_STLP_NO_TEMPLATE_CONVERSIONS)
1.143 + template<class _Tp1> operator auto_ptr_ref<_Tp1>() {
1.144 + return auto_ptr_ref<_Tp1>(*this, this->get());
1.145 + }
1.146 + template<class _Tp1> operator auto_ptr<_Tp1>() {
1.147 + return auto_ptr<_Tp1>(release());
1.148 + }
1.149 +# else
1.150 + operator auto_ptr_ref<_Tp>()
1.151 + { return auto_ptr_ref<_Tp>(*this, this->get()); }
1.152 +# endif
1.153 +
1.154 +# ifdef _STLP_USE_TRAP_LEAVE
1.155 + static void Close(void* aPtr);
1.156 +# endif
1.157 +
1.158 +};
1.159 +
1.160 +# ifdef _STLP_USE_TRAP_LEAVE
1.161 +template <class _Tp>
1.162 +void
1.163 +auto_ptr<_Tp>::Close(void* aPtr)
1.164 +{
1.165 + auto_ptr<_Tp>* self = (auto_ptr<_Tp>*)aPtr;
1.166 + self->reset(0);
1.167 +}
1.168 +# endif
1.169 +
1.170 +
1.171 +_STLP_END_NAMESPACE
1.172 +
1.173 +#endif /* _STLP_AUTO_PTR_H */
1.174 +
1.175 +// Local Variables:
1.176 +// mode:C++
1.177 +// End:
1.178 +