1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
class ObjectPool
{
public:
ObjectPool() { allocObject(); }
Object* getObject();
void release(Object* object);
private:
std::vector<Object*> m_objectList;
static const int realloc = 10;
std::vector<Object*> m_usedObjectList;
void allocObject();
};
Object* ObjectPool::getObject() {
Object* obj = m_objectList.back();
m_objectList.pop_back();
m_usedObjectList.push_back(obj);
if(m_objectList.empty()) {
allocObject();
}
}
void ObjectPool::release(Object* object) {
std::vector<Object*> iterator iter = std::find(m_usedObjectList.begin(), m_usedObjectList.end(), object);
if(iter == m_usedObjectList.end()) {
throw std::exception("Object not allocated by the pool");
}
m_usedObjectList.erase(iter);
m_objectList.push_back(object);
if(m_objectList.size() >= 2* realloc) {
m_objectList.erase(m_objectList.begin() + realloc, m_objectList.end());
}
}
void ObjectPool::realloc() {
for(int i = 0; i < realloc; i++) {
m_objectList.push_back(new Object);
}
} |