dcdd144598 2011-02-23 kinaba: #ifndef _KILIB_KTL_APTR_H_ dcdd144598 2011-02-23 kinaba: #define _KILIB_KTL_APTR_H_ dcdd144598 2011-02-23 kinaba: #include "types.h" dcdd144598 2011-02-23 kinaba: #ifdef _MSC_VER dcdd144598 2011-02-23 kinaba: #pragma warning( disable : 4284 ) // 警告:->のリターン型がうにゃうにゃ dcdd144598 2011-02-23 kinaba: #pragma warning( disable : 4150 ) // 警告:deleteの定義がうにょうにょ dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: #ifndef __ccdoc__ dcdd144598 2011-02-23 kinaba: namespace ki { dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ @pkg ki.KTL //@} dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 自動ポインタ dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // 私の期待する範囲では概ね std::auto_ptr と同じ動作をすると思う…。 dcdd144598 2011-02-23 kinaba: // 車輪の最発明ばんざーい! dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: template<class T> dcdd144598 2011-02-23 kinaba: class aptr dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ コンストラクタ //@} dcdd144598 2011-02-23 kinaba: explicit aptr( T* p = NULL ) dcdd144598 2011-02-23 kinaba: : obj_( p ) {} dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ デストラクタ //@} dcdd144598 2011-02-23 kinaba: ~aptr() dcdd144598 2011-02-23 kinaba: { delete obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 所有権移動 //@} dcdd144598 2011-02-23 kinaba: aptr( aptr<T>& r ) dcdd144598 2011-02-23 kinaba: : obj_ ( r.release() ) {} dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 所有権移動 //@} dcdd144598 2011-02-23 kinaba: aptr<T>& operator=( aptr<T>& r ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( obj_ != r.obj_ ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: delete obj_; dcdd144598 2011-02-23 kinaba: obj_ = r.release(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: return *this; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 間接演算子 //@} dcdd144598 2011-02-23 kinaba: T& operator*() const dcdd144598 2011-02-23 kinaba: { return *obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ メンバ参照 //@} dcdd144598 2011-02-23 kinaba: T* operator->() const dcdd144598 2011-02-23 kinaba: { return obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ポインタ取得 //@} dcdd144598 2011-02-23 kinaba: T* get() const dcdd144598 2011-02-23 kinaba: { return obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 所有権解放 //@} dcdd144598 2011-02-23 kinaba: T* release() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: T* ptr = obj_; dcdd144598 2011-02-23 kinaba: obj_ = NULL; dcdd144598 2011-02-23 kinaba: return ptr; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 有効かどうか //@} dcdd144598 2011-02-23 kinaba: bool isValid() const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return (obj_ != NULL); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: mutable T* obj_; dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 自動ポインタ(配列版) dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: template<class T> dcdd144598 2011-02-23 kinaba: class aarr dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ コンストラクタ //@} dcdd144598 2011-02-23 kinaba: explicit aarr( T* p = NULL ) dcdd144598 2011-02-23 kinaba: : obj_( p ) {} dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ デストラクタ //@} dcdd144598 2011-02-23 kinaba: ~aarr() dcdd144598 2011-02-23 kinaba: { delete [] obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 所有権移動 何故かbccで上手く行かない部分があるのでconst付き //@} dcdd144598 2011-02-23 kinaba: aarr( const aarr<T>& r ) dcdd144598 2011-02-23 kinaba: : obj_ ( const_cast<aarr<T>&>(r).release() ) {} dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 所有権移動 //@} dcdd144598 2011-02-23 kinaba: aarr<T>& operator=( aarr<T>& r ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( obj_ != r.obj_ ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: delete [] obj_; dcdd144598 2011-02-23 kinaba: obj_ = r.release(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: return *this; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ポインタ取得 //@} dcdd144598 2011-02-23 kinaba: T* get() const dcdd144598 2011-02-23 kinaba: { return obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 所有権解放 //@} dcdd144598 2011-02-23 kinaba: T* release() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: T* ptr = obj_; dcdd144598 2011-02-23 kinaba: obj_ = NULL; dcdd144598 2011-02-23 kinaba: return ptr; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 有効かどうか //@} dcdd144598 2011-02-23 kinaba: bool isValid() const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return (obj_ != NULL); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 配列要素アクセス //@} dcdd144598 2011-02-23 kinaba: T& operator[]( int i ) const dcdd144598 2011-02-23 kinaba: { return obj_[i]; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: mutable T* obj_; dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 削除権専有ポインタ dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // 「リソースの獲得はコンストラクタで・解放はデストラクタで」を dcdd144598 2011-02-23 kinaba: // 徹底できるならこんなの使わずに、迷わず const auto_ptr を用いる dcdd144598 2011-02-23 kinaba: // べきです。べきですが、メンバ初期化リストで this を使うとVC++の dcdd144598 2011-02-23 kinaba: // コンパイラに怒られるのが気持悪いので、ついこっちを使ってコンストラクタ dcdd144598 2011-02-23 kinaba: // 関数内で初期化してしまうのでふ…(^^; dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: template<class T> dcdd144598 2011-02-23 kinaba: class dptr dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ コンストラクタ //@} dcdd144598 2011-02-23 kinaba: explicit dptr( T* p = NULL ) dcdd144598 2011-02-23 kinaba: : obj_( p ) {} dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ デストラクタ //@} dcdd144598 2011-02-23 kinaba: ~dptr() dcdd144598 2011-02-23 kinaba: { delete obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 新しいオブジェクトを所有。古いのは削除 //@} dcdd144598 2011-02-23 kinaba: void operator=( T* p ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: delete obj_; // 古いのは削除 dcdd144598 2011-02-23 kinaba: obj_ = p; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 有効かどうか //@} dcdd144598 2011-02-23 kinaba: bool isValid() const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return (obj_ != NULL); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 間接演算子 //@} dcdd144598 2011-02-23 kinaba: T& operator*() const dcdd144598 2011-02-23 kinaba: { return *obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ メンバ参照 //@} dcdd144598 2011-02-23 kinaba: T* operator->() const dcdd144598 2011-02-23 kinaba: { return obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ポインタ取得 //@} dcdd144598 2011-02-23 kinaba: T* get() const dcdd144598 2011-02-23 kinaba: { return obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: T* obj_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: NOCOPY(dptr<T>); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 削除権専有ポインタ(配列版) dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: template<class T> dcdd144598 2011-02-23 kinaba: class darr dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ コンストラクタ //@} dcdd144598 2011-02-23 kinaba: explicit darr( T* p = NULL ) dcdd144598 2011-02-23 kinaba: : obj_( p ) {} dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ デストラクタ //@} dcdd144598 2011-02-23 kinaba: ~darr() dcdd144598 2011-02-23 kinaba: { delete [] obj_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 新しいオブジェクトを所有。古いのは削除 //@} dcdd144598 2011-02-23 kinaba: void operator=( T* p ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: delete [] obj_; // 古いのは削除 dcdd144598 2011-02-23 kinaba: obj_ = p; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 有効かどうか //@} dcdd144598 2011-02-23 kinaba: bool isValid() const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return (obj_ != NULL); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 配列要素アクセス //@} dcdd144598 2011-02-23 kinaba: T& operator[]( int i ) const dcdd144598 2011-02-23 kinaba: { return obj_[i]; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: T* obj_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: NOCOPY(darr<T>); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #ifdef _MSC_VER dcdd144598 2011-02-23 kinaba: #pragma warning( default : 4150 ) dcdd144598 2011-02-23 kinaba: #pragma warning( default : 4284 ) dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: } // namespace ki dcdd144598 2011-02-23 kinaba: #endif // _KILIB_KTL_APTR_H_