| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #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 |
| |
|