134 using traits_type = Traits;
136 constexpr static size_t max_dist_size = traits_type::max_node_size - traits_type::min_node_size * 2 + 2;
139 using key_type = KeyT;
140 using value_type = ValueT;
144 key_type d[traits_type::dimensions];
147 point_type(std::initializer_list<key_type> vs);
149 std::string to_string()
const;
151 bool operator==(
const point_type& other)
const;
152 bool operator!=(
const point_type& other)
const;
163 std::string to_string()
const;
165 bool is_point()
const;
167 bool operator==(
const extent_type& other)
const;
168 bool operator!=(
const extent_type& other)
const;
210 using node_type = detail::rtree::node_type;
211 using export_tree_type = detail::rtree::export_tree_type;
212 using search_type = detail::rtree::search_type;
223 struct directory_node;
240 node_store(
const node_store&) =
delete;
241 node_store& operator=(
const node_store&) =
delete;
244 node_store(node_store&& r);
245 node_store(node_type _type,
const extent_type& _extent, node* _node_ptr);
248 node_store clone()
const;
250 static node_store create_leaf_directory_node();
251 static node_store create_nonleaf_directory_node();
253 static node_store create_value_node(
const extent_type&
extent,
const value_type& v);
255 node_store& operator=(node_store&& other);
270 bool is_directory()
const;
271 bool is_root()
const;
272 bool exceeds_capacity()
const;
274 void swap(node_store& other);
281 void reset_parent_pointers_of_children();
288 void reset_parent_pointers();
290 directory_node* get_directory_node();
291 const directory_node* get_directory_node()
const;
293 bool erase_child(
const node_store* p);
296 using dir_store_type = std::deque<node_store>;
298 struct dir_store_segment
300 typename dir_store_type::iterator begin;
301 typename dir_store_type::iterator end;
304 dir_store_segment() :
size(0)
308 typename dir_store_type::iterator _begin,
typename dir_store_type::iterator _end,
size_t _size)
309 : begin(std::move(_begin)), end(std::move(_end)),
size(_size)
315 dir_store_segment g1;
316 dir_store_segment g2;
318 distribution(
size_t dist, dir_store_type& nodes)
320 g1.begin = nodes.begin();
322 g1.size = traits_type::min_node_size - 1 + dist;
323 std::advance(g1.end, g1.size);
326 g2.end = nodes.end();
327 g2.size = nodes.size() - g1.size;
334 node(
const node&) =
delete;
338 struct value_node :
public node
342 value_node() =
delete;
343 value_node(value_type&& _value);
344 value_node(
const value_type& _value);
352 struct directory_node :
public node
354 dir_store_type children;
356 directory_node(
const directory_node&) =
delete;
357 directory_node& operator=(
const directory_node&) =
delete;
362 bool erase(
const node_store* p);
364 node_store* get_child_with_minimal_overlap(
const extent_type& bb);
365 node_store* get_child_with_minimal_area_enlargement(
const extent_type& bb);
367 extent_type calc_extent()
const;
368 key_type calc_overlap_cost(
const extent_type& bb)
const;
369 bool has_leaf_directory()
const;
372 struct orphan_node_entry
378 using orphan_node_entries_type = std::deque<orphan_node_entry>;
380 struct insertion_point
387 template<
typename NS>
393 using node_store_type = NS;
400 entry(node_store_type* _ns,
size_t _depth);
403 using store_type = std::vector<entry>;
406 void add_node_store(node_store_type* ns,
size_t depth);
416 using base_type::m_store;
428 using base_type::m_store;
435 template<
typename _SelfIter,
typename _StoreIter,
typename _ValueT>
439 using store_iterator_type = _StoreIter;
440 using self_iterator_type = _SelfIter;
443 store_iterator_type m_pos;
445 iterator_base(store_iterator_type pos);
449 using value_type = _ValueT;
450 using pointer = value_type*;
451 using reference = value_type&;
452 using difference_type = std::ptrdiff_t;
453 using iterator_category = std::bidirectional_iterator_tag;
455 bool operator==(
const self_iterator_type& other)
const;
456 bool operator!=(
const self_iterator_type& other)
const;
458 self_iterator_type& operator++();
459 self_iterator_type operator++(
int);
461 self_iterator_type& operator--();
462 self_iterator_type operator--(
int);
465 size_t depth()
const;
469 :
public iterator_base<
470 const_iterator, typename const_search_results::store_type::const_iterator, const rtree::value_type>
472 using base_type = iterator_base<
473 const_iterator,
typename const_search_results::store_type::const_iterator,
const rtree::value_type>;
475 using store_type =
typename const_search_results::store_type;
476 using base_type::m_pos;
477 using typename base_type::store_iterator_type;
481 const_iterator(store_iterator_type pos);
484 using typename base_type::value_type;
486 value_type& operator*()
const
488 return static_cast<const value_node*
>(m_pos->ns->node_ptr)->value;
491 value_type* operator->()
const
497 class iterator :
public iterator_base<iterator, typename search_results::store_type::iterator, rtree::value_type>
499 using base_type = iterator_base<iterator, typename search_results::store_type::iterator, rtree::value_type>;
501 using store_type =
typename const_search_results::store_type;
502 using base_type::m_pos;
503 using typename base_type::store_iterator_type;
507 iterator(store_iterator_type pos);
510 using typename base_type::value_type;
512 value_type& operator*()
514 return static_cast<value_node*
>(m_pos->ns->node_ptr)->value;
517 value_type* operator->()
530 dir_store_type m_store;
538 void insert(
const point_type& position, value_type&& value);
539 void insert(
const point_type& position,
const value_type& value);
544 void pack_level(dir_store_type& store,
size_t depth);
551 rtree(rtree&& other);
552 rtree(
const rtree& other);
555 rtree(node_store&& root);
560 rtree& operator=(
const rtree& other);
562 rtree& operator=(rtree&& other);
717 template<
typename FuncT>
743 void erase_impl(
const node_store* ns,
size_t depth);
752 std::string export_tree_formatted()
const;
753 std::string export_tree_extent_as_obj()
const;
754 std::string export_tree_extent_as_svg()
const;
756 void insert(node_store&& ns, std::unordered_set<size_t>* reinserted_depths);
757 void insert_dir(node_store&& ns,
size_t max_depth);
766 void split_node(node_store* ns);
768 void perform_forced_reinsertion(node_store* ns, std::unordered_set<size_t>& reinserted_depth);
776 void sort_dir_store_by_split_dimension(dir_store_type& children);
778 void sort_dir_store_by_dimension(
size_t dim, dir_store_type& children);
780 size_t pick_optimal_distribution(dir_store_type& children)
const;
782 insertion_point find_leaf_directory_node_for_insertion(
const extent_type& bb);
783 node_store* find_nonleaf_directory_node_for_insertion(
const extent_type& bb,
size_t max_depth);
785 template<
typename FuncT>
786 void descend_with_func(FuncT func)
const;
788 using search_condition_type = std::function<bool(
const node_store&)>;
790 template<
typename _ResT>
792 size_t depth,
const search_condition_type& dir_cond,
const search_condition_type& value_cond,
793 typename _ResT::node_store_type& ns, _ResT& results)
const;
795 void shrink_tree_upward(node_store* ns,
const extent_type& bb_affected);