Files
palladium/include/pd/core/pool.hpp

81 lines
2.0 KiB
C++
Raw Normal View History

2026-03-05 20:24:47 +01:00
#pragma once
#include <memory>
#include <pd/common.hpp>
2026-03-05 20:24:47 +01:00
namespace PD {
template <typename T, typename Alloc = std::allocator<T>>
class Pool {
public:
using value_type = T;
using iterator = T*;
using const_iterator = const iterator*;
2026-03-05 20:24:47 +01:00
Pool() = default;
~Pool() {
if (pData) {
pAlloc.deallocate(pData, pCap);
pData = nullptr;
}
}
2026-03-05 20:24:47 +01:00
static Pool* Create(size_t size) { return new Pool(size); }
void Init(size_t size) {
pPos = 0;
pCap = size;
pData = pAlloc.allocate(size);
for (size_t i = 0; i < pCap; i++) {
std::allocator_traits<Alloc>::construct(pAlloc, &pData[i]);
}
PDLOG("Pool::Init({})", size);
2026-03-05 20:24:47 +01:00
}
Pool(const Pool&) = delete;
Pool(Pool&&) = delete;
Pool& operator=(const Pool&) = delete;
Pool& operator=(Pool&&) = delete;
T* Allocate(size_t num = 1) {
if (CheckLimits(num)) return nullptr;
T* ret = &pData[pPos];
2026-03-05 20:24:47 +01:00
pPos += num;
return ret;
}
bool CheckLimits(size_t num) {
if ((pPos + num) >= pCap) {
throw std::runtime_error(
std::format("[PD::Pool]: Trying to allocate {} elements but this is "
"going out of range ({}/{})",
num, pPos + num, pCap));
return true;
}
return false;
}
void Reset() {
for (size_t i = 0; i < pCap; i++) {
std::allocator_traits<Alloc>::destroy(pAlloc, &pData[i]);
}
pPos = 0;
for (size_t i = 0; i < pCap; i++) {
std::allocator_traits<Alloc>::construct(pAlloc, &pData[i]);
}
}
2026-03-05 20:24:47 +01:00
size_t size() const { return pPos; }
size_t capacity() const { return pCap; }
T& at(size_t idx) { return pData[idx]; }
const T& at(size_t idx) const { return pData[idx]; }
T& operator[](size_t idx) { return at(idx); }
const T& operator[](size_t idx) const { return at(idx); }
2026-03-05 20:24:47 +01:00
private:
Pool(size_t size) : pCap(size), pPos(0) { pData = pAlloc.allocate(size); }
2026-03-05 20:24:47 +01:00
size_t pCap = 0;
size_t pPos = 0;
Alloc pAlloc;
T* pData = nullptr;
2026-03-05 20:24:47 +01:00
};
} // namespace PD