cel_autoptr.h

Go to the documentation of this file.
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_

This document is automatically generated using doxygen 1.5.4 at Fri Jun 27 18:21:54 2008.