summaryrefslogtreecommitdiffhomepage
path: root/src/RTree.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/RTree.h')
-rw-r--r--src/RTree.h31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/RTree.h b/src/RTree.h
index 1a30a735..3ceb64ac 100644
--- a/src/RTree.h
+++ b/src/RTree.h
@@ -22,6 +22,28 @@
namespace floormat::detail { template<typename T> struct rtree_pool; }
+template<typename T> struct floormat::detail::rtree_pool final
+{
+ rtree_pool() noexcept;
+ rtree_pool(const rtree_pool&) = delete;
+ rtree_pool& operator=(const rtree_pool&) = delete;
+ ~rtree_pool();
+ T* construct();
+ void free(T* pool);
+
+ union node_u {
+ union { T data; };
+ node_u* next;
+ };
+ union node_p {
+ T* ptr;
+ node_u* data_ptr;
+ };
+
+private:
+ node_u* free_list = nullptr;
+};
+
#ifdef RTREE_STDIO
// Fwd decl
class RTFileStream; // File I/O helper class, look below for implementation and notes.
@@ -45,7 +67,7 @@ class RTFileStream; // File I/O helper class, look below for implementation and
///
template<class DATATYPE, class ELEMTYPE, int NUMDIMS,
class ELEMTYPEREAL = ELEMTYPE, int TMAXNODES = 8, int TMINNODES = TMAXNODES / 2>
-class RTree
+class RTree final
{
public:
@@ -65,7 +87,7 @@ public:
RTree();
RTree(const RTree& other);
- virtual ~RTree() noexcept;
+ ~RTree() noexcept;
RTree& operator=(const RTree&);
/// Insert entry
@@ -212,6 +234,9 @@ public:
Node* m_node; ///< Node
};
+ floormat::detail::rtree_pool<Node> node_pool;
+ floormat::detail::rtree_pool<ListNode> list_node_pool;
+
protected:
/// Variables for finding a split partition
struct PartitionVars
@@ -278,6 +303,8 @@ public:
};
extern template class RTree<floormat::uint64_t, float, 2, float>;
+extern template struct floormat::detail::rtree_pool<RTree<floormat::uint64_t, float, 2, float>::Node>;
+extern template struct floormat::detail::rtree_pool<RTree<floormat::uint64_t, float, 2, float>::ListNode>;
//#undef RTREE_TEMPLATE
//#undef RTREE_QUAL