Artifact 287ca367e86ae8f1d5e1b4fc022e4139e5f9e36b
#ifndef _KILIB_KTL_APTR_H_
#define _KILIB_KTL_APTR_H_
#include "types.h"
#ifdef _MSC_VER
#pragma warning( disable : 4284 ) // �x���F->�̃��^�[���^�����ɂႤ�ɂ�
#pragma warning( disable : 4150 ) // �x���Fdelete�̒�`�����ɂ傤�ɂ�
#endif
#ifndef __ccdoc__
namespace ki {
#endif
//=========================================================================
//@{ @pkg ki.KTL //@}
//@{
// �����|�C���^
//
// ���̊��҂���͈͂ł͊T�� std::auto_ptr �Ɠ������������Ǝv���c�B
// �ԗւ̍Ŕ����[���I
//@}
//=========================================================================
template<class T>
class aptr
{
public:
//@{ �R���X�g���N�^ //@}
explicit aptr( T* p = NULL )
: obj_( p ) {}
//@{ �f�X�g���N�^ //@}
~aptr()
{ delete obj_; }
//@{ ���L���ړ� //@}
aptr( aptr<T>& r )
: obj_ ( r.release() ) {}
//@{ ���L���ړ� //@}
aptr<T>& operator=( aptr<T>& r )
{
if( obj_ != r.obj_ )
{
delete obj_;
obj_ = r.release();
}
return *this;
}
public:
//@{ �Ԑډ��Z�q //@}
T& operator*() const
{ return *obj_; }
//@{ �����o�Q�� //@}
T* operator->() const
{ return obj_; }
//@{ �|�C���^�擾 //@}
T* get() const
{ return obj_; }
//@{ ���L����� //@}
T* release()
{
T* ptr = obj_;
obj_ = NULL;
return ptr;
}
//@{ �L�����ǂ��� //@}
bool isValid() const
{
return (obj_ != NULL);
}
private:
mutable T* obj_;
};
//=========================================================================
//@{
// �����|�C���^�i�z��Łj
//@}
//=========================================================================
template<class T>
class aarr
{
public:
//@{ �R���X�g���N�^ //@}
explicit aarr( T* p = NULL )
: obj_( p ) {}
//@{ �f�X�g���N�^ //@}
~aarr()
{ delete [] obj_; }
//@{ ���L���ړ� ���̂�bcc�ŏ�肭�s���Ȃ�����������̂�const�t�� //@}
aarr( const aarr<T>& r )
: obj_ ( const_cast<aarr<T>&>(r).release() ) {}
//@{ ���L���ړ� //@}
aarr<T>& operator=( aarr<T>& r )
{
if( obj_ != r.obj_ )
{
delete [] obj_;
obj_ = r.release();
}
return *this;
}
public:
//@{ �|�C���^�擾 //@}
T* get() const
{ return obj_; }
//@{ ���L����� //@}
T* release()
{
T* ptr = obj_;
obj_ = NULL;
return ptr;
}
//@{ �L�����ǂ��� //@}
bool isValid() const
{
return (obj_ != NULL);
}
public:
//@{ �z��v�f�A�N�Z�X //@}
T& operator[]( int i ) const
{ return obj_[i]; }
private:
mutable T* obj_;
};
//=========================================================================
//@{
// �폜����L�|�C���^
//
// �u���\�[�X�̊l���̓R���X�g���N�^�ŁE����̓f�X�g���N�^�Łv��
// �O��ł���Ȃ炱��Ȃ̎g�킸�ɁA���킸 const auto_ptr ��p����
// �ׂ��ł��B�ׂ��ł����A�����o���������X�g�� this ���g����VC++��
// �R���p�C���ɓ{����̂��C�������̂ŁA�����������g���ăR���X�g���N�^
// �����ŏ��������Ă��܂��̂łӁc(^^;
//@}
//=========================================================================
template<class T>
class dptr
{
public:
//@{ �R���X�g���N�^ //@}
explicit dptr( T* p = NULL )
: obj_( p ) {}
//@{ �f�X�g���N�^ //@}
~dptr()
{ delete obj_; }
//@{ �V�����I�u�W�F�N�g�����L�B�Â��͍̂폜 //@}
void operator=( T* p )
{
delete obj_; // �Â��͍̂폜
obj_ = p;
}
//@{ �L�����ǂ��� //@}
bool isValid() const
{
return (obj_ != NULL);
}
public:
//@{ �Ԑډ��Z�q //@}
T& operator*() const
{ return *obj_; }
//@{ �����o�Q�� //@}
T* operator->() const
{ return obj_; }
//@{ �|�C���^�擾 //@}
T* get() const
{ return obj_; }
private:
T* obj_;
private:
NOCOPY(dptr<T>);
};
//=========================================================================
//@{
// �폜����L�|�C���^�i�z��Łj
//@}
//=========================================================================
template<class T>
class darr
{
public:
//@{ �R���X�g���N�^ //@}
explicit darr( T* p = NULL )
: obj_( p ) {}
//@{ �f�X�g���N�^ //@}
~darr()
{ delete [] obj_; }
//@{ �V�����I�u�W�F�N�g�����L�B�Â��͍̂폜 //@}
void operator=( T* p )
{
delete [] obj_; // �Â��͍̂폜
obj_ = p;
}
//@{ �L�����ǂ��� //@}
bool isValid() const
{
return (obj_ != NULL);
}
public:
//@{ �z��v�f�A�N�Z�X //@}
T& operator[]( int i ) const
{ return obj_[i]; }
private:
T* obj_;
private:
NOCOPY(darr<T>);
};
//=========================================================================
#ifdef _MSC_VER
#pragma warning( default : 4150 )
#pragma warning( default : 4284 )
#endif
} // namespace ki
#endif // _KILIB_KTL_APTR_H_