00001 //---------------------------------------------------------------------------- 00004 // 00005 // (C) 2003-2006 Celartem Technology Inc. All rights reserved. 00006 //---------------------------------------------------------------------------- 00007 00008 #ifndef _cel_autoptr_h_ 00009 #define _cel_autoptr_h_ 00010 00011 #include "cel_types.h" 00012 #include "cel_exception.h" 00013 00014 namespace Celartem 00015 { 00024 template<class T> class AutoPtr 00025 { 00026 public: 00030 AutoPtr() : m_ptr(NULL) 00031 { 00032 } 00033 00037 ~AutoPtr() 00038 { 00039 setObject(NULL); 00040 } 00041 00046 AutoPtr(T* inPtr) : m_ptr(NULL) 00047 { 00048 setObject(inPtr); 00049 } 00050 00055 template<typename U> AutoPtr(U* inPtr) : m_ptr(NULL) 00056 { 00057 setObject((T*)inPtr); 00058 } 00059 00065 AutoPtr(const AutoPtr& inPtr) : m_ptr(NULL) 00066 { 00067 setObject(inPtr.m_ptr); 00068 } 00069 00075 template<class U> AutoPtr(const AutoPtr<U>& inPtr) : m_ptr(NULL) 00076 { 00077 setObject((T*)inPtr.getPtr()); 00078 } 00079 00084 AutoPtr& operator=(T* inPtr) 00085 { 00086 setObject(inPtr); 00087 return *this; 00088 } 00089 00094 template<typename U> AutoPtr& operator=(U* inPtr) 00095 { 00096 setObject((T*)inPtr); 00097 return *this; 00098 } 00099 00105 AutoPtr& operator=(const AutoPtr& inPtr) 00106 { 00107 setObject(inPtr.getPtr()); 00108 return *this; 00109 } 00110 00116 template<class U> AutoPtr& operator=(const AutoPtr<U>& inPtr) 00117 { 00118 setObject((T*)inPtr.getPtr()); 00119 return *this; 00120 } 00121 00128 inline bool isValid() const {return m_ptr ? true : false;} 00129 00136 inline T* getPtr() const {return m_ptr;} 00137 00141 inline T* operator->() const 00142 { 00143 if(_CEL_DEBUG_ && m_ptr == NULL) 00144 celThrow(errNullPointer); 00145 return m_ptr; 00146 } 00147 00158 inline bool isLastRef() const 00159 { 00160 return isValid() && (m_ptr->getReferenceCount() == 1); 00161 } 00162 00166 inline operator T* () const {return m_ptr;} 00167 00171 inline operator AutoPtr<const T>() 00172 { 00173 return (const T*)m_ptr; 00174 } 00175 00181 void setObject(T* inPtr) 00182 { 00183 if(m_ptr == inPtr) // 00184 return; 00185 00186 if(m_ptr) // release the previously referring object 00187 m_ptr->releaseRef(); 00188 00189 m_ptr = inPtr; 00190 if(inPtr) // if new object is not NULL, referring it. 00191 m_ptr->addRef(); 00192 } 00193 00200 void swap(AutoPtr<T>& inPtr) 00201 { 00202 if(m_ptr == inPtr) // 00203 return; 00204 00205 T* tmp = m_ptr; 00206 m_ptr = inPtr.m_ptr; 00207 inPtr.m_ptr = tmp; 00208 } 00209 00214 inline void release() {setObject(NULL);} 00215 00224 inline T* detach() 00225 { 00226 T* temp = m_ptr; 00227 m_ptr = NULL; 00228 return temp; 00229 } 00230 00231 private: 00232 T* m_ptr; 00233 }; 00234 00235 } // namespace Celartem 00236 00237 #endif // _cel_autoptr_h_