#define RTREE_NO_EXTERN_TEMPLATE #include "RTree.hpp" //#define RTREE_POOL_DEBUG #ifdef RTREE_POOL_DEBUG #include #include #include #endif namespace floormat::detail { #ifdef RTREE_POOL_DEBUG static size_t fresh_counter, reuse_counter, dtor_counter; // NOLINT #endif template rtree_pool::rtree_pool() noexcept = default; template rtree_pool::~rtree_pool() { #ifdef RTREE_POOL_DEBUG auto last = dtor_counter; #endif while (free_list) { #ifdef RTREE_POOL_DEBUG ++dtor_counter; #endif auto* p = free_list; free_list = free_list->next; p->data.~T(); delete p; } #ifdef RTREE_POOL_DEBUG if (dtor_counter != last) { Debug{} << "rtree-pool: dtor" << dtor_counter; std::fflush(stdout); } #endif } template T* rtree_pool::construct() { if (!free_list) { #ifdef RTREE_POOL_DEBUG Debug{} << "rtree-pool: fresh"_s << ++fresh_counter; std::fflush(stdout); #endif auto* ptr = new node_u; auto* ret = new(&ptr->data) T; return ret; } else { auto* ret = free_list; free_list = free_list->next; new (&ret->data) T(); #ifdef RTREE_POOL_DEBUG Debug{} << "rtree-pool: reused"_s << ++reuse_counter; std::fflush(stdout); #endif return &ret->data; } } template void rtree_pool::free(T* ptr) { ptr->~T(); node_p p = {.ptr = ptr }; node_u* n = p.data_ptr; n->next = free_list; free_list = n; } } // namespace floormat::detail using my_rtree = RTree; template struct floormat::detail::rtree_pool; template struct floormat::detail::rtree_pool; template<> floormat::detail::rtree_pool my_rtree::node_pool = {}; // NOLINT template<> floormat::detail::rtree_pool my_rtree::list_node_pool = {}; // NOLINT template class RTree;