仿照Loki写的ResourcePool,大家给点意见
#if !defined __RESOURCE__POOL__H__
#define __RESOURCE__POOL__H__
#include <vector>
#include <cassert>
#include <Threads.h>
#include <Singleton.h>
namespace xwtec
{
namespace Private
{
//Notice:
//这里不需要定义析构函数来释放资源,因为这个类会在容器中使用,避免出现多次删除的问题
//它的资源由其Host Class来处理
template<class Resource>
struct ResourceWithStatus
{
ResourceWithStatus(Resource *pRes):pRes_(pRes),isUsed_(false)
{
}
operator Resource*()
{
return pRes_;
}
bool isUsed_;
Resource *pRes_;
};
};
template
<
class Resource,
template <class> class CreationPolicy = Loki::CreateUsingNew,
template <class> class ThreadingModel = Loki::SingleThreaded
>
class ResourcePool
{
std::vector< Private::ResourceWithStatus<Resource> > ResVec_;
public:
ResourcePool()
{
}
virtual ~ResourcePool()
{
DestoryAllResource();
}
private:
Resource *CreateResource()
{
Resource *pRes = CreationPolicy<Resource>::Create();
if(pRes != 0)
{
Private::ResourceWithStatus<Resource> rws(pRes);
ResVec_.push_back(rws);
}
return pRes;
}
public:
Resource *GetResource()
{
typename ThreadingModel<ResourcePool>::Lock guard;
(void)guard;
unsigned int i =0;
for(;i<ResVec_.size();++i)
{
if(!ResVec_[i].isUsed_)
{
ResVec_[i].isUsed_ = true;
return ResVec_[i].pRes_;
}
}
Resource *pRes = CreateResource();
if(pRes!=0)
{
ResVec_[i].isUsed_=true;
}
return pRes;
}
bool ReleaseResource(Resource * &pRes)
{
typename ThreadingModel<ResourcePool>::Lock guard;
(void)guard;
for(unsigned int i=0;i<ResVec_.size();++i)
{
if(ResVec_[i].pRes_ == pRes)
{
assert(ResVec_[i].isUsed_);
ResVec_[i].isUsed_ = false;
pRes = 0;
return true;
}
}
return false;
}
void DestoryAllResource()
{
typename ThreadingModel<ResourcePool>::Lock guard;
(void)guard;
for(unsigned int i=0;i<ResVec_.size();++i)
{
delete ResVec_[i].pRes_;
}
ResVec_.clear();
}
};
template <class Resource,class ResourcePool_=ResourcePool<Resource> >
class SmartResource
{
private:
Resource *pRes_;
ResourcePool_& Pool_;
public:
Resource * operator ->()
{
return pRes_;
}
SmartResource(ResourcePool_ & pool):Pool_(pool)
{
pRes_ = Pool_.GetResource();
}
~SmartResource()
{
Pool_.ReleaseResource(pRes_);
}
private:
//disable copy ctor and operator=
template<class R,class P>
SmartResource(SmartResource<R,P> & other);
template<class R,class P>
SmartResource<Resource,ResourcePool_>& operator=(SmartResource<R,P> & other);
};
};
#endif