CrossFramework Library

XBase/AutoPtr.hpp

説明を見る。
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
 全て クラス ネームスペース ファイル 関数 変数 型定義 列挙型 列挙型の値 マクロ定義