00001
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef MOCKPP_AUTOPOINTER_H
00032 #define MOCKPP_AUTOPOINTER_H
00033
00034 #include <mockpp/mockpp.h>
00035
00036
00037 MOCKPP_NS_START
00038
00050 template<class X>
00051 class AutoPointer
00052 {
00053 public:
00054
00059 AutoPointer (X* p = 0)
00060 : pointee(p)
00061 {
00062 }
00063
00068 AutoPointer (const AutoPointer& a)
00069 : pointee(const_cast<AutoPointer&>(a).release())
00070 {
00071 }
00072
00073 #if defined(_MSC_VER) && (_MSC_VER <= 1300) // at least not MSCV6
00074
00075 #else
00076
00081 AutoPointer& operator= (const AutoPointer& rhs)
00082 {
00083 reset(const_cast<AutoPointer&>(rhs).release());
00084 return *this;
00085 }
00086
00087 #endif
00088
00093 template <class Y>
00094 AutoPointer& operator= (const AutoPointer<Y>& rhs)
00095 {
00096 #ifdef __BORLANDC__
00097 reset(const_cast<AutoPointer<Y>&>(rhs).release()));
00098 #else
00099 reset(const_cast<Y*>(rhs.release()));
00100 #endif
00101 return *this;
00102 }
00103
00108 template <class Y>
00109 operator AutoPointer<Y>()
00110 {
00111 return AutoPointer<Y>(release());
00112 }
00113
00118 ~AutoPointer ()
00119 {
00120 delete pointee;
00121 }
00122
00127 X& operator*() const
00128 {
00129 return *pointee;
00130 }
00131
00136 X* operator-> () const
00137 {
00138 return pointee;
00139 }
00140
00145 X* get() const
00146 {
00147 return pointee;
00148 }
00149
00154 X* release()
00155 {
00156 X* tmp = pointee;
00157 pointee = 0;
00158 return tmp;
00159 }
00160
00165 void reset (X* p = 0)
00166 {
00167 if (pointee != p)
00168 {
00169 delete pointee;
00170 pointee = p;
00171 }
00172 }
00173
00174 private:
00175
00176 X* pointee;
00177 };
00178
00179
00180 MOCKPP_NS_END
00181
00182
00183 #endif // MOCKPP_AUTOPOINTER_H