From bfbbfc325f081d9523f56accc267167c82ffa495 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 19 Mar 2023 18:20:49 +0100 Subject: src/rtree: add simple object pool impl --- src/RTree.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'src/RTree.cpp') diff --git a/src/RTree.cpp b/src/RTree.cpp index 81677922..bee4641c 100644 --- a/src/RTree.cpp +++ b/src/RTree.cpp @@ -1,3 +1,64 @@ +#define RTREE_NO_EXTERN_TEMPLATE_POOL #include "RTree.hpp" +//#define RTREE_POOL_DEBUG + +#ifdef RTREE_POOL_DEBUG +#include +#include +#include +#endif + +namespace floormat::detail { + +template rtree_pool::rtree_pool() +{ + free_list.reserve(128); +} + +template rtree_pool::~rtree_pool() +{ + for (auto* ptr : free_list) + ::operator delete(ptr); + free_list.clear(); + free_list.shrink_to_fit(); +} + +template T* rtree_pool::construct() +{ + if (free_list.empty()) + { +#ifdef RTREE_POOL_DEBUG + static unsigned i = 0; Debug{} << "rtree-pool: fresh"_s << ++i; std::fflush(stdout); +#endif + return new T; + } + else + { + auto* ret = free_list.back(); + free_list.pop_back(); + new (ret) T(); +#ifdef RTREE_POOL_DEBUG + static unsigned i = 0; Debug{} << "rtree-pool: reused"_s << ++i; std::fflush(stdout); +#endif + return ret; + } +} + +template void rtree_pool::free(T* ptr) +{ + ptr->~T(); + free_list.push_back(ptr); +} + +using my_rtree = RTree; + +template<> std::vector rtree_pool::free_list = {}; // NOLINT +template<> std::vector rtree_pool::free_list = {}; // NOLINT + +template struct floormat::detail::rtree_pool; +template struct floormat::detail::rtree_pool; + +} // namespace floormat::detail + template class RTree; -- cgit v1.2.3