CrossFramework Library
|
00001 00006 #if defined(XBASE_INCLUDED_AUTOPTR_HPP) 00007 #else 00008 #define XBASE_INCLUDED_AUTOPTR_HPP 00009 00010 //------------------------------------------------------------ 00011 namespace XBase { 00013 00014 00015 template< typename T > 00016 class AutoPtr 00017 { 00018 public: 00020 00021 00022 explicit AutoPtr( T* aPtr = 0 ) 00023 : mPtr( aPtr ) 00024 { 00025 } 00026 00028 AutoPtr( const AutoPtr<T>& aPtr ) 00029 : mPtr( 0 ) 00030 { 00031 *this = aPtr; 00032 } 00033 00035 template< typename OtherType > 00036 AutoPtr( const AutoPtr<OtherType>& aPtr ) 00037 : mPtr( 0 ) 00038 { 00039 *this = aPtr; 00040 } 00041 00043 ~AutoPtr() 00044 { 00045 reset(); 00046 } 00047 00049 00051 00052 00053 bool isNull()const 00054 { 00055 return mPtr == 0; 00056 } 00057 00059 bool isValid()const 00060 { 00061 return mPtr != 0; 00062 } 00063 00065 T& ref()const 00066 { 00067 XBASE_ASSERT( isValid() ); 00068 return *mPtr; 00069 } 00070 00075 T* get()const 00076 { 00077 return mPtr; 00078 } 00080 00082 00083 00084 T* release() 00085 { 00086 XBASE_ASSERT( isValid() ); 00087 T* ptr = mPtr; 00088 mPtr = 0; 00089 return ptr; 00090 } 00091 00093 void reset() 00094 { 00095 reset( 0 ); 00096 } 00097 00099 void reset( T* aPtr ) 00100 { 00101 T* ptr = mPtr; 00102 mPtr = 0; 00103 if ( ptr != 0 ) 00104 { 00105 delete ptr; 00106 } 00107 mPtr = aPtr; 00108 } 00110 00112 00113 00114 AutoPtr< T >& operator=( const AutoPtr< T >& aRHS ) 00115 { 00116 T* ptr = aRHS.mPtr; 00117 aRHS.mPtr = 0; 00118 reset( ptr ); 00119 return *this; 00120 } 00121 00123 template< typename OtherType > 00124 AutoPtr< T >& operator=( const AutoPtr< OtherType >& aRHS ) 00125 { 00126 T* ptr = aRHS.mPtr; 00127 aRHS.mPtr = 0; 00128 reset( ptr ); 00129 return *this; 00130 } 00131 00133 T& operator*()const 00134 { 00135 return ref(); 00136 } 00137 00139 T* operator->()const 00140 { 00141 XBASE_ASSERT( isValid() ); 00142 return get(); 00143 } 00145 00146 private: 00147 mutable T* mPtr; 00148 }; 00150 } 00151 //------------------------------------------------------------ 00152 #endif 00153 // EOF