Files
envi-code/SourceCode/Code2026/tg_shs/shs_geLib/TSafeResource.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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;
}