diff --git a/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp b/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp index 703909cac..649956a74 100644 --- a/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp +++ b/include/boost/geometry/extensions/index/rtree/rstar/insert.hpp @@ -169,12 +169,7 @@ struct level_insert_base { // it's really the root node assert(&rtree::get(n) == base::m_root_node); - - detail::split::apply( - n, - base::m_parent, base::m_current_child_index, - base::m_root_node, base::m_leafs_level, - base::m_min_elems_per_node, base::m_max_elems_per_node, base::m_tr); + base::split(n); } } } @@ -185,11 +180,7 @@ struct level_insert_base // overflow if ( base::m_max_elems_per_node < rtree::elements(n).size() ) { - detail::split::apply( - n, - base::m_parent, base::m_current_child_index, - base::m_root_node, base::m_leafs_level, - base::m_min_elems_per_node, base::m_max_elems_per_node, base::m_tr); + base::split(n); } } diff --git a/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp b/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp index c37d05174..9f45eab0d 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp @@ -78,70 +78,11 @@ struct choose_next_node template struct redistribute_elements; -// Default split algorithm -template -struct split -{ - typedef typename rtree::node::type node; - typedef typename rtree::internal_node::type internal_node; - typedef typename rtree::leaf::type leaf; - - static const size_t dimension = index::traits::dimension::value; - - template - static inline void apply( - Node & n, - internal_node *parent, - size_t current_child_index, - node *& root, - size_t & leafs_level, - size_t min_elems, - size_t max_elems, - Translator const& tr) - { - // create additional node - node * second_node = rtree::create_node(Node()); - Node & n2 = rtree::get(*second_node); - - // redistribute elements - Box box1, box2; - redistribute_elements:: - apply(n, n2, box1, box2, min_elems, max_elems, tr); - - // check numbers of elements - assert(min_elems <= rtree::elements(n).size() && rtree::elements(n).size() <= max_elems); - assert(min_elems <= rtree::elements(n2).size() && rtree::elements(n2).size() <= max_elems); - - // node is not the root - just add the new node - if ( parent != 0 ) - { - // update old node's box - rtree::elements(*parent)[current_child_index].first = box1; - // add new node to the parent's children - rtree::elements(*parent).push_back(std::make_pair(box2, second_node)); - } - // node is the root - add level - else - { - assert(&n == rtree::get(root)); - - // create new root and add nodes - node * new_root = rtree::create_node(internal_node()); - - rtree::elements(rtree::get(*new_root)).push_back(std::make_pair(box1, root)); - rtree::elements(rtree::get(*new_root)).push_back(std::make_pair(box2, second_node)); - - root = new_root; - ++leafs_level; - } - } -}; - // Default insert visitor template class insert : public rtree::visitor::type { -public: +protected: typedef typename rtree::node::type node; typedef typename rtree::internal_node::type internal_node; typedef typename rtree::leaf::type leaf; @@ -172,7 +113,6 @@ public: // assert - check if Box is correct } -protected: template inline void traverse(Visitor & visitor, internal_node & n) { @@ -200,10 +140,7 @@ protected: // handle overflow if ( m_max_elems_per_node < rtree::elements(n).size() ) { - split::apply( - n, m_parent, m_current_child_index, - m_root_node, m_leafs_level, - m_min_elems_per_node, m_max_elems_per_node, m_tr); + split(n); } } @@ -229,6 +166,46 @@ protected: m_current_level = current_level_bckup; } + template + inline void split(Node &n) const + { + // create additional node + node * second_node = rtree::create_node(Node()); + Node & n2 = rtree::get(*second_node); + + // redistribute elements + Box box1, box2; + redistribute_elements:: + apply(n, n2, box1, box2, m_min_elems_per_node, m_max_elems_per_node, m_tr); + + // check numbers of elements + assert(m_min_elems_per_node <= rtree::elements(n).size() && rtree::elements(n).size() <= m_max_elems_per_node); + assert(m_min_elems_per_node <= rtree::elements(n2).size() && rtree::elements(n2).size() <= m_max_elems_per_node); + + // node is not the root - just add the new node + if ( m_parent != 0 ) + { + // update old node's box + rtree::elements(*m_parent)[m_current_child_index].first = box1; + // add new node to the parent's children + rtree::elements(*m_parent).push_back(std::make_pair(box2, second_node)); + } + // node is the root - add level + else + { + assert(&n == rtree::get(m_root_node)); + + // create new root and add nodes + node * new_root = rtree::create_node(internal_node()); + + rtree::elements(rtree::get(*new_root)).push_back(std::make_pair(box1, m_root_node)); + rtree::elements(rtree::get(*new_root)).push_back(std::make_pair(box2, second_node)); + + m_root_node = new_root; + ++m_leafs_level; + } + } + Element const& m_element; Translator const& m_tr; const size_t m_min_elems_per_node;