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