summaryrefslogtreecommitdiffhomepage
path: root/src/RTree.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/RTree.hpp')
-rw-r--r--src/RTree.hpp28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/RTree.hpp b/src/RTree.hpp
index da60a76f..45cbb378 100644
--- a/src/RTree.hpp
+++ b/src/RTree.hpp
@@ -32,6 +32,24 @@
#define Max std::max
#endif //Max
+namespace floormat::detail {
+template<typename T> struct rtree_pool final
+{
+ rtree_pool();
+ ~rtree_pool();
+ static T* construct();
+ static void free(T* pool);
+
+private:
+ static std::vector<T*> free_list; // NOLINT
+};
+
+#ifndef RTREE_NO_EXTERN_TEMPLATE_POOL
+extern template struct rtree_pool<RTree<std::uint64_t, float, 2, float>::Node>;
+extern template struct rtree_pool<RTree<std::uint64_t, float, 2, float>::ListNode>;
+#endif
+} // namespace floormat::detail
+
#ifdef RTREE_STDIO
// Because there is not stream support, this is a quick and dirty file I/O helper.
// Users will likely replace its usage with a Stream implementation from their favorite API.
@@ -508,7 +526,7 @@ void RTREE_QUAL::RemoveAll()
RTREE_TEMPLATE
void RTREE_QUAL::Reset()
{
-#ifdef RTREE_DONT_USE_MEMPOOLS
+#if defined RTREE_DONT_USE_MEMPOOLS || 1
// Delete all existing nodes
RemoveAllRec(m_root);
#else // RTREE_DONT_USE_MEMPOOLS
@@ -542,7 +560,7 @@ typename RTREE_QUAL::Node* RTREE_QUAL::AllocNode()
#ifdef RTREE_DONT_USE_MEMPOOLS
newNode = new Node;
#else // RTREE_DONT_USE_MEMPOOLS
- // EXAMPLE
+ newNode = floormat::detail::rtree_pool<Node>::construct();
#endif // RTREE_DONT_USE_MEMPOOLS
InitNode(newNode);
return newNode;
@@ -557,7 +575,7 @@ void RTREE_QUAL::FreeNode(Node* a_node)
#ifdef RTREE_DONT_USE_MEMPOOLS
delete a_node;
#else // RTREE_DONT_USE_MEMPOOLS
- // EXAMPLE
+ floormat::detail::rtree_pool<Node>::free(a_node);
#endif // RTREE_DONT_USE_MEMPOOLS
}
@@ -570,7 +588,7 @@ typename RTREE_QUAL::ListNode* RTREE_QUAL::AllocListNode()
#ifdef RTREE_DONT_USE_MEMPOOLS
return new ListNode;
#else // RTREE_DONT_USE_MEMPOOLS
- // EXAMPLE
+ return floormat::detail::rtree_pool<ListNode>::construct();
#endif // RTREE_DONT_USE_MEMPOOLS
}
@@ -581,7 +599,7 @@ void RTREE_QUAL::FreeListNode(ListNode* a_listNode)
#ifdef RTREE_DONT_USE_MEMPOOLS
delete a_listNode;
#else // RTREE_DONT_USE_MEMPOOLS
- // EXAMPLE
+ floormat::detail::rtree_pool<ListNode>::free(a_listNode);
#endif // RTREE_DONT_USE_MEMPOOLS
}