#pragma once #include #include #include #ifdef WITH_BOOST #include #include #include #include using boost::container::pmr::synchronized_pool_resource; using boost::container::pmr::polymorphic_allocator; using boost::container::vector; #else #include using std::pmr::synchronized_pool_resource; using std::pmr::polymorphic_allocator; #endif #include #ifdef WITH_BOOST template , class Pred = std::equal_to> using unordered_set = std::unordered_set>; #else using std::pmr::unordered_set; using std::vector; #endif namespace Xybrid::Util { extern synchronized_pool_resource rpool; extern polymorphic_allocator ralloc; void reserveInitialPool(); template class ResourcePool { typedef char slot[sizeof(T)]; std::list pages; std::deque avail; unordered_set 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 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); } }; }