对象池
代码
#ifndef OBJECT_DEF_NUM
#define OBJECT_DEF_NUM (16)
#endif // !OBJECT_DEF_NUM
#include <queue>
template <typename T>
class ObjectPool
{
public:
ObjectPool(size_t objNum = OBJECT_DEF_NUM);
virtual ~ObjectPool();
public:
T* get();
bool release(T* t);
size_t size();
protected:
std::queue<T*> mObjQueue;
size_t mKeepNum;
private:
bool _new();
bool _delete();
bool _deleteAll();
};
template<typename T>
inline ObjectPool<T>::ObjectPool(size_t objNum) :mKeepNum(objNum)
{
}
template<typename T>
inline ObjectPool<T>::~ObjectPool()
{
_deleteAll();
}
template<typename T>
inline bool ObjectPool<T>::_deleteAll()
{
try
{
while (!mObjQueue.empty()) {
T* t = mObjQueue.front();
mObjQueue.pop();
delete t;
}
return true;
}
catch (...)
{
return false;
}
}
// get obj
template<typename T>
inline T * ObjectPool<T>::get()
{
if (mObjQueue.empty()) {
_new();
}
T* obj = mObjQueue.front();
mObjQueue.pop();
return obj;
}
template<typename T>
inline bool ObjectPool<T>::_new()
{
try
{
for (size_t i = 0; i < mKeepNum; i++) {
mObjQueue.push(new T());
}
return true;
}
catch (const std::exception&)
{
return false;
}
}
// release obj
template<typename T>
inline bool ObjectPool<T>::release(T * t)
{
mObjQueue.push(t);
if (mObjQueue.size() > mKeepNum) {
_delete();
}
return true;
}
template<typename T>
inline bool ObjectPool<T>::_delete()
{
try
{
while (mObjQueue.size() > mKeepNum) {
T* t = mObjQueue.front();
mObjQueue.pop();
delete t;
}
return true;
}
catch (...)
{
return false;
}
}
// size
template<typename T>
inline size_t ObjectPool<T>::size()
{
return mObjQueue.size();
}