root box calculation after remove moved from rtree::raw_remove() to visitor::remove.

[SVN r82522]
This commit is contained in:
Adam Wulkiewicz
2013-01-17 14:37:40 +00:00
parent 2f5ddeb8a6
commit 4836bbabce
3 changed files with 46 additions and 39 deletions

View File

@@ -38,7 +38,6 @@
#include <boost/geometry/extensions/index/rtree/visitors/destroy.hpp>
#include <boost/geometry/extensions/index/rtree/visitors/spatial_query.hpp>
#include <boost/geometry/extensions/index/rtree/visitors/nearest_query.hpp>
#include <boost/geometry/extensions/index/rtree/visitors/children_box.hpp>
#include <boost/geometry/extensions/index/rtree/visitors/count.hpp>
#include <boost/geometry/extensions/index/rtree/linear/linear.hpp>
@@ -1057,6 +1056,8 @@ private:
BOOST_GEOMETRY_INDEX_ASSERT(m_root, "The root must exist");
BOOST_GEOMETRY_INDEX_ASSERT(index::is_valid(m_translator(value)), "Indexable is invalid");
geometry::expand(m_box, m_translator(value));
detail::rtree::visitors::insert<
value_type,
value_type, options_type, translator_type, box_type, allocators_type,
@@ -1072,8 +1073,6 @@ private:
// TODO
// If exception is thrown, m_values_count may be invalid
++m_values_count;
geometry::expand(m_box, m_translator(value));
}
/*!
@@ -1091,7 +1090,7 @@ private:
detail::rtree::visitors::remove<
value_type, options_type, translator_type, box_type, allocators_type
> remove_v(m_root, m_leafs_level, value, m_parameters, m_translator, m_allocators);
> remove_v(m_root, m_leafs_level, m_box, value, m_parameters, m_translator, m_allocators);
detail::rtree::apply_visitor(remove_v, *m_root);
@@ -1103,19 +1102,6 @@ private:
--m_values_count;
// Calculate new box
if ( m_values_count == 0 )
{
geometry::assign_inverse(m_box);
}
else
{
detail::rtree::visitors::children_box<value_type, options_type, translator_type, box_type, allocators_type>
children_box_v(m_box, m_translator);
detail::rtree::apply_visitor(children_box_v, *m_root);
}
return 1;
}

View File

@@ -38,6 +38,7 @@ class remove
public:
inline remove(node* & root,
size_t & leafs_level,
Box & root_box,
Value const& value,
parameters_type const& parameters,
Translator const& translator,
@@ -47,6 +48,7 @@ public:
, m_translator(translator)
, m_allocators(allocators)
, m_root_node(root)
, m_root_box(root_box)
, m_leafs_level(leafs_level)
, m_is_value_removed(false)
, m_parent(0)
@@ -110,6 +112,9 @@ public:
{
BOOST_GEOMETRY_INDEX_ASSERT(&n == rtree::get<internal_node>(m_root_node), "node must be the root");
// assign new root's box
assign_root_box(elements);
// reinsert elements from removed nodes (underflows)
reinsert_removed_nodes_elements(); // MAY THROW (V, E: alloc, copy, N: alloc)
@@ -155,6 +160,10 @@ public:
rtree::elements(*m_parent)[m_current_child_index].first
= rtree::elements_box<Box>(elements.begin(), elements.end(), m_translator);
}
else
{
assign_root_box(elements);
}
}
}
@@ -285,13 +294,24 @@ private:
}
}
template <typename Elements>
void assign_root_box(Elements const& elements)
{
if ( elements.empty() )
geometry::assign_inverse(m_root_box);
else
m_root_box = rtree::elements_box<Box>(elements.begin(), elements.end(), m_translator);
}
Value const& m_value;
parameters_type const& m_parameters;
Translator const& m_translator;
Allocators & m_allocators;
node* & m_root_node;
Box & m_root_box;
size_t & m_leafs_level;
bool m_is_value_removed;
UnderflowNodes m_underflowed_nodes;