|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r74661 - in sandbox-branches/geometry/index: boost/geometry/extensions/index/rtree boost/geometry/extensions/index/rtree/node boost/geometry/extensions/index/rtree/rstar boost/geometry/extensions/index/rtree/visitors tests
From: adam.wulkiewicz_at_[hidden]
Date: 2011-10-02 19:32:24
Author: awulkiew
Date: 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
New Revision: 74661
URL: http://svn.boost.org/trac/boost/changeset/74661
Log:
prepared to use allocators, memory leak in remove visitor fixed, tests added
Text files modified:
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/filters.hpp | 14 ++--
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/node/node_default.hpp | 130 ++++++++++++++++++++++++++++++---------
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/node/node_default_variant.hpp | 77 +++++++++++++++--------
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rstar/insert.hpp | 61 ++++++++++--------
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp | 111 +++++++++++++++++++---------------
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/copy.hpp | 16 +++-
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/destroy.hpp | 32 ++++++++-
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/insert.hpp | 41 +++++++-----
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/remove.hpp | 29 ++++++++
sandbox-branches/geometry/index/tests/rtree_function.hpp | 112 ++++++++++++++++-----------------
10 files changed, 395 insertions(+), 228 deletions(-)
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/filters.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/filters.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/filters.hpp 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
@@ -18,11 +18,11 @@
namespace boost { namespace geometry { namespace index {
-template <typename Value, typename Options, typename Translator>
+template <typename Value, typename Options, typename Translator, typename Allocator>
class rtree;
-template <typename Value, typename Options, typename Translator>
-class query_filter< index::rtree<Value, Options, Translator> >
+template <typename Value, typename Options, typename Translator, typename Allocator>
+class query_filter< index::rtree<Value, Options, Translator, Allocator> >
{
public:
typedef std::vector<Value> result_type;
@@ -31,7 +31,7 @@
template <typename Predicates>
inline query_filter(
- index::rtree<Value, Options, Translator> const& rtree,
+ index::rtree<Value, Options, Translator, Allocator> const& rtree,
Predicates const& pred
)
{
@@ -47,8 +47,8 @@
result_type m_result;
};
-template <typename Value, typename Options, typename Translator>
-class nearest_filter< index::rtree<Value, Options, Translator> >
+template <typename Value, typename Options, typename Translator, typename Allocator>
+class nearest_filter< index::rtree<Value, Options, Translator, Allocator> >
{
public:
typedef std::vector<Value> result_type;
@@ -57,7 +57,7 @@
template <typename DistancesPredicates, typename Predicates>
inline nearest_filter(
- index::rtree<Value, Options, Translator> const& rtree,
+ index::rtree<Value, Options, Translator, Allocator> const& rtree,
DistancesPredicates const& dpred,
size_t k,
Predicates const& pred
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/node/node_default.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/node/node_default.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/node/node_default.hpp 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
@@ -167,36 +167,6 @@
return el.first;
}
-// create leaf node
-
-template <typename Value, typename Parameters, typename Box, typename Tag>
-inline typename node<Value, Parameters, Box, Tag>::type *
-create_node(leaf_poly<Value, Parameters, Box, Tag> const& l)
-{
- typedef typename node<Value, Parameters, Box, Tag>::type node;
- node * n = new leaf_poly<Value, Parameters, Box, Tag>(l);
- return n;
-}
-
-// create internal node
-
-template <typename Value, typename Parameters, typename Box, typename Tag>
-inline typename node<Value, Parameters, Box, Tag>::type *
-create_node(internal_node_poly<Value, Parameters, Box, Tag> const& in)
-{
- typedef typename node<Value, Parameters, Box, Tag>::type node;
- node * n = new internal_node_poly<Value, Parameters, Box, Tag>(in);
- return n;
-}
-
-// default node
-
-template <typename Value, typename Parameters, typename Box, typename Tag>
-inline void delete_node(node_poly<Value, Parameters, Box, Tag> * n)
-{
- delete n;
-}
-
// nodes elements
template <typename Node>
@@ -237,6 +207,106 @@
return result;
}
+// allocators
+
+template <typename Value, typename Parameters, typename Box, typename Tag, typename Allocator>
+struct allocators
+{
+ typedef Allocator allocator_type;
+ typedef typename allocator_type::size_type size_type;
+
+ typedef typename allocator_type::template rebind<
+ typename internal_node<Value, Parameters, Box, Tag>::type
+ >::other internal_node_allocator_type;
+
+ typedef typename allocator_type::template rebind<
+ typename leaf<Value, Parameters, Box, Tag>::type
+ >::other leaf_allocator_type;
+
+ inline explicit allocators(Allocator alloc)
+ : allocator(alloc)
+ , internal_node_allocator(allocator)
+ , leaf_allocator(allocator)
+ {}
+
+ allocator_type allocator;
+ internal_node_allocator_type internal_node_allocator;
+ leaf_allocator_type leaf_allocator;
+};
+
+// create_node
+
+template <typename Allocators, typename Node>
+struct create_node
+{
+ BOOST_MPL_ASSERT_MSG(
+ (false),
+ NOT_IMPLEMENTED_FOR_THIS_NODE_TYPE,
+ (create_node));
+};
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct create_node<
+ Allocators,
+ internal_node_poly<Value, Parameters, Box, Tag>
+>
+{
+ static inline typename node<Value, Parameters, Box, Tag>::type * apply(Allocators & allocators)
+ {
+ return new internal_node_poly<Value, Parameters, Box, Tag>();
+ }
+};
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct create_node<
+ Allocators,
+ leaf_poly<Value, Parameters, Box, Tag>
+>
+{
+ static inline typename node<Value, Parameters, Box, Tag>::type * apply(Allocators & allocators)
+ {
+ return new leaf_poly<Value, Parameters, Box, Tag>();
+ }
+};
+
+// destroy_node
+
+template <typename Allocators, typename Node>
+struct destroy_node
+{
+ BOOST_MPL_ASSERT_MSG(
+ (false),
+ NOT_IMPLEMENTED_FOR_THIS_NODE_TYPE,
+ (destroy_node));
+};
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct destroy_node<
+ Allocators,
+ internal_node_poly<Value, Parameters, Box, Tag>
+>
+{
+ static inline void apply(Allocators & allocators, typename node<Value, Parameters, Box, Tag>::type * n)
+ {
+ delete n;
+ }
+};
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct destroy_node<
+ Allocators,
+ leaf_poly<Value, Parameters, Box, Tag>
+>
+{
+ static inline void apply(Allocators & allocators, typename node<Value, Parameters, Box, Tag>::type * n)
+ {
+ delete n;
+ }
+};
+
+// To delete variant node one must pass node *
+// To delete poly node one must pass internal_node or leaf
+
}} // namespace detail::rtree
}}} // namespace boost::geometry::index
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/node/node_default_variant.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/node/node_default_variant.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/node/node_default_variant.hpp 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
@@ -147,38 +147,59 @@
return el.first;
}
-// create leaf node
+// create_node
-template <typename Value, typename Parameters, typename Box, typename Tag>
-inline typename node<Value, Parameters, Box, Tag>::type *
-create_node(leaf_variant<Value, Parameters, Box, Tag> const& l)
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct create_node<
+ Allocators,
+ internal_node_variant<Value, Parameters, Box, Tag>
+>
{
- typedef typename node<Value, Parameters, Box, Tag>::type node;
- node * n = new node(l);
- return n;
-}
-
-// create internal node
-
-template <typename Value, typename Parameters, typename Box, typename Tag>
-inline typename node<Value, Parameters, Box, Tag>::type *
-create_node(internal_node_variant<Value, Parameters, Box, Tag> const& in)
+ static inline typename node<Value, Parameters, Box, Tag>::type * apply(Allocators & allocators)
+ {
+ return new typename node<Value, Parameters, Box, Tag>::type(
+ internal_node_variant<Value, Parameters, Box, Tag>() );
+ }
+};
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct create_node<
+ Allocators,
+ leaf_variant<Value, Parameters, Box, Tag>
+>
{
- typedef typename node<Value, Parameters, Box, Tag>::type node;
- node * n = new node(in);
- return n;
-}
-
-// default node
-
-template <typename Value, typename Parameters, typename Box, typename Tag>
-inline void delete_node(boost::variant<
- leaf_variant<Value, Parameters, Box, Tag>,
- internal_node_variant<Value, Parameters, Box, Tag>
- > * n)
+ static inline typename node<Value, Parameters, Box, Tag>::type * apply(Allocators & allocators)
+ {
+ return new typename node<Value, Parameters, Box, Tag>::type(
+ leaf_variant<Value, Parameters, Box, Tag>() );
+ }
+};
+
+// destroy_node
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct destroy_node<
+ Allocators,
+ internal_node_variant<Value, Parameters, Box, Tag>
+>
{
- delete n;
-}
+ static inline void apply(Allocators & allocators, typename node<Value, Parameters, Box, Tag>::type * n)
+ {
+ delete n;
+ }
+};
+
+template <typename Allocators, typename Value, typename Parameters, typename Box, typename Tag>
+struct destroy_node<
+ Allocators,
+ leaf_variant<Value, Parameters, Box, Tag>
+>
+{
+ static inline void apply(Allocators & allocators, typename node<Value, Parameters, Box, Tag>::type * n)
+ {
+ delete n;
+ }
+};
}} // namespace detail::rtree
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rstar/insert.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rstar/insert.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rstar/insert.hpp 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
@@ -119,11 +119,11 @@
>::type type;
};
-template <size_t InsertIndex, typename Element, typename Value, typename Options, typename Translator, typename Box>
+template <size_t InsertIndex, typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
struct level_insert_base
- : public detail::insert<Element, Value, Options, Translator, Box>
+ : public detail::insert<Element, Value, Options, Translator, Box, Allocators>
{
- typedef detail::insert<Element, Value, Options, Translator, Box> base;
+ typedef detail::insert<Element, Value, Options, Translator, Box, Allocators> base;
typedef typename base::node node;
typedef typename base::internal_node internal_node;
typedef typename base::leaf leaf;
@@ -135,8 +135,9 @@
size_t & leafs_level,
Element const& element,
Translator const& tr,
+ Allocators & allocators,
size_t relative_level)
- : base(root, leafs_level, element, tr, relative_level)
+ : base(root, leafs_level, element, tr, allocators, relative_level)
, result_relative_level(0)
{}
@@ -192,11 +193,11 @@
elements_type result_elements;
};
-template <size_t InsertIndex, typename Element, typename Value, typename Options, typename Translator, typename Box>
+template <size_t InsertIndex, typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
struct level_insert
- : public level_insert_base<InsertIndex, Element, Value, Options, Translator, Box>
+ : public level_insert_base<InsertIndex, Element, Value, Options, Translator, Box, Allocators>
{
- typedef level_insert_base<InsertIndex, Element, Value, Options, Translator, Box> base;
+ typedef level_insert_base<InsertIndex, Element, Value, Options, Translator, Box, Allocators> base;
typedef typename base::node node;
typedef typename base::internal_node internal_node;
typedef typename base::leaf leaf;
@@ -205,8 +206,9 @@
size_t & leafs_level,
Element const& element,
Translator const& tr,
+ Allocators & allocators,
size_t relative_level)
- : base(root, leafs_level, element, tr, relative_level)
+ : base(root, leafs_level, element, tr, allocators, relative_level)
{}
inline void operator()(internal_node & n)
@@ -257,11 +259,11 @@
}
};
-template <size_t InsertIndex, typename Value, typename Options, typename Translator, typename Box>
-struct level_insert<InsertIndex, Value, Value, Options, Translator, Box>
- : public level_insert_base<InsertIndex, Value, Value, Options, Translator, Box>
+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>
{
- typedef level_insert_base<InsertIndex, Value, Value, Options, Translator, Box> base;
+ typedef level_insert_base<InsertIndex, Value, Value, Options, Translator, Box, Allocators> base;
typedef typename base::node node;
typedef typename base::internal_node internal_node;
typedef typename base::leaf leaf;
@@ -270,8 +272,9 @@
size_t & leafs_level,
Value const& v,
Translator const& t,
+ Allocators & allocators,
size_t relative_level)
- : base(root, leafs_level, v, t, relative_level)
+ : base(root, leafs_level, v, t, allocators, relative_level)
{}
inline void operator()(internal_node & n)
@@ -303,11 +306,11 @@
}
};
-template <typename Value, typename Options, typename Translator, typename Box>
-struct level_insert<0, Value, Value, Options, Translator, Box>
- : public level_insert_base<0, Value, Value, Options, Translator, Box>
+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>
{
- typedef level_insert_base<0, Value, Value, Options, Translator, Box> base;
+ typedef level_insert_base<0, Value, Value, Options, Translator, Box, Allocators> base;
typedef typename base::node node;
typedef typename base::internal_node internal_node;
typedef typename base::leaf leaf;
@@ -316,8 +319,9 @@
size_t & leafs_level,
Value const& v,
Translator const& t,
+ Allocators & allocators,
size_t relative_level)
- : base(root, leafs_level, v, t, relative_level)
+ : base(root, leafs_level, v, t, allocators, relative_level)
{}
inline void operator()(internal_node & n)
@@ -349,8 +353,8 @@
} // namespace detail
// R*-tree insert visitor
-template <typename Element, typename Value, typename Options, typename Translator, typename Box>
-class insert<Element, Value, Options, Translator, Box, insert_reinsert_tag>
+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, typename Options::node_tag, false>::type
, index::nonassignable
{
@@ -364,17 +368,18 @@
size_t & leafs_level,
Element const& element,
Translator const& tr,
+ Allocators & allocators,
size_t relative_level = 0)
: m_root(root), m_leafs_level(leafs_level), m_element(element)
- , m_tr(tr), m_relative_level(relative_level)
+ , m_tr(tr), m_relative_level(relative_level), m_allocators(allocators)
{}
inline void operator()(internal_node & BOOST_GEOMETRY_INDEX_ASSERT_UNUSED_PARAM(n))
{
BOOST_GEOMETRY_INDEX_ASSERT(&n == rtree::get<internal_node>(m_root), "current node should be the root");
- detail::rstar::level_insert<0, Element, Value, Options, Translator, Box> lins_v(
- m_root, m_leafs_level, m_element, m_tr, m_relative_level);
+ detail::rstar::level_insert<0, Element, Value, Options, Translator, Box, Allocators> lins_v(
+ m_root, m_leafs_level, m_element, m_tr, m_allocators, m_relative_level);
rtree::apply_visitor(lins_v, *m_root);
@@ -388,8 +393,8 @@
{
BOOST_GEOMETRY_INDEX_ASSERT(&n == rtree::get<leaf>(m_root), "current node should be the root");
- detail::rstar::level_insert<0, Element, Value, Options, Translator, Box> lins_v(
- m_root, m_leafs_level, m_element, m_tr, m_relative_level);
+ detail::rstar::level_insert<0, Element, Value, Options, Translator, Box, Allocators> lins_v(
+ m_root, m_leafs_level, m_element, m_tr, m_allocators, m_relative_level);
rtree::apply_visitor(lins_v, *m_root);
@@ -407,8 +412,8 @@
for ( typename Elements::const_reverse_iterator it = elements.rbegin();
it != elements.rend(); ++it)
{
- detail::rstar::level_insert<1, element_type, Value, Options, Translator, Box> lins_v(
- m_root, m_leafs_level, *it, m_tr, relative_level);
+ detail::rstar::level_insert<1, element_type, Value, Options, Translator, Box, Allocators> lins_v(
+ m_root, m_leafs_level, *it, m_tr, m_allocators, relative_level);
rtree::apply_visitor(lins_v, *m_root);
@@ -427,6 +432,8 @@
Element const& m_element;
Translator const& m_tr;
size_t m_relative_level;
+
+ Allocators m_allocators;
};
}}} // namespace detail::rtree::visitors
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
@@ -64,7 +64,8 @@
template <
typename Value,
typename Parameters,
- typename Translator = translator::def<Value>
+ typename Translator = translator::def<Value>,
+ typename Allocator = std::allocator<Value>
>
class rtree
: public boost::noncopyable
@@ -82,17 +83,22 @@
typedef typename detail::rtree::internal_node<value_type, typename options_type::parameters_type, box_type, node_tag>::type internal_node;
typedef typename detail::rtree::leaf<value_type, typename options_type::parameters_type, box_type, node_tag>::type leaf;
- inline explicit rtree(translator_type const& translator = translator_type())
+ typedef Allocator allocator_type;
+ typedef detail::rtree::allocators<value_type, typename options_type::parameters_type, box_type, node_tag, allocator_type> allocators_type;
+ typedef typename allocators_type::size_type size_type;
+
+ inline explicit rtree(translator_type const& translator = translator_type(), Allocator allocator = std::allocator<value_type>())
: m_values_count(0)
, m_root(0)
, m_leafs_level(0)
, m_translator(translator)
+ , m_allocators(allocator)
{
create();
}
template<typename Iterator>
- inline explicit rtree(Iterator first, Iterator last, translator_type const& translator = translator_type())
+ inline explicit rtree(Iterator first, Iterator last, translator_type const& translator = translator_type(), Allocator allocator = std::allocator<value_type>())
: m_values_count(0)
, m_root(0)
, m_leafs_level(0)
@@ -108,6 +114,7 @@
}
inline rtree(rtree const& src)
+ : m_allocators(src.m_allocators)
{
copy(src, *this);
}
@@ -118,6 +125,8 @@
return *this;
destroy(*this);
+
+ m_allocators = src.m_allocators;
copy(src, *this);
return *this;
@@ -133,8 +142,9 @@
options_type,
translator_type,
box_type,
+ allocators_type,
typename options_type::insert_tag
- > insert_v(m_root, m_leafs_level, value, m_translator);
+ > insert_v(m_root, m_leafs_level, value, m_translator, m_allocators);
detail::rtree::apply_visitor(insert_v, *m_root);
@@ -158,8 +168,9 @@
value_type,
options_type,
translator_type,
- box_type
- > remove_v(m_root, m_leafs_level, value, m_translator);
+ box_type,
+ allocators_type
+ > remove_v(m_root, m_leafs_level, value, m_translator, m_allocators);
detail::rtree::apply_visitor(remove_v, *m_root);
@@ -174,7 +185,7 @@
}
template <typename Predicates, typename OutIter>
- inline size_t query(Predicates const& pred, OutIter out_it) const
+ inline size_type query(Predicates const& pred, OutIter out_it) const
{
detail::rtree::visitors::query<value_type, options_type, translator_type, box_type, Predicates, OutIter>
find_v(m_translator, pred, out_it);
@@ -185,30 +196,30 @@
}
template <typename DistancePredicate>
- inline size_t nearest(DistancePredicate const& dpred, value_type & v) const
+ inline size_type nearest(DistancePredicate const& dpred, value_type & v) const
{
return nearest_one(dpred, detail::empty(), v);
}
template <typename DistancePredicate, typename Predicates>
- inline size_t nearest(DistancePredicate const& dpred, Predicates const& pred, value_type & v) const
+ inline size_type nearest(DistancePredicate const& dpred, Predicates const& pred, value_type & v) const
{
return nearest_one(dpred, pred, v);
}
template <typename DistancePredicate, typename OutIter>
- inline size_t nearest(DistancePredicate const& dpred, size_t k, OutIter out_it) const
+ inline size_type nearest(DistancePredicate const& dpred, size_t k, OutIter out_it) const
{
return nearest_k(dpred, k, detail::empty(), out_it);
}
template <typename DistancePredicate, typename Predicates, typename OutIter>
- inline size_t nearest(DistancePredicate const& dpred, size_t k, Predicates const& pred, OutIter out_it) const
+ inline size_type nearest(DistancePredicate const& dpred, size_t k, Predicates const& pred, OutIter out_it) const
{
return nearest_k(dpred, k, pred, out_it);
}
- inline size_t size() const
+ inline size_type size() const
{
return m_values_count;
}
@@ -252,12 +263,12 @@
return m_translator;
}
- inline size_t values_count() const
+ inline size_type values_count() const
{
return m_values_count;
}
- inline size_t depth() const
+ inline size_type depth() const
{
return m_leafs_level;
}
@@ -265,16 +276,15 @@
private:
inline void create()
{
- m_root = detail::rtree::create_node(leaf());
+ m_root = detail::rtree::create_node<allocators_type, leaf>::apply(m_allocators);
m_values_count = 0;
m_leafs_level = 0;
}
inline void destroy(rtree & t)
{
- detail::rtree::visitors::destroy<value_type, options_type, translator_type, box_type> del_v;
+ detail::rtree::visitors::destroy<value_type, options_type, translator_type, box_type, allocators_type> del_v(t.m_root, t.m_allocators);
detail::rtree::apply_visitor(del_v, *t.m_root);
- detail::rtree::delete_node(t.m_root);
t.m_root = 0;
t.m_values_count = 0;
@@ -283,7 +293,9 @@
inline void copy(rtree const& src, rtree & dst) const
{
- detail::rtree::visitors::copy<value_type, options_type, translator_type, box_type> copy_v;
+ //dst.m_allocators = src.m_allocators;
+
+ detail::rtree::visitors::copy<value_type, options_type, translator_type, box_type, allocators_type> copy_v(dst.m_allocators);
detail::rtree::apply_visitor(copy_v, *src.m_root);
dst.m_root = copy_v.result;
@@ -293,7 +305,7 @@
}
template <typename DistancesPredicates, typename Predicates>
- inline size_t nearest_one(DistancesPredicates const& dpred, Predicates const& pred, value_type & v) const
+ inline size_type nearest_one(DistancesPredicates const& dpred, Predicates const& pred, value_type & v) const
{
typedef typename detail::point_relation<DistancesPredicates>::type point_relation;
typedef typename detail::relation<point_relation>::value_type point_type;
@@ -322,7 +334,7 @@
}
template <typename DistancesPredicates, typename Predicates, typename OutIter>
- inline size_t nearest_k(DistancesPredicates const& dpred, size_t k, Predicates const& pred, OutIter out_it) const
+ inline size_type nearest_k(DistancesPredicates const& dpred, size_t k, Predicates const& pred, OutIter out_it) const
{
typedef typename detail::point_relation<DistancesPredicates>::type point_relation;
typedef typename detail::relation<point_relation>::value_type point_type;
@@ -350,87 +362,88 @@
return result.get(out_it);
}
- size_t m_values_count;
+ size_type m_values_count;
node *m_root;
- size_t m_leafs_level;
+ size_type m_leafs_level;
translator_type m_translator;
+ allocators_type m_allocators;
};
-template <typename Value, typename Options, typename Translator>
-inline void insert(rtree<Value, Options, Translator> & tree, Value const& v)
+template <typename Value, typename Options, typename Translator, typename Allocator>
+inline void insert(rtree<Value, Options, Translator, Allocator> & tree, Value const& v)
{
tree.insert(v);
}
-template<typename Value, typename Options, typename Translator, typename Iterator>
-inline void insert(rtree<Value, Options, Translator> & tree, Iterator first, Iterator last)
+template<typename Value, typename Options, typename Translator, typename Allocator, typename Iterator>
+inline void insert(rtree<Value, Options, Translator, Allocator> & tree, Iterator first, Iterator last)
{
tree.insert(first, last);
}
-template <typename Value, typename Options, typename Translator>
-inline void remove(rtree<Value, Options, Translator> & tree, Value const& v)
+template <typename Value, typename Options, typename Translator, typename Allocator>
+inline void remove(rtree<Value, Options, Translator, Allocator> & tree, Value const& v)
{
tree.remove(v);
}
-template<typename Value, typename Options, typename Translator, typename Iterator>
-inline void remove(rtree<Value, Options, Translator> & tree, Iterator first, Iterator last)
+template<typename Value, typename Options, typename Translator, typename Allocator, typename Iterator>
+inline void remove(rtree<Value, Options, Translator, Allocator> & tree, Iterator first, Iterator last)
{
tree.remove(first, last);
}
-template <typename Value, typename Options, typename Translator, typename Predicates, typename OutIter>
-inline size_t query(rtree<Value, Options, Translator> const& tree, Predicates const& pred, OutIter out_it)
+template <typename Value, typename Options, typename Translator, typename Allocator, typename Predicates, typename OutIter>
+inline size_t query(rtree<Value, Options, Translator, Allocator> const& tree, Predicates const& pred, OutIter out_it)
{
return tree.query(pred, out_it);
}
-template <typename Value, typename Options, typename Translator, typename DistancesPredicates>
-inline size_t nearest(rtree<Value, Options, Translator> const& tree, DistancesPredicates const& dpred, Value & v)
+template <typename Value, typename Options, typename Translator, typename Allocator, typename DistancesPredicates>
+inline size_t nearest(rtree<Value, Options, Translator, Allocator> const& tree, DistancesPredicates const& dpred, Value & v)
{
return tree.nearest(dpred, v);
}
-template <typename Value, typename Options, typename Translator, typename DistancesPredicates, typename Predicates>
-inline size_t nearest(rtree<Value, Options, Translator> const& tree, DistancesPredicates const& dpred, Predicates const& pred, Value & v)
+template <typename Value, typename Options, typename Translator, typename Allocator, typename DistancesPredicates, typename Predicates>
+inline size_t nearest(rtree<Value, Options, Translator, Allocator> const& tree, DistancesPredicates const& dpred, Predicates const& pred, Value & v)
{
return tree.nearest(dpred, pred, v);
}
-template <typename Value, typename Options, typename Translator, typename DistancesPredicates, typename OutIter>
-inline size_t nearest(rtree<Value, Options, Translator> const& tree, DistancesPredicates const& dpred, size_t k, OutIter out_it)
+template <typename Value, typename Options, typename Translator, typename Allocator, typename DistancesPredicates, typename OutIter>
+inline size_t nearest(rtree<Value, Options, Translator, Allocator> const& tree, DistancesPredicates const& dpred, size_t k, OutIter out_it)
{
return tree.nearest(dpred, k, out_it);
}
-template <typename Value, typename Options, typename Translator, typename DistancesPredicates, typename Predicates, typename OutIter>
-inline size_t nearest(rtree<Value, Options, Translator> const& tree, DistancesPredicates const& dpred, size_t k, Predicates const& pred, OutIter out_it)
+template <typename Value, typename Options, typename Translator, typename Allocator, typename DistancesPredicates, typename Predicates, typename OutIter>
+inline size_t nearest(rtree<Value, Options, Translator, Allocator> const& tree, DistancesPredicates const& dpred, size_t k, Predicates const& pred, OutIter out_it)
{
return tree.nearest(dpred, k, pred, out_it);
}
-template <typename Value, typename Options, typename Translator>
-inline void clear(rtree<Value, Options, Translator> & tree)
+template <typename Value, typename Options, typename Translator, typename Allocator>
+inline void clear(rtree<Value, Options, Translator, Allocator> & tree)
{
return tree.clear();
}
-template <typename Value, typename Options, typename Translator>
-inline size_t size(rtree<Value, Options, Translator> const& tree)
+template <typename Value, typename Options, typename Translator, typename Allocator>
+inline size_t size(rtree<Value, Options, Translator, Allocator> const& tree)
{
return tree.size();
}
-template <typename Value, typename Options, typename Translator>
-inline bool empty(rtree<Value, Options, Translator> const& tree)
+template <typename Value, typename Options, typename Translator, typename Allocator>
+inline bool empty(rtree<Value, Options, Translator, Allocator> const& tree)
{
return tree.empty();
}
-template <typename Value, typename Options, typename Translator>
-inline typename rtree<Value, Options, Translator>::box_type
-box(rtree<Value, Options, Translator> const& tree)
+template <typename Value, typename Options, typename Translator, typename Allocator>
+inline typename rtree<Value, Options, Translator, Allocator>::box_type
+box(rtree<Value, Options, Translator, Allocator> const& tree)
{
return tree.box();
}
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/copy.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/copy.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/copy.hpp 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
@@ -16,21 +16,24 @@
namespace detail { namespace rtree { namespace visitors {
-template <typename Value, typename Options, typename Translator, typename Box>
-struct copy
+template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+class copy
: public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, false>::type
+ , boost::noncopyable
{
+public:
typedef typename rtree::node<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type node;
typedef typename rtree::internal_node<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type internal_node;
typedef typename rtree::leaf<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type leaf;
- explicit inline copy()
+ explicit inline copy(Allocators & allocators)
: result(0)
+ , m_allocators(allocators)
{}
inline void operator()(internal_node & n)
{
- node * new_node = rtree::create_node(internal_node());
+ node * new_node = rtree::create_node<Allocators, internal_node>::apply(m_allocators);
typedef typename rtree::elements_type<internal_node>::type elements_type;
elements_type & elements = rtree::elements(n);
@@ -50,7 +53,7 @@
inline void operator()(leaf & l)
{
- node * new_node = rtree::create_node(leaf());
+ node * new_node = rtree::create_node<Allocators, leaf>::apply(m_allocators);
typedef typename rtree::elements_type<leaf>::type elements_type;
elements_type & elements = rtree::elements(l);
@@ -67,6 +70,9 @@
}
node * result;
+
+private:
+ Allocators & m_allocators;
};
}}} // namespace detail::rtree::visitors
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/destroy.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/destroy.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/destroy.hpp 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
@@ -16,28 +16,50 @@
namespace detail { namespace rtree { namespace visitors {
-template <typename Value, typename Options, typename Translator, typename Box>
-struct destroy : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, false>::type
+template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+class destroy
+ : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, false>::type
+ , boost::noncopyable
{
+public:
+ typedef typename rtree::node<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type node;
typedef typename rtree::internal_node<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type internal_node;
typedef typename rtree::leaf<Value, typename Options::parameters_type, Box, typename Options::node_tag>::type leaf;
+ inline destroy(node * root_node, Allocators & allocators)
+ : m_current_node(root_node)
+ , m_allocators(allocators)
+ {}
+
inline void operator()(internal_node & n)
{
+ BOOST_GEOMETRY_INDEX_ASSERT(&n == rtree::get<internal_node>(m_current_node), "invalid pointers");
+
+ node * node_to_destroy = m_current_node;
+
typedef typename rtree::elements_type<internal_node>::type elements_type;
elements_type & elements = rtree::elements(n);
for (typename elements_type::iterator it = elements.begin();
it != elements.end(); ++it)
{
- rtree::apply_visitor(*this, *it->second);
- rtree::delete_node(it->second);
+ m_current_node = it->second;
+ rtree::apply_visitor(*this, *m_current_node);
}
+
+ rtree::destroy_node<Allocators, internal_node>::apply(m_allocators, node_to_destroy);
}
- inline void operator()(leaf &n)
+ inline void operator()(leaf & l)
{
+ BOOST_GEOMETRY_INDEX_ASSERT(&l == rtree::get<leaf>(m_current_node), "invalid pointers");
+
+ rtree::destroy_node<Allocators, leaf>::apply(m_allocators, m_current_node);
}
+
+private:
+ node * m_current_node;
+ Allocators & m_allocators;
};
}}} // namespace detail::rtree::visitors
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/insert.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/insert.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/insert.hpp 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
@@ -101,16 +101,17 @@
typedef typename Options::parameters_type parameters_type;
public:
- template <typename Node>
+ template <typename Node, typename Allocators>
static inline void apply(node* & root_node,
size_t & leafs_level,
Node & n,
internal_node *parent_node,
size_t current_child_index,
- Translator const& tr)
+ Translator const& tr,
+ Allocators & allocators)
{
// create additional node
- node * second_node = rtree::create_node(Node());
+ node * second_node = rtree::create_node<Allocators, Node>::apply(allocators);
Node & n2 = rtree::get<Node>(*second_node);
// redistribute elements
@@ -140,7 +141,7 @@
BOOST_GEOMETRY_INDEX_ASSERT(&n == rtree::get<Node>(root_node), "node should be the root");
// create new root and add nodes
- node * new_root = rtree::create_node(internal_node());
+ node * new_root = rtree::create_node<Allocators, internal_node>::apply(allocators);
rtree::elements(rtree::get<internal_node>(*new_root)).push_back(std::make_pair(box1, root_node));
rtree::elements(rtree::get<internal_node>(*new_root)).push_back(std::make_pair(box2, second_node));
@@ -154,7 +155,7 @@
// ----------------------------------------------------------------------- //
// Default insert visitor
-template <typename Element, typename Value, typename Options, typename Translator, typename Box>
+template <typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
class insert
: public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, false>::type
, index::nonassignable
@@ -170,6 +171,7 @@
size_t & leafs_level,
Element const& element,
Translator const& t,
+ Allocators & allocators,
size_t relative_level = 0
)
: m_element(element)
@@ -181,6 +183,7 @@
, m_parent(0)
, m_current_child_index(0)
, m_current_level(0)
+ , m_allocators(allocators)
{
BOOST_GEOMETRY_INDEX_ASSERT(m_relative_level <= leafs_level, "unexpected level value");
BOOST_GEOMETRY_INDEX_ASSERT(m_level <= m_leafs_level, "unexpected level value");
@@ -245,7 +248,7 @@
template <typename Node>
inline void split(Node & n) const
{
- detail::split<Value, Options, Translator, Box, typename Options::split_tag>::apply(m_root_node, m_leafs_level, n, m_parent, m_current_child_index, m_tr);
+ detail::split<Value, Options, Translator, Box, typename Options::split_tag>::apply(m_root_node, m_leafs_level, n, m_parent, m_current_child_index, m_tr, m_allocators);
}
// TODO: awulkiew - implement dispatchable split::apply to enable additional nodes creation
@@ -262,20 +265,22 @@
internal_node *m_parent;
size_t m_current_child_index;
size_t m_current_level;
+
+ Allocators & m_allocators;
};
} // namespace detail
// Insert visitor forward declaration
-template <typename Element, typename Value, typename Options, typename Translator, typename Box, typename InsertTag>
+template <typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators, typename InsertTag>
struct insert;
// Default insert visitor used for nodes elements
-template <typename Element, typename Value, typename Options, typename Translator, typename Box>
-struct insert<Element, Value, Options, Translator, Box, insert_default_tag>
- : public detail::insert<Element, Value, Options, Translator, Box>
+template <typename Element, typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+struct insert<Element, Value, Options, Translator, Box, Allocators, insert_default_tag>
+ : public detail::insert<Element, Value, Options, Translator, Box, Allocators>
{
- typedef detail::insert<Element, Value, Options, Translator, Box> base;
+ typedef detail::insert<Element, Value, Options, Translator, Box, Allocators> base;
typedef typename base::node node;
typedef typename base::internal_node internal_node;
typedef typename base::leaf leaf;
@@ -284,9 +289,10 @@
size_t & leafs_level,
Element const& element,
Translator const& tr,
+ Allocators & allocators,
size_t relative_level = 0
)
- : base(root, leafs_level, element, tr, relative_level)
+ : base(root, leafs_level, element, tr, allocators, relative_level)
{}
inline void operator()(internal_node & n)
@@ -316,11 +322,11 @@
};
// Default insert visitor specialized for Values elements
-template <typename Value, typename Options, typename Translator, typename Box>
-struct insert<Value, Value, Options, Translator, Box, insert_default_tag>
- : public detail::insert<Value, Value, Options, Translator, Box>
+template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
+struct insert<Value, Value, Options, Translator, Box, Allocators, insert_default_tag>
+ : public detail::insert<Value, Value, Options, Translator, Box, Allocators>
{
- typedef detail::insert<Value, Value, Options, Translator, Box> base;
+ typedef detail::insert<Value, Value, Options, Translator, Box, Allocators> base;
typedef typename base::node node;
typedef typename base::internal_node internal_node;
typedef typename base::leaf leaf;
@@ -329,9 +335,10 @@
size_t & leafs_level,
Value const& v,
Translator const& t,
+ Allocators & allocators,
size_t relative_level = 0
)
- : base(root, leafs_level, v, t, relative_level)
+ : base(root, leafs_level, v, t, allocators, relative_level)
{}
inline void operator()(internal_node & n)
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/remove.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/remove.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/remove.hpp 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
@@ -21,7 +21,7 @@
namespace detail { namespace rtree { namespace visitors {
// Default remove algorithm
-template <typename Value, typename Options, typename Translator, typename Box>
+template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
class remove
: public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, false>::type
, index::nonassignable
@@ -36,9 +36,11 @@
inline remove(node* & root,
size_t & leafs_level,
Value const& v,
- Translator const& t)
+ Translator const& t,
+ Allocators & allocators)
: m_value(v)
, m_tr(t)
+ , m_allocators(allocators)
, m_root_node(root)
, m_leafs_level(leafs_level)
, m_is_value_removed(false)
@@ -115,16 +117,27 @@
is_leaf<Value, Options, Box> ilv;
rtree::apply_visitor(ilv, *it->second);
if ( ilv.result )
+ {
reinsert_elements(rtree::get<leaf>(*it->second), it->first);
+
+ rtree::destroy_node<Allocators, leaf>::apply(m_allocators, it->second);
+ }
else
+ {
reinsert_elements(rtree::get<internal_node>(*it->second), it->first);
+
+ rtree::destroy_node<Allocators, internal_node>::apply(m_allocators, it->second);
+ }
}
// shorten the tree
if ( rtree::elements(n).size() == 1 )
{
+ node * root_to_destroy = m_root_node;
m_root_node = rtree::elements(n)[0].second;
--m_leafs_level;
+
+ rtree::destroy_node<Allocators, internal_node>::apply(m_allocators, root_to_destroy);
}
}
}
@@ -190,11 +203,20 @@
for ( typename elements_type::iterator it = elements.begin();
it != elements.end() ; ++it )
{
- visitors::insert<typename elements_type::value_type, Value, Options, Translator, Box, typename Options::insert_tag> insert_v(
+ visitors::insert<
+ typename elements_type::value_type,
+ Value,
+ Options,
+ Translator,
+ Box,
+ Allocators,
+ typename Options::insert_tag
+ > insert_v(
m_root_node,
m_leafs_level,
*it,
m_tr,
+ m_allocators,
node_relative_level - 1);
rtree::apply_visitor(insert_v, *m_root_node);
@@ -203,6 +225,7 @@
Value const& m_value;
Translator const& m_tr;
+ Allocators & m_allocators;
node* & m_root_node;
size_t & m_leafs_level;
Modified: sandbox-branches/geometry/index/tests/rtree_function.hpp
==============================================================================
--- sandbox-branches/geometry/index/tests/rtree_function.hpp (original)
+++ sandbox-branches/geometry/index/tests/rtree_function.hpp 2011-10-02 19:32:22 EDT (Sun, 02 Oct 2011)
@@ -228,7 +228,7 @@
} // namespace helpers
template <typename Predicate, typename Rtree, typename Cont, typename Randomizer>
-void random_query_check(Rtree const& t, Rtree const& t_copy, Cont const& c, size_t n, Randomizer r)
+void random_query_check(Rtree const& t, Cont const& c, size_t n, Randomizer r)
{
namespace bg = boost::geometry;
namespace bgi = bg::index;
@@ -237,32 +237,28 @@
{
Predicate pred = Predicate(r());
- std::vector<typename Rtree::value_type> res1, res2, res3;
+ std::vector<typename Rtree::value_type> res1, res2;
bgi::query(t, pred, std::back_inserter(res1));
- bgi::query(t_copy, pred, std::back_inserter(res2));
for ( typename Cont::const_iterator it = c.begin() ; it != c.end() ; ++it )
{
if ( bgi::predicates_check<bgi::detail::rtree::value_tag>(pred, *it, t.translator()(*it)) )
- res3.push_back(*it);
+ res2.push_back(*it);
}
std::stringstream ss;
ss << "\nPredicate: " << typeid(Predicate).name() << "\n"
<< "res1: " << res1.size()
- << ", res2: " << res2.size()
- << ", res3: " << res3.size() << '\n';
+ << ", res2: " << res2.size()<< '\n';
BOOST_CHECK_MESSAGE( helpers::results_compare(res1, res2, t.translator()), ss.str());
- BOOST_CHECK_MESSAGE( helpers::results_compare(res1, res3, t.translator()), ss.str());
}
}
template <typename Predicate, typename Rtree, typename Cont, typename PointRandomizer, typename PredicateRandomizer>
void random_nearest_check(
Rtree const& t,
- Rtree const& t_copy,
Cont const& c,
size_t n,
PointRandomizer const& pr,
@@ -277,36 +273,32 @@
typename PointRandomizer::value_type pt = pr();
Predicate pred = Predicate(r());
- std::vector<typename Rtree::value_type> res1, res2, res3;
+ std::vector<typename Rtree::value_type> res1, res2;
bgi::nearest(t, pt, k, pred, std::back_inserter(res1));
- bgi::nearest(t_copy, pt, k, pred, std::back_inserter(res2));
-
for ( typename Cont::const_iterator it = c.begin() ; it != c.end() ; ++it )
{
if ( bgi::predicates_check<bgi::detail::rtree::value_tag>(pred, *it, t.translator()(*it)) )
- res3.push_back(*it);
+ res2.push_back(*it);
}
std::sort(
- res3.begin(),
- res3.end(),
+ res2.begin(),
+ res2.end(),
helpers::val_mindist_cmp<
typename PointRandomizer::value_type,
typename Rtree::translator_type
>(pt, t.translator())
);
- if ( k < res3.size() )
- res3.resize(k);
+ if ( k < res2.size() )
+ res2.resize(k);
std::stringstream ss;
ss << "\nPredicate: " << typeid(Predicate).name() << "\n"
<< "res1: " << res1.size()
- << ", res2: " << res2.size()
- << ", res3: " << res3.size() << '\n';
+ << ", res2: " << res2.size() << '\n';
BOOST_CHECK_MESSAGE(helpers::nearest_results_compare(pt, res1, res2, t.translator()), ss.str());
- BOOST_CHECK_MESSAGE(helpers::nearest_results_compare(pt, res1, res3, t.translator()), ss.str());
}
}
@@ -317,26 +309,26 @@
struct tests_rtree_function_queries<P, B, boost::geometry::point_tag>
{
template <typename Rtree, typename Cont>
- inline static void apply(Rtree const& t, Rtree const& t_copy, Cont const& v)
+ inline static void apply(Rtree const& t, Cont const& v)
{
namespace bgi = boost::geometry::index;
- random_query_check<B>(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::covered_by<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::disjoint<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::intersects<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::within<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::not_covered_by<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::not_disjoint<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::not_intersects<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::not_within<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
-
- random_nearest_check<bgi::detail::empty>(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, bgi::empty);
- random_nearest_check<B>(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
- random_nearest_check<bgi::detail::intersects<B> >(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
- random_nearest_check<bgi::detail::within<B> >(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
- random_nearest_check<bgi::detail::covered_by<B> >(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
- random_nearest_check<bgi::detail::disjoint<B> >(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_query_check<B>(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::covered_by<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::disjoint<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::intersects<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::within<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::not_covered_by<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::not_disjoint<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::not_intersects<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::not_within<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+
+ random_nearest_check<bgi::detail::empty>(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, bgi::empty);
+ random_nearest_check<B>(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_nearest_check<bgi::detail::intersects<B> >(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_nearest_check<bgi::detail::within<B> >(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_nearest_check<bgi::detail::covered_by<B> >(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_nearest_check<bgi::detail::disjoint<B> >(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
}
};
@@ -344,29 +336,29 @@
struct tests_rtree_function_queries<P, B, boost::geometry::box_tag>
{
template <typename Rtree, typename Cont>
- inline static void apply(Rtree const& t, Rtree const& t_copy, Cont const& v)
+ inline static void apply(Rtree const& t, Cont const& v)
{
namespace bgi = boost::geometry::index;
- random_query_check<B>(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::covered_by<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::disjoint<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::intersects<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::overlaps<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::within<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::not_covered_by<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::not_disjoint<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::not_intersects<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::not_overlaps<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
- random_query_check<bgi::detail::not_within<B> >(t, t_copy, v, 5, helpers::value_randomizer<B>(10, 5));
-
- random_nearest_check<bgi::detail::empty>(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, bgi::empty);
- random_nearest_check<B>(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
- random_nearest_check<bgi::detail::intersects<B> >(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
- random_nearest_check<bgi::detail::overlaps<B> >(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
- random_nearest_check<bgi::detail::within<B> >(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
- random_nearest_check<bgi::detail::covered_by<B> >(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
- random_nearest_check<bgi::detail::disjoint<B> >(t, t_copy, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_query_check<B>(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::covered_by<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::disjoint<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::intersects<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::overlaps<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::within<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::not_covered_by<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::not_disjoint<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::not_intersects<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::not_overlaps<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+ random_query_check<bgi::detail::not_within<B> >(t, v, 5, helpers::value_randomizer<B>(10, 5));
+
+ random_nearest_check<bgi::detail::empty>(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, bgi::empty);
+ random_nearest_check<B>(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_nearest_check<bgi::detail::intersects<B> >(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_nearest_check<bgi::detail::overlaps<B> >(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_nearest_check<bgi::detail::within<B> >(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_nearest_check<bgi::detail::covered_by<B> >(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
+ random_nearest_check<bgi::detail::disjoint<B> >(t, v, 5, helpers::value_randomizer<P>(10, 0), 3, helpers::value_randomizer<B>(10, 5));
}
};
@@ -395,7 +387,7 @@
B bv = helpers::values_box<B>(v.begin(), v.end(), tr);
BOOST_CHECK(bg::equals(bt, bv));
- tests_rtree_function_queries<P, B, bgi::traits::tag<I>::type>::apply(t, t_copy, v);
+ tests_rtree_function_queries<P, B, bgi::traits::tag<I>::type>::apply(t, v);
bgi::clear(t);
BOOST_CHECK(bgi::empty(t));
@@ -403,6 +395,12 @@
B be;
bg::assign_inverse(be);
BOOST_CHECK(bg::equals(be, bt));
+
+ for ( size_t i = 3 ; i < 10 ; ++i )
+ bgi::remove(t_copy, v[i]);
+ v.erase(v.begin() + 3, v.end());
+
+ tests_rtree_function_queries<P, B, bgi::traits::tag<I>::type>::apply(t_copy, v);
}
BOOST_AUTO_TEST_CASE(tests_rtree_function_box3f)
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk