summaryrefslogtreecommitdiffhomepage
path: root/src/RTree.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/RTree.cpp')
-rw-r--r--src/RTree.cpp63
1 files changed, 39 insertions, 24 deletions
diff --git a/src/RTree.cpp b/src/RTree.cpp
index bee4641c..40343e31 100644
--- a/src/RTree.cpp
+++ b/src/RTree.cpp
@@ -11,53 +11,68 @@
namespace floormat::detail {
-template<typename T> rtree_pool<T>::rtree_pool()
-{
- free_list.reserve(128);
-}
+#ifdef RTREE_POOL_DEBUG
+static size_t fresh_counter, reuse_counter, dtor_counter; // NOLINT
+#endif
+
+template<typename T> rtree_pool<T>::rtree_pool() noexcept = default;
-template<typename T> rtree_pool<T>::~rtree_pool()
+template<typename T>
+rtree_pool<T>::~rtree_pool()
{
- for (auto* ptr : free_list)
- ::operator delete(ptr);
- free_list.clear();
- free_list.shrink_to_fit();
+#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<typename T> T* rtree_pool<T>::construct()
{
- if (free_list.empty())
+ if (!free_list)
{
#ifdef RTREE_POOL_DEBUG
- static unsigned i = 0; Debug{} << "rtree-pool: fresh"_s << ++i; std::fflush(stdout);
+ Debug{} << "rtree-pool: fresh"_s << ++fresh_counter; std::fflush(stdout);
#endif
- return new T;
+ auto* ptr = new node_u;
+ auto* ret = new(&ptr->data) T;
+ return ret;
}
else
{
- auto* ret = free_list.back();
- free_list.pop_back();
- new (ret) T();
+ auto* ret = free_list;
+ free_list = free_list->next;
+ new (&ret->data) T();
#ifdef RTREE_POOL_DEBUG
- static unsigned i = 0; Debug{} << "rtree-pool: reused"_s << ++i; std::fflush(stdout);
+ Debug{} << "rtree-pool: reused"_s << ++reuse_counter; std::fflush(stdout);
#endif
- return ret;
+ return &ret->data;
}
}
template<typename T> void rtree_pool<T>::free(T* ptr)
{
ptr->~T();
- free_list.push_back(ptr);
+ node_p p = {.ptr = ptr };
+ node_u* n = p.data_ptr;
+ n->next = free_list;
+ free_list = n;
}
using my_rtree = RTree<uint64_t, float, 2, float>;
-
-template<> std::vector<my_rtree::Node*> rtree_pool<my_rtree::Node>::free_list = {}; // NOLINT
-template<> std::vector<my_rtree::ListNode*> rtree_pool<my_rtree::ListNode>::free_list = {}; // NOLINT
-
-template struct floormat::detail::rtree_pool<my_rtree::Node>;
-template struct floormat::detail::rtree_pool<my_rtree::ListNode>;
+template struct rtree_pool<my_rtree::Node>;
+template struct rtree_pool<my_rtree::ListNode>;
} // namespace floormat::detail