File Annotation

Not logged in
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_