101 lines
2.1 KiB
C
101 lines
2.1 KiB
C
|
//
|
||
|
// Pool.h
|
||
|
//
|
||
|
// This code is derived from Universal Tween Engine
|
||
|
// Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
|
||
|
/**
|
||
|
* A light pool of objects that can be resused to avoid allocation.
|
||
|
* Based on Nathan Sweet pool implementation
|
||
|
*/
|
||
|
|
||
|
#ifndef __Pool__
|
||
|
#define __Pool__
|
||
|
|
||
|
#include <vector>
|
||
|
#include <algorithm>
|
||
|
|
||
|
namespace TweenEngine
|
||
|
{
|
||
|
|
||
|
template<typename T>
|
||
|
class PoolCallback
|
||
|
{
|
||
|
public:
|
||
|
virtual void onPool(T *obj) = 0;
|
||
|
virtual void onUnPool(T *obj) = 0;
|
||
|
};
|
||
|
|
||
|
template<typename T>
|
||
|
class Pool
|
||
|
{
|
||
|
private:
|
||
|
std::vector<T *> objects;
|
||
|
PoolCallback<T> *callback;
|
||
|
|
||
|
protected:
|
||
|
virtual ~Pool() {}
|
||
|
virtual T *create()=0;
|
||
|
|
||
|
public:
|
||
|
Pool(int initCapacity, PoolCallback<T> *callback);
|
||
|
T *get();
|
||
|
void free(T *obj);
|
||
|
void clear();
|
||
|
int size();
|
||
|
void ensureCapacity(int minCapacity);
|
||
|
|
||
|
};
|
||
|
|
||
|
// Implementation
|
||
|
template <typename T>
|
||
|
Pool<T>::Pool(int initCapacity, PoolCallback<T> *cb) : objects(initCapacity), callback(cb)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
template <typename T>
|
||
|
T *Pool<T>::get()
|
||
|
{
|
||
|
T *obj = nullptr;
|
||
|
if (objects.empty())
|
||
|
{
|
||
|
obj = create();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
obj = objects.back();
|
||
|
objects.pop_back();
|
||
|
if (obj == nullptr) obj = create();
|
||
|
}
|
||
|
if (callback != nullptr) callback->onUnPool(obj);
|
||
|
return obj;
|
||
|
}
|
||
|
|
||
|
template <typename T>
|
||
|
void Pool<T>::free(T *obj)
|
||
|
{
|
||
|
if (obj == nullptr) return;
|
||
|
|
||
|
bool contains = (std::find(objects.begin(), objects.end(), obj) != objects.end());
|
||
|
|
||
|
if (!contains)
|
||
|
{
|
||
|
if (callback != nullptr) callback->onPool(obj);
|
||
|
objects.push_back(obj);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
template <typename T>
|
||
|
void Pool<T>::clear() { objects.clear(); }
|
||
|
|
||
|
template <typename T>
|
||
|
int Pool<T>::size() { return objects.size(); }
|
||
|
|
||
|
template <typename T>
|
||
|
void Pool<T>::ensureCapacity(int minCapacity) { objects.reserve(minCapacity); }
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif /* defined(__Pool__) */
|