xybrid/xybrid/util/mem.h

49 lines
1.2 KiB
C++

#pragma once
#include <cstddef>
#include <list>
#include <deque>
#include <memory_resource>
#include <unordered_set>
namespace Xybrid::Util {
extern std::pmr::synchronized_pool_resource rpool;
extern std::pmr::polymorphic_allocator<std::max_align_t> ralloc;
template<typename T, size_t PSIZE = 16>
class ResourcePool {
typedef char slot[sizeof(T)];
std::list<slot[PSIZE]> pages;
std::deque<T*> avail;
std::pmr::unordered_set<T*> used = {rpool};
void newPage() {
auto p = pages.emplace_back();
for (size_t i = 0; i < PSIZE; i++) avail.push_back(&p[i]);
//avail.res
}
public:
typedef T type;
static const constexpr size_t pageSize = PSIZE;
template<typename... Arg>
T* getNew(Arg... args) {
if (avail.empty()) newPage();
T* n = avail.pop_back();
new (n) T(args...);
used.insert(n);
return n;
}
void del(T* n) {
if (!used.contains(n)) return; // not mine
n->~T(); // destroy object
used.erase(n);
avail.push_back(n);
}
};
}