支持simouse兄,也把我以前写的句柄类(智能指针)共享一下~
/*! @file
********************************************************************************
<PRE>
模块名 : 白杨工具库
文件名 : handle.h
相关文件 : -
文件实现功能 : 实现引用计数的通用句柄类
作者 : 白杨
版本 : 1.0
--------------------------------------------------------------------------------
备注 :
* 平台及开发环境无关性:
仅使用 ANSI/ISO/IEC 14882:1998(E) 定义的语言功能及标准库开发,确保平台/工具
无关性
--------------------------------------------------------------------------------
修改记录 :
日 期 版本 修改人 修改内容
2002/01/06 1.0 白杨 创建
</PRE>
*******************************************************************************/
#include <utilitis.h>
#include <ASSERT.H>
#ifndef _BaiY_HANDLE_H_
#define _BaiY_HANDLE_H_
BEGIN_BAIY
// #############################################################################
// ############################################# 各种可以被CHandle使用的删除策略
template<class _TT>
struct DeletorBase {
typedef _TT value_type;
typedef _TT* pointer;
};
template<class _TT>
struct Deletor : DeletorBase<_TT>
{
static void del(_TT* p) {delete (p);}
};
template<class _TT>
struct ArrayDeletor : DeletorBase<_TT>
{
static void del(_TT* p) {delete[] (p);}
};
template<class _TT>
struct DestoryDeletor : DeletorBase<_TT>
{
static void del(_TT* p) {if(p)p->Destroy();}
};
template<class _TT>
struct NullDeletor : DeletorBase<_TT>
{
static void del(_TT* p) {}
};
// #############################################################################
// #############################################################################
/*! @class
********************************************************************************
<PRE>
类名称 : CHandle
功能 : 带引用计数的通用指针句柄类
异常类 : -
--------------------------------------------------------------------------------
备注 : * const CHandle应该被理解为句柄本身不能够被修改。指向常量的Handle应该
被定义为 CHandle<const T>
典型用法 : -
--------------------------------------------------------------------------------
作者 : 白杨
--------------------------------------------------------------------------------
修改记录 :
日 期 版本 修改人 修改内容
2002/01/06 1.0 白杨 创建
</PRE>
*******************************************************************************/
template<class _TT, class _D = Deletor<_TT> >
class CHandle
{
public:
/////////////////////////////////////////////////////////////////////// 类型定义
typedef _TT value_type;
typedef _TT& reference;
typedef const _TT& const_reference;
typedef _TT* pointer;
typedef const _TT* const_pointer;
public:
///////////////////////////////////////////////////////////// 构造、析构、初始化
CHandle( OWNER IN _TT* pp = NULL ) : ptr(pp), pcount(new UINT(1)) {}
CHandle( IN const CHandle& rhs ) : ptr(rhs.ptr), pcount(rhs.pcount) {++(*pcount);}
CHandle& operator=( IN const CHandle& rhs )
{
if ( ptr == rhs.ptr )
return *this;
Release();
ptr = rhs.ptr;
++(*(pcount=rhs.pcount));
return *this;
}
_TT* operator=( OWNER IN _TT* rhs ) {BindTo(rhs);return ptr;}
~CHandle() {Release();}
public:
/////////////////////////////////////////////////////////////////////// 公用方法
void Release( void ) {if(0==--(*pcount)){_D::del((_D::pointer)ptr);delete pcount;}}
_TT* AddRef( void ) {++(*pcount);return ptr;}
UINT GetRefCount( void ) const {return *pcount;}
void BindTo( OWNER IN _TT* p )
{
if ( p == ptr )
return;
Release();
ptr = p;
pcount = new UINT(1);
}
void Swap( IN OUT CHandle& hdl ) {_TT* p=ptr;ptr=hdl.ptr;hdl.ptr=p;UINT* pc=pcount;pcount=hdl.pcount;hdl.pcount=pc;}
bool IsValid( void ) const {return ptr!=NULL;}
bool operator!( void ) const {return NULL==ptr;}
bool IsShared( void ) const {return 1!=(*pcount);}
public:
///////////////////////////////////////////////////////////////////////// 运算符
_TT* operator->() const {return ptr;}
_TT& operator*() const {return *ptr;}
_TT** operator&() {return &ptr;}
const _TT** operator&() const {return &ptr;}
bool operator==( IN const CHandle& rhs ) const {return ptr == rhs.ptr;}
bool operator!=( IN const CHandle& rhs ) const {return !(*this==rhs);}
operator _TT*() const {return ptr;}
operator _TT*&() {return ptr;}
operator void*() const {return static_cast<void*>(ptr);}
// ◆ 注意:很多编译器还不支持模板中的模板,
// 而且这个转换会带来为一个指针有多个引用计数的问题
// template<class _TT2>
// operator CHandle<_TT2,_D>() const {return CHandle<_TT2,_D>(ptr);}
private:
/////////////////////////////////////////////////////////////////////////// 属性
_TT* ptr;
UINT* pcount;
};
END_BAIY
#endif // _BaiY_HANDLE_H_