103 lines
1.8 KiB
C++
103 lines
1.8 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
|
|
// = FileName : TSafeResource.cpp
|
|
// = Version : ver2.0
|
|
// = Author : xlc
|
|
// = CreateDate : 2002-09-09
|
|
// = Description: 类的定义
|
|
// = Maintainers:
|
|
//
|
|
//-----------------------------------------------------------------------------+
|
|
#include "StdAfx.h"
|
|
#include "TSafeResource.h"
|
|
|
|
TSafeResource::TSafeResource()
|
|
{
|
|
pReferCount = new int(1);
|
|
}
|
|
|
|
void TSafeResource::Attach(TSafeResource&source)
|
|
{
|
|
Detach();
|
|
if(source.IsAttached())
|
|
{
|
|
pReferCount=source.pReferCount;
|
|
Apply(source);
|
|
IncreaseRef();
|
|
}
|
|
}
|
|
|
|
TSafeResource::TSafeResource(TSafeResource&source)//获取资源
|
|
{
|
|
Attach(source);
|
|
}
|
|
|
|
TSafeResource& TSafeResource::operator=(TSafeResource&source)
|
|
{
|
|
//只要不是自身赋值,则获取资源
|
|
//防止自身赋值时引用计数错误增大。
|
|
if ((&source) != this)
|
|
{
|
|
Attach(source);
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
void TSafeResource::Detach()
|
|
{
|
|
//<放弃资源>
|
|
//如是资源的最后一个用户,释放资源。
|
|
//如果资源为空,则不进行任何操作。
|
|
//多次调用完全等同于一次调用。
|
|
if(IsAttached())
|
|
{
|
|
DecreaseRef();
|
|
if(CanRelease())
|
|
{
|
|
Release();
|
|
delete pReferCount;
|
|
}
|
|
pReferCount=NULL;
|
|
}
|
|
}
|
|
|
|
TSafeResource::~TSafeResource()
|
|
{
|
|
//如果子类重载了Apply或者Release,则其析构函数必须调用Detach。
|
|
Detach();
|
|
}
|
|
|
|
void TSafeResource::Apply(TSafeResource&source)
|
|
{
|
|
|
|
}
|
|
|
|
void TSafeResource::Release()
|
|
{
|
|
|
|
}
|
|
|
|
void TSafeResource::IncreaseRef()
|
|
{
|
|
(*pReferCount)++;
|
|
}
|
|
|
|
void TSafeResource::DecreaseRef()
|
|
{
|
|
(*pReferCount)--;
|
|
}
|
|
|
|
bool TSafeResource::CanRelease()
|
|
{
|
|
return (*pReferCount) == 0;
|
|
}
|
|
|
|
bool TSafeResource::IsLastRefer()
|
|
{
|
|
return (*pReferCount) == 1;
|
|
}
|
|
|
|
bool TSafeResource::IsAttached()
|
|
{
|
|
return pReferCount != NULL;
|
|
} |