}
};
-template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+template <typename MembersHolder>
class remove_elements_to_reinsert
{
public:
- typedef typename rtree::node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type node;
- typedef typename rtree::internal_node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type internal_node;
- typedef typename rtree::leaf<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type leaf;
+ typedef typename MembersHolder::box_type box_type;
+ typedef typename MembersHolder::parameters_type parameters_type;
+ typedef typename MembersHolder::translator_type translator_type;
+ typedef typename MembersHolder::allocators_type allocators_type;
- typedef typename Options::parameters_type parameters_type;
+ typedef typename MembersHolder::node node;
+ typedef typename MembersHolder::internal_node internal_node;
+ typedef typename MembersHolder::leaf leaf;
//typedef typename Allocators::internal_node_pointer internal_node_pointer;
typedef internal_node * internal_node_pointer;
internal_node_pointer parent,
size_t current_child_index,
parameters_type const& parameters,
- Translator const& translator,
- Allocators & allocators)
+ translator_type const& translator,
+ allocators_type & allocators)
{
typedef typename rtree::elements_type<Node>::type elements_type;
typedef typename elements_type::value_type element_type;
- typedef typename geometry::point_type<Box>::type point_type;
+ typedef typename geometry::point_type<box_type>::type point_type;
typedef typename index::detail::strategy_type<parameters_type>::type strategy_type;
// TODO: awulkiew - change second point_type to the point type of the Indexable?
typedef rstar::comparable_distance_point_point
for ( typename sorted_elements_type::iterator it = sorted_elements.begin() ;
it != sorted_elements.end() ; ++it )
{
- destroy_element<Value, Options, Translator, Box, Allocators>::apply(it->second, allocators);
+ destroy_element<MembersHolder>::apply(it->second, allocators);
}
BOOST_RETHROW // RETHROW
}
};
-template <size_t InsertIndex, typename Element, typename Value, typename Options, typename Box, typename Allocators>
+template
+<
+ size_t InsertIndex,
+ typename Element,
+ typename MembersHolder,
+ bool IsValue = boost::is_same<Element, typename MembersHolder::value_type>::value
+>
struct level_insert_elements_type
{
typedef typename rtree::elements_type<
- typename rtree::internal_node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type
+ typename rtree::internal_node<
+ typename MembersHolder::value_type,
+ typename MembersHolder::parameters_type,
+ typename MembersHolder::box_type,
+ typename MembersHolder::allocators_type,
+ typename MembersHolder::node_tag
+ >::type
>::type type;
};
-template <typename Value, typename Options, typename Box, typename Allocators>
-struct level_insert_elements_type<0, Value, Value, Options, Box, Allocators>
+template <typename Value, typename MembersHolder>
+struct level_insert_elements_type<0, Value, MembersHolder, true>
{
typedef typename rtree::elements_type<
- typename rtree::leaf<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type
+ typename rtree::leaf<
+ typename MembersHolder::value_type,
+ typename MembersHolder::parameters_type,
+ typename MembersHolder::box_type,
+ typename MembersHolder::allocators_type,
+ typename MembersHolder::node_tag
+ >::type
>::type type;
};
-template <size_t InsertIndex, typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+template <size_t InsertIndex, typename Element, typename MembersHolder>
struct level_insert_base
- : public detail::insert<Element, Value, Options, Translator, Box, Allocators>
+ : public detail::insert<Element, MembersHolder>
{
- typedef detail::insert<Element, Value, Options, Translator, Box, Allocators> base;
+ typedef detail::insert<Element, MembersHolder> base;
typedef typename base::node node;
typedef typename base::internal_node internal_node;
typedef typename base::leaf leaf;
- typedef typename level_insert_elements_type<InsertIndex, Element, Value, Options, Box, Allocators>::type elements_type;
+ typedef typename level_insert_elements_type<InsertIndex, Element, MembersHolder>::type elements_type;
typedef typename index::detail::rtree::container_from_elements_type<
elements_type,
typename elements_type::value_type
>::type result_elements_type;
- typedef typename Options::parameters_type parameters_type;
+ typedef typename MembersHolder::box_type box_type;
+ typedef typename MembersHolder::parameters_type parameters_type;
+ typedef typename MembersHolder::translator_type translator_type;
+ typedef typename MembersHolder::allocators_type allocators_type;
- typedef typename Allocators::node_pointer node_pointer;
- typedef typename Allocators::size_type size_type;
+ typedef typename allocators_type::node_pointer node_pointer;
+ typedef typename allocators_type::size_type size_type;
inline level_insert_base(node_pointer & root,
size_type & leafs_level,
Element const& element,
parameters_type const& parameters,
- Translator const& translator,
- Allocators & allocators,
+ translator_type const& translator,
+ allocators_type & allocators,
size_type relative_level)
: base(root, leafs_level, element, parameters, translator, allocators, relative_level)
, result_relative_level(0)
{
// NOTE: exception-safety
// After an exception result_elements may contain garbage, don't use it
- rstar::remove_elements_to_reinsert<Value, Options, Translator, Box, Allocators>::apply(
+ rstar::remove_elements_to_reinsert<MembersHolder>::apply(
result_elements, n,
base::m_traverse_data.parent, base::m_traverse_data.current_child_index,
base::m_parameters, base::m_translator, base::m_allocators); // MAY THROW, BASIC (V, E: alloc, copy)
inline void recalculate_aabb(Node const& n) const
{
base::m_traverse_data.current_element().first =
- elements_box<Box>(rtree::elements(n).begin(), rtree::elements(n).end(),
- base::m_translator,
- index::detail::get_strategy(base::m_parameters));
+ elements_box<box_type>(rtree::elements(n).begin(), rtree::elements(n).end(),
+ base::m_translator,
+ index::detail::get_strategy(base::m_parameters));
}
inline void recalculate_aabb(leaf const& n) const
{
base::m_traverse_data.current_element().first =
- values_box<Box>(rtree::elements(n).begin(), rtree::elements(n).end(),
- base::m_translator,
- index::detail::get_strategy(base::m_parameters));
+ values_box<box_type>(rtree::elements(n).begin(), rtree::elements(n).end(),
+ base::m_translator,
+ index::detail::get_strategy(base::m_parameters));
}
size_type result_relative_level;
result_elements_type result_elements;
};
-template <size_t InsertIndex, typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+template
+<
+ size_t InsertIndex,
+ typename Element,
+ typename MembersHolder,
+ bool IsValue = boost::is_same<Element, typename MembersHolder::value_type>::value
+>
struct level_insert
- : public level_insert_base<InsertIndex, Element, Value, Options, Translator, Box, Allocators>
+ : public level_insert_base<InsertIndex, Element, MembersHolder>
{
- typedef level_insert_base<InsertIndex, Element, Value, Options, Translator, Box, Allocators> base;
+ typedef level_insert_base<InsertIndex, Element, MembersHolder> base;
typedef typename base::node node;
typedef typename base::internal_node internal_node;
typedef typename base::leaf leaf;
- typedef typename Options::parameters_type parameters_type;
+ typedef typename base::parameters_type parameters_type;
+ typedef typename base::translator_type translator_type;
+ typedef typename base::allocators_type allocators_type;
- typedef typename Allocators::node_pointer node_pointer;
- typedef typename Allocators::size_type size_type;
+ typedef typename base::node_pointer node_pointer;
+ typedef typename base::size_type size_type;
inline level_insert(node_pointer & root,
size_type & leafs_level,
Element const& element,
parameters_type const& parameters,
- Translator const& translator,
- Allocators & allocators,
+ translator_type const& translator,
+ allocators_type & allocators,
size_type relative_level)
: base(root, leafs_level, element, parameters, translator, allocators, relative_level)
{}
// NOTE: exception-safety
// if the insert fails above, the element won't be stored in the tree, so delete it
- rtree::visitors::destroy<Value, Options, Translator, Box, Allocators> del_v(base::m_element.second, base::m_allocators);
- rtree::apply_visitor(del_v, *base::m_element.second);
+ rtree::visitors::destroy<MembersHolder>::apply(base::m_element.second, base::m_allocators);
BOOST_RETHROW // RETHROW
}
}
};
-template <size_t InsertIndex, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
-struct level_insert<InsertIndex, Value, Value, Options, Translator, Box, Allocators>
- : public level_insert_base<InsertIndex, Value, Value, Options, Translator, Box, Allocators>
+template <size_t InsertIndex, typename Value, typename MembersHolder>
+struct level_insert<InsertIndex, Value, MembersHolder, true>
+ : public level_insert_base<InsertIndex, typename MembersHolder::value_type, MembersHolder>
{
- typedef level_insert_base<InsertIndex, Value, Value, Options, Translator, Box, Allocators> base;
+ typedef level_insert_base<InsertIndex, typename MembersHolder::value_type, MembersHolder> base;
typedef typename base::node node;
typedef typename base::internal_node internal_node;
typedef typename base::leaf leaf;
- typedef typename Options::parameters_type parameters_type;
+ typedef typename MembersHolder::value_type value_type;
+ typedef typename base::parameters_type parameters_type;
+ typedef typename base::translator_type translator_type;
+ typedef typename base::allocators_type allocators_type;
- typedef typename Allocators::node_pointer node_pointer;
- typedef typename Allocators::size_type size_type;
+ typedef typename base::node_pointer node_pointer;
+ typedef typename base::size_type size_type;
inline level_insert(node_pointer & root,
size_type & leafs_level,
- Value const& v,
+ value_type const& v,
parameters_type const& parameters,
- Translator const& translator,
- Allocators & allocators,
+ translator_type const& translator,
+ allocators_type & allocators,
size_type relative_level)
: base(root, leafs_level, v, parameters, translator, allocators, relative_level)
{}
}
};
-template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
-struct level_insert<0, Value, Value, Options, Translator, Box, Allocators>
- : public level_insert_base<0, Value, Value, Options, Translator, Box, Allocators>
+template <typename Value, typename MembersHolder>
+struct level_insert<0, Value, MembersHolder, true>
+ : public level_insert_base<0, typename MembersHolder::value_type, MembersHolder>
{
- typedef level_insert_base<0, Value, Value, Options, Translator, Box, Allocators> base;
+ typedef level_insert_base<0, typename MembersHolder::value_type, MembersHolder> base;
typedef typename base::node node;
typedef typename base::internal_node internal_node;
typedef typename base::leaf leaf;
- typedef typename Options::parameters_type parameters_type;
+ typedef typename MembersHolder::value_type value_type;
+ typedef typename base::parameters_type parameters_type;
+ typedef typename base::translator_type translator_type;
+ typedef typename base::allocators_type allocators_type;
- typedef typename Allocators::node_pointer node_pointer;
- typedef typename Allocators::size_type size_type;
+ typedef typename base::node_pointer node_pointer;
+ typedef typename base::size_type size_type;
inline level_insert(node_pointer & root,
size_type & leafs_level,
- Value const& v,
+ value_type const& v,
parameters_type const& parameters,
- Translator const& translator,
- Allocators & allocators,
+ translator_type const& translator,
+ allocators_type & allocators,
size_type relative_level)
: base(root, leafs_level, v, parameters, translator, allocators, relative_level)
{}
// After passing the Element to insert visitor the Element is managed by the tree
// I.e. one should not delete the node passed to the insert visitor after exception is thrown
// because this visitor may delete it
-template <typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
-class insert<Element, Value, Options, Translator, Box, Allocators, insert_reinsert_tag>
- : public rtree::visitor<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag, false>::type
+template <typename Element, typename MembersHolder>
+class insert<Element, MembersHolder, insert_reinsert_tag>
+ : public MembersHolder::visitor
{
- typedef typename Options::parameters_type parameters_type;
+ typedef typename MembersHolder::parameters_type parameters_type;
+ typedef typename MembersHolder::translator_type translator_type;
+ typedef typename MembersHolder::allocators_type allocators_type;
- typedef typename rtree::node<Value, parameters_type, Box, Allocators, typename Options::node_tag>::type node;
- typedef typename rtree::internal_node<Value, parameters_type, Box, Allocators, typename Options::node_tag>::type internal_node;
- typedef typename rtree::leaf<Value, parameters_type, Box, Allocators, typename Options::node_tag>::type leaf;
+ typedef typename MembersHolder::node node;
+ typedef typename MembersHolder::internal_node internal_node;
+ typedef typename MembersHolder::leaf leaf;
- typedef typename Allocators::node_pointer node_pointer;
- typedef typename Allocators::size_type size_type;
+ typedef typename allocators_type::node_pointer node_pointer;
+ typedef typename allocators_type::size_type size_type;
public:
inline insert(node_pointer & root,
size_type & leafs_level,
Element const& element,
parameters_type const& parameters,
- Translator const& translator,
- Allocators & allocators,
+ translator_type const& translator,
+ allocators_type & allocators,
size_type relative_level = 0)
: m_root(root), m_leafs_level(leafs_level), m_element(element)
, m_parameters(parameters), m_translator(translator)
// Distinguish between situation when reinserts are required and use adequate visitor, otherwise use default one
if ( m_parameters.get_reinserted_elements() > 0 )
{
- rstar::level_insert<0, Element, Value, Options, Translator, Box, Allocators> lins_v(
+ rstar::level_insert<0, Element, MembersHolder> lins_v(
m_root, m_leafs_level, m_element, m_parameters, m_translator, m_allocators, m_relative_level);
rtree::apply_visitor(lins_v, *m_root); // MAY THROW (V, E: alloc, copy, N: alloc)
}
else
{
- visitors::insert<Element, Value, Options, Translator, Box, Allocators, insert_default_tag> ins_v(
+ visitors::insert<Element, MembersHolder, insert_default_tag> ins_v(
m_root, m_leafs_level, m_element, m_parameters, m_translator, m_allocators, m_relative_level);
rtree::apply_visitor(ins_v, *m_root);
// Distinguish between situation when reinserts are required and use adequate visitor, otherwise use default one
if ( m_parameters.get_reinserted_elements() > 0 )
{
- rstar::level_insert<0, Element, Value, Options, Translator, Box, Allocators> lins_v(
+ rstar::level_insert<0, Element, MembersHolder> lins_v(
m_root, m_leafs_level, m_element, m_parameters, m_translator, m_allocators, m_relative_level);
rtree::apply_visitor(lins_v, *m_root); // MAY THROW (V, E: alloc, copy, N: alloc)
}
else
{
- visitors::insert<Element, Value, Options, Translator, Box, Allocators, insert_default_tag> ins_v(
+ visitors::insert<Element, MembersHolder, insert_default_tag> ins_v(
m_root, m_leafs_level, m_element, m_parameters, m_translator, m_allocators, m_relative_level);
rtree::apply_visitor(ins_v, *m_root);
typename Elements::reverse_iterator it = elements.rbegin();
for ( ; it != elements.rend() ; ++it)
{
- rstar::level_insert<1, element_type, Value, Options, Translator, Box, Allocators> lins_v(
+ rstar::level_insert<1, element_type, MembersHolder> lins_v(
m_root, m_leafs_level, *it, m_parameters, m_translator, m_allocators, relative_level);
BOOST_TRY
{
++it;
for ( ; it != elements.rend() ; ++it)
- rtree::destroy_element<Value, Options, Translator, Box, Allocators>::apply(*it, m_allocators);
+ rtree::destroy_element<MembersHolder>::apply(*it, m_allocators);
BOOST_RETHROW // RETHROW
}
BOOST_CATCH_END
Element const& m_element;
parameters_type const& m_parameters;
- Translator const& m_translator;
+ translator_type const& m_translator;
size_type m_relative_level;
- Allocators & m_allocators;
+ allocators_type & m_allocators;
};
}}} // namespace detail::rtree::visitors