|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef SIMPLE_POOL_H |
|
#define SIMPLE_POOL_H |
|
|
|
#include <stdlib.h> |
|
|
|
#include <vector> |
|
|
|
#include "../shared/WinptyAssert.h" |
|
|
|
template <typename T, size_t chunkSize> |
|
class SimplePool { |
|
public: |
|
~SimplePool(); |
|
T *alloc(); |
|
void clear(); |
|
private: |
|
struct Chunk { |
|
size_t count; |
|
T *data; |
|
}; |
|
std::vector<Chunk> m_chunks; |
|
}; |
|
|
|
template <typename T, size_t chunkSize> |
|
SimplePool<T, chunkSize>::~SimplePool() { |
|
clear(); |
|
} |
|
|
|
template <typename T, size_t chunkSize> |
|
void SimplePool<T, chunkSize>::clear() { |
|
for (size_t ci = 0; ci < m_chunks.size(); ++ci) { |
|
Chunk &chunk = m_chunks[ci]; |
|
for (size_t ti = 0; ti < chunk.count; ++ti) { |
|
chunk.data[ti].~T(); |
|
} |
|
free(chunk.data); |
|
} |
|
m_chunks.clear(); |
|
} |
|
|
|
template <typename T, size_t chunkSize> |
|
T *SimplePool<T, chunkSize>::alloc() { |
|
if (m_chunks.empty() || m_chunks.back().count == chunkSize) { |
|
T *newData = reinterpret_cast<T*>(malloc(sizeof(T) * chunkSize)); |
|
ASSERT(newData != NULL); |
|
Chunk newChunk = { 0, newData }; |
|
m_chunks.push_back(newChunk); |
|
} |
|
Chunk &chunk = m_chunks.back(); |
|
T *ret = &chunk.data[chunk.count++]; |
|
new (ret) T(); |
|
return ret; |
|
} |
|
|
|
#endif |
|
|