|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r74082 - in sandbox-branches/geometry/index: boost/geometry/extensions/index boost/geometry/extensions/index/algorithms boost/geometry/extensions/index/rtree boost/geometry/extensions/index/rtree/visitors boost/geometry/extensions/index/translator tests
From: adam.wulkiewicz_at_[hidden]
Date: 2011-08-26 20:05:56
Author: awulkiew
Date: 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
New Revision: 74082
URL: http://svn.boost.org/trac/boost/changeset/74082
Log:
predicates implemented, query() method added to the rtree + some cleanup.
Added:
sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp (contents, props changed)
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/predicates.hpp (contents, props changed)
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/query.hpp (contents, props changed)
Text files modified:
sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/intersection_content.hpp | 16 +-
sandbox-branches/geometry/index/boost/geometry/extensions/index/assert.hpp | 6
sandbox-branches/geometry/index/boost/geometry/extensions/index/indexable.hpp | 14 +-
sandbox-branches/geometry/index/boost/geometry/extensions/index/nonassignable.hpp | 2
sandbox-branches/geometry/index/boost/geometry/extensions/index/pushable_array.hpp | 274 ++++++++++++++++++++--------------------
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/options.hpp | 92 ++++++------
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp | 24 ++-
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp | 42 +++---
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp | 32 ++--
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/find.hpp | 4
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp | 2
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/insert.hpp | 152 +++++++++++-----------
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/print.hpp | 2
sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/remove.hpp | 10
sandbox-branches/geometry/index/boost/geometry/extensions/index/translator/getter.hpp | 4
sandbox-branches/geometry/index/boost/geometry/extensions/index/translator/helpers.hpp | 16 +-
sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp | 106 ++++++++++-----
sandbox-branches/geometry/index/tests/main.cpp | 2
18 files changed, 422 insertions(+), 378 deletions(-)
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/intersection_content.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/intersection_content.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/algorithms/intersection_content.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -21,14 +21,14 @@
template <typename Box>
inline typename default_content_result<Box>::type intersection_content(Box const& box1, Box const& box2)
{
- typename default_content_result<Box>::type result = 0;
- if ( geometry::intersects(box1, box2) )
- {
- Box box_intersection;
- geometry::intersection(box1, box2, box_intersection);
- result = index::content(box_intersection);
- }
- return result;
+ typename default_content_result<Box>::type result = 0;
+ if ( geometry::intersects(box1, box2) )
+ {
+ Box box_intersection;
+ geometry::intersection(box1, box2, box_intersection);
+ result = index::content(box_intersection);
+ }
+ return result;
}
}}} // namespace boost::geometry::index
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/assert.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/assert.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/assert.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -7,8 +7,8 @@
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
-#ifndef BOOST_GEOMETRY_EXTENSIONS_ASSERT_HPP
-#define BOOST_GEOMETRY_EXTENSIONS_ASSERT_HPP
+#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_ASSERT_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_ASSERT_HPP
#ifdef NDEBUG
@@ -24,4 +24,4 @@
#endif
-#endif // BOOST_GEOMETRY_EXTENSIONS_ASSERT_HPP
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_ASSERT_HPP
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/indexable.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/indexable.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/indexable.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -162,13 +162,13 @@
template <typename Indexable>
struct default_box_type
{
- typedef geometry::model::box<
- geometry::model::point<
- typename traits::coordinate_type<Indexable>::type,
- traits::dimension<Indexable>::value,
- typename traits::coordinate_system<Indexable>::type
- >
- > type;
+ typedef geometry::model::box<
+ geometry::model::point<
+ typename traits::coordinate_type<Indexable>::type,
+ traits::dimension<Indexable>::value,
+ typename traits::coordinate_system<Indexable>::type
+ >
+ > type;
};
}}} // namespace boost::geometry::index
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/nonassignable.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/nonassignable.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/nonassignable.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -14,7 +14,7 @@
class nonassignable
{
- nonassignable & operator=(nonassignable const&);
+ nonassignable & operator=(nonassignable const&);
};
}}} // namespace boost::geometry::index
Added: sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp
==============================================================================
--- (empty file)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/predicates.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -0,0 +1,217 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Boost.SpatialIndex - Spatial index query predicates
+//
+// Copyright 2011 Adam Wulkiewicz.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_PREDICATES_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_PREDICATES_HPP
+
+#include <utility>
+#include <boost/tuple/tuple.hpp>
+#include <boost/mpl/assert.hpp>
+
+// TODO: awulkiew - temporary
+#include <boost/geometry/algorithms/covered_by.hpp>
+
+namespace boost { namespace geometry { namespace index {
+
+// predicates
+
+namespace detail {
+
+template <typename Geometry>
+struct covered_by
+{
+ covered_by(Geometry const& g) : geometry(g) {}
+ Geometry const& geometry;
+};
+
+template <typename Geometry>
+struct intersects
+{
+ intersects(Geometry const& g) : geometry(g) {}
+ Geometry const& geometry;
+};
+
+template <typename Geometry>
+struct overlaps
+{
+ overlaps(Geometry const& g) : geometry(g) {}
+ Geometry const& geometry;
+};
+
+template <typename Geometry>
+struct within
+{
+ within(Geometry const& g) : geometry(g) {}
+ Geometry const& geometry;
+};
+
+} // namespace detail
+
+template <typename Geometry>
+inline detail::covered_by<Geometry> covered_by(Geometry const& g)
+{
+ return detail::covered_by<Geometry>(g);
+}
+
+template <typename Geometry>
+inline detail::intersects<Geometry> intersects(Geometry const& g)
+{
+ return detail::intersects<Geometry>(g);
+}
+
+template <typename Geometry>
+inline detail::overlaps<Geometry> overlaps(Geometry const& g)
+{
+ return detail::overlaps<Geometry>(g);
+}
+
+template <typename Geometry>
+inline detail::within<Geometry> within(Geometry const& g)
+{
+ return detail::within<Geometry>(g);
+}
+
+// predicates checks
+
+namespace detail
+{
+
+template <typename Geometry, typename Tag>
+struct predicate_check
+{
+ template <typename Indexable>
+ static inline bool apply(Geometry const& g, Indexable const& i)
+ {
+ return geometry::intersects(i, g);
+ }
+};
+
+template <typename Geometry, typename Tag>
+struct predicate_check<covered_by<Geometry>, Tag>
+{
+ template <typename Indexable>
+ static inline bool apply(covered_by<Geometry> const& p, Indexable const& i)
+ {
+ return geometry::covered_by(i, p.geometry);
+ }
+};
+
+template <typename Geometry, typename Tag>
+struct predicate_check<intersects<Geometry>, Tag>
+{
+ template <typename Indexable>
+ static inline bool apply(intersects<Geometry> const& p, Indexable const& i)
+ {
+ return geometry::intersects(i, p.geometry);
+ }
+};
+
+template <typename Geometry, typename Tag>
+struct predicate_check<overlaps<Geometry>, Tag>
+{
+ template <typename Indexable>
+ static inline bool apply(overlaps<Geometry> const& p, Indexable const& i)
+ {
+ return geometry::overlaps(i, p.geometry);
+ }
+};
+
+template <typename Geometry, typename Tag>
+struct predicate_check<within<Geometry>, Tag>
+{
+ template <typename Indexable>
+ static inline bool apply(within<Geometry> const& p, Indexable const& i)
+ {
+ return geometry::within(i, p.geometry);
+ }
+};
+
+template <typename TuplePredicates, typename Tag, unsigned int N>
+struct predicates_check_tuple
+{
+ template <typename Indexable>
+ static inline bool apply(TuplePredicates const& p, Indexable const& i)
+ {
+ return predicates_check_tuple<TuplePredicates, Tag, N - 1>::apply(p, i)
+ && predicate_check<
+ typename boost::tuples::element<N - 1, TuplePredicates>::type,
+ Tag
+ >::apply(boost::get<N - 1>(p), i);
+ }
+};
+
+template <typename TuplePredicates, typename Tag>
+struct predicates_check_tuple<TuplePredicates, Tag, 0>
+{
+ template <typename Indexable>
+ static inline bool apply(TuplePredicates const& p, Indexable const& i)
+ {
+ return predicate_check<
+ typename boost::tuples::element<0, TuplePredicates>::type,
+ Tag
+ >::apply(boost::get<0>(p), i);
+ }
+};
+
+template <typename Predicate, typename Tag>
+struct predicates_check
+{
+ template <typename Indexable>
+ static inline bool apply(Predicate const& p, Indexable const& i)
+ {
+ return predicate_check<Predicate, Tag>::apply(p, i);
+ }
+};
+
+template <typename Predicate1, typename Predicate2, typename Tag>
+struct predicates_check<std::pair<Predicate1, Predicate2>, Tag>
+{
+ template <typename Indexable>
+ static inline bool apply(std::pair<Predicate1, Predicate2> const& p, Indexable const& i)
+ {
+ return predicate_check<Predicate1, Tag>::apply(p.first, i)
+ && predicate_check<Predicate2, Tag>::apply(p.second, i);
+ }
+};
+
+template <
+ typename T0, typename T1, typename T2, typename T3, typename T4,
+ typename T5, typename T6, typename T7, typename T8, typename T9,
+ typename Tag
+>
+struct predicates_check<
+ boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>,
+ Tag
+>
+{
+ typedef boost::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> predicates_type;
+
+ template <typename Indexable>
+ static inline bool apply(predicates_type const& p, Indexable const& i)
+ {
+ return predicates_check_tuple<
+ predicates_type,
+ Tag,
+ boost::tuples::length<predicates_type>::value
+ >::apply(p, i);
+ }
+};
+
+} // namespace detail
+
+template <typename Tag, typename Predicates, typename Indexable>
+inline bool predicates_check(Predicates const& p, Indexable const& i)
+{
+ return detail::predicates_check<Predicates, Tag>
+ ::apply(p, i);
+}
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_PREDICATES_HPP
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/pushable_array.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/pushable_array.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/pushable_array.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -19,146 +19,146 @@
template <typename Element, size_t Capacity>
class pushable_array
{
- typedef typename boost::array<Element, Capacity> array_type;
+ typedef typename boost::array<Element, Capacity> array_type;
public:
- typedef typename array_type::value_type value_type;
- typedef typename array_type::size_type size_type;
- typedef typename array_type::iterator iterator;
- typedef typename array_type::const_iterator const_iterator;
- typedef typename array_type::reverse_iterator reverse_iterator;
- typedef typename array_type::const_reverse_iterator const_reverse_iterator;
-
- inline pushable_array()
- : m_size(0)
- {}
-
- inline explicit pushable_array(size_type s)
- : m_size(s)
- {
- BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big");
- }
-
- inline void resize(size_type s)
- {
- BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big");
- m_size = s;
- }
-
- inline Element & operator[](size_type i)
- {
- BOOST_GEOMETRY_INDEX_ASSERT(i < m_size, "index of the element outside the container");
- return m_array[i];
- }
-
- inline Element const& operator[](size_type i) const
- {
- BOOST_GEOMETRY_INDEX_ASSERT(i < m_size, "index of the element outside the container");
- return m_array[i];
- }
-
- inline Element const& front() const
- {
- BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
- return m_array.front();
- }
-
- inline Element & front()
- {
- BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
- return m_array.front();
- }
-
- inline Element const& back() const
- {
- BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
- return *(begin() + (m_size - 1));
- }
-
- inline Element & back()
- {
- BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
- return *(begin() + (m_size - 1));
- }
-
- inline iterator begin()
- {
- return m_array.begin();
- }
-
- inline iterator end()
- {
- return m_array.begin() + m_size;
- }
-
- inline const_iterator begin() const
- {
- return m_array.begin();
- }
-
- inline const_iterator end() const
- {
- return m_array.begin() + m_size;
- }
-
- inline reverse_iterator rbegin()
- {
- return reverse_iterator(end());
- }
-
- inline reverse_iterator rend()
- {
- return reverse_iterator(begin());
- }
-
- inline const_reverse_iterator rbegin() const
- {
- return const_reverse_iterator(end());
- }
-
- inline const_reverse_iterator rend() const
- {
- return const_reverse_iterator(begin());
- }
-
- inline void clear()
- {
- m_size = 0;
- }
-
- inline void erase(iterator it)
- {
- BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
- BOOST_GEOMETRY_INDEX_ASSERT(begin() <= it && it < end(), "iterator points on the element outside the container");
- //std::copy(it + 1, end(), it);
- *it = back();
- --m_size;
- }
-
- inline void push_back(Element const& v)
- {
- BOOST_GEOMETRY_INDEX_ASSERT(m_size < Capacity, "can't further increase the size of the container");
- m_array[m_size++] = v;
- }
-
- inline bool empty() const
- {
- return m_size == 0;
- }
-
- inline size_t size() const
- {
- return m_size;
- }
-
- inline size_t capacity() const
- {
- return Capacity;
- }
-
+ typedef typename array_type::value_type value_type;
+ typedef typename array_type::size_type size_type;
+ typedef typename array_type::iterator iterator;
+ typedef typename array_type::const_iterator const_iterator;
+ typedef typename array_type::reverse_iterator reverse_iterator;
+ typedef typename array_type::const_reverse_iterator const_reverse_iterator;
+
+ inline pushable_array()
+ : m_size(0)
+ {}
+
+ inline explicit pushable_array(size_type s)
+ : m_size(s)
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big");
+ }
+
+ inline void resize(size_type s)
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big");
+ m_size = s;
+ }
+
+ inline Element & operator[](size_type i)
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(i < m_size, "index of the element outside the container");
+ return m_array[i];
+ }
+
+ inline Element const& operator[](size_type i) const
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(i < m_size, "index of the element outside the container");
+ return m_array[i];
+ }
+
+ inline Element const& front() const
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
+ return m_array.front();
+ }
+
+ inline Element & front()
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
+ return m_array.front();
+ }
+
+ inline Element const& back() const
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
+ return *(begin() + (m_size - 1));
+ }
+
+ inline Element & back()
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
+ return *(begin() + (m_size - 1));
+ }
+
+ inline iterator begin()
+ {
+ return m_array.begin();
+ }
+
+ inline iterator end()
+ {
+ return m_array.begin() + m_size;
+ }
+
+ inline const_iterator begin() const
+ {
+ return m_array.begin();
+ }
+
+ inline const_iterator end() const
+ {
+ return m_array.begin() + m_size;
+ }
+
+ inline reverse_iterator rbegin()
+ {
+ return reverse_iterator(end());
+ }
+
+ inline reverse_iterator rend()
+ {
+ return reverse_iterator(begin());
+ }
+
+ inline const_reverse_iterator rbegin() const
+ {
+ return const_reverse_iterator(end());
+ }
+
+ inline const_reverse_iterator rend() const
+ {
+ return const_reverse_iterator(begin());
+ }
+
+ inline void clear()
+ {
+ m_size = 0;
+ }
+
+ inline void erase(iterator it)
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
+ BOOST_GEOMETRY_INDEX_ASSERT(begin() <= it && it < end(), "iterator points on the element outside the container");
+ //std::copy(it + 1, end(), it);
+ *it = back();
+ --m_size;
+ }
+
+ inline void push_back(Element const& v)
+ {
+ BOOST_GEOMETRY_INDEX_ASSERT(m_size < Capacity, "can't further increase the size of the container");
+ m_array[m_size++] = v;
+ }
+
+ inline bool empty() const
+ {
+ return m_size == 0;
+ }
+
+ inline size_t size() const
+ {
+ return m_size;
+ }
+
+ inline size_t capacity() const
+ {
+ return Capacity;
+ }
+
private:
- boost::array<Element, Capacity> m_array;
- size_type m_size;
+ boost::array<Element, Capacity> m_array;
+ size_type m_size;
};
}}} // namespace boost::geometry::index
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/options.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/options.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/options.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -35,22 +35,22 @@
// TODO: awulkiew - implement those:
//if ( m_min_elems_per_node < 1 )
-// m_min_elems_per_node = 1;
+// m_min_elems_per_node = 1;
//if ( m_max_elems_per_node < 2 )
-// m_max_elems_per_node = 2;
+// m_max_elems_per_node = 2;
template <size_t MaxElements, size_t MinElements>
struct linear
{
- static const size_t max_elements = MaxElements;
- static const size_t min_elements = MinElements;
+ static const size_t max_elements = MaxElements;
+ static const size_t min_elements = MinElements;
};
template <size_t MaxElements, size_t MinElements>
struct quadratic
{
- static const size_t max_elements = MaxElements;
- static const size_t min_elements = MinElements;
+ static const size_t max_elements = MaxElements;
+ static const size_t min_elements = MinElements;
};
namespace options { namespace detail {
@@ -58,22 +58,22 @@
template <size_t MaxElements>
struct default_rstar_reinserted_elements
{
- static const size_t value = (MaxElements * 3) / 10;
+ static const size_t value = (MaxElements * 3) / 10;
};
}} // namespace options::detail
template <size_t MaxElements,
- size_t MinElements,
- size_t OverlapCostThreshold = 0,
- size_t ReinsertedElements = options::detail::default_rstar_reinserted_elements<MaxElements>::value
- >
+ size_t MinElements,
+ size_t OverlapCostThreshold = 0,
+ size_t ReinsertedElements = options::detail::default_rstar_reinserted_elements<MaxElements>::value
+ >
struct rstar
{
- static const size_t max_elements = MaxElements;
- static const size_t min_elements = MinElements;
- static const size_t overlap_cost_threshold = OverlapCostThreshold;
- static const size_t reinserted_elements = ReinsertedElements;
+ static const size_t max_elements = MaxElements;
+ static const size_t min_elements = MinElements;
+ static const size_t overlap_cost_threshold = OverlapCostThreshold;
+ static const size_t reinserted_elements = ReinsertedElements;
};
namespace options {
@@ -81,12 +81,12 @@
template <typename Parameters, typename InsertTag, typename ChooseNextNodeTag, typename SplitTag, typename RedistributeTag, typename NodeTag>
struct rtree
{
- typedef Parameters parameters_type;
- typedef InsertTag insert_tag;
- typedef ChooseNextNodeTag choose_next_node_tag;
- typedef SplitTag split_tag;
- typedef RedistributeTag redistribute_tag;
- typedef NodeTag node_tag;
+ typedef Parameters parameters_type;
+ typedef InsertTag insert_tag;
+ typedef ChooseNextNodeTag choose_next_node_tag;
+ typedef SplitTag split_tag;
+ typedef RedistributeTag redistribute_tag;
+ typedef NodeTag node_tag;
};
} // namespace options
@@ -96,46 +96,46 @@
template <typename Parameters>
struct options_type
{
- // TODO: awulkiew - use static assert
+ // TODO: awulkiew - use static assert
};
template <size_t MaxElements, size_t MinElements>
struct options_type< linear<MaxElements, MinElements> >
{
- typedef options::rtree<
- linear<MaxElements, MinElements>,
- insert_default_tag,
- choose_by_content_diff_tag,
- split_default_tag,
- linear_tag,
- node_default_static_tag
- > type;
+ typedef options::rtree<
+ linear<MaxElements, MinElements>,
+ insert_default_tag,
+ choose_by_content_diff_tag,
+ split_default_tag,
+ linear_tag,
+ node_default_static_tag
+ > type;
};
template <size_t MaxElements, size_t MinElements>
struct options_type< quadratic<MaxElements, MinElements> >
{
- typedef options::rtree<
- quadratic<MaxElements, MinElements>,
- insert_default_tag,
- choose_by_content_diff_tag,
- split_default_tag,
- quadratic_tag,
- node_default_static_tag
- > type;
+ typedef options::rtree<
+ quadratic<MaxElements, MinElements>,
+ insert_default_tag,
+ choose_by_content_diff_tag,
+ split_default_tag,
+ quadratic_tag,
+ node_default_static_tag
+ > type;
};
template <size_t MaxElements, size_t MinElements, size_t OverlapCostThreshold, size_t ReinsertedElements>
struct options_type< rstar<MaxElements, MinElements, OverlapCostThreshold, ReinsertedElements> >
{
- typedef options::rtree<
- rstar<MaxElements, MinElements, OverlapCostThreshold, ReinsertedElements>,
- insert_reinsert_tag,
- choose_by_overlap_diff_tag,
- split_default_tag,
- rstar_tag,
- node_default_static_tag
- > type;
+ typedef options::rtree<
+ rstar<MaxElements, MinElements, OverlapCostThreshold, ReinsertedElements>,
+ insert_reinsert_tag,
+ choose_by_overlap_diff_tag,
+ split_default_tag,
+ rstar_tag,
+ node_default_static_tag
+ > type;
};
}} // namespace detail::rtree
Added: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/predicates.hpp
==============================================================================
--- (empty file)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/predicates.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -0,0 +1,52 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Boost.SpatialIndex - Spatial index query predicates
+//
+// Copyright 2011 Adam Wulkiewicz.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_PREDICATES_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_PREDICATES_HPP
+
+#include <boost/geometry/extensions/index/predicates.hpp>
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail {
+
+namespace rtree {
+
+struct value_predicates_tag {};
+struct node_predicates_tag {};
+
+} // namespace rtree
+
+template <typename Geometry>
+struct predicate_check<covered_by<Geometry>, rtree::node_predicates_tag>
+{
+ template <typename Indexable>
+ static bool apply(covered_by<Geometry> const& p, Indexable const& i)
+ {
+ return geometry::intersects(i, p.geometry);
+ }
+};
+
+template <typename Geometry>
+struct predicate_check<within<Geometry>, rtree::node_predicates_tag>
+{
+ template <typename Indexable>
+ static bool apply(within<Geometry> const& p, Indexable const& i)
+ {
+ // TODO: awulkiew - possibly change to the version without border case
+ // e.g. intersects_without_border(0,0x1,1, 1,1x2,2) should give false
+ return geometry::intersects(i, p.geometry);
+ }
+};
+
+} // namespace detail
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_PREDICATES_HPP
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-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -22,11 +22,13 @@
#include <boost/geometry/extensions/index/translator/translator.hpp>
#include <boost/geometry/extensions/index/rtree/options.hpp>
-#include <boost/geometry/extensions/index/rtree/filters.hpp>
+#include <boost/geometry/extensions/index/rtree/predicates.hpp>
+//#include <boost/geometry/extensions/index/rtree/filters.hpp>
#include <boost/geometry/extensions/index/rtree/node/node.hpp>
#include <boost/geometry/extensions/index/rtree/visitors/find.hpp>
+#include <boost/geometry/extensions/index/rtree/visitors/query.hpp>
#include <boost/geometry/extensions/index/rtree/visitors/destroy.hpp>
#include <boost/geometry/extensions/index/rtree/visitors/insert.hpp>
#include <boost/geometry/extensions/index/rtree/visitors/remove.hpp>
@@ -42,19 +44,19 @@
template <
typename Value,
typename Parameters,
- typename Translator = translator::def<Value>
+ typename Translator = translator::def<Value>
>
class rtree
- : public boost::noncopyable
+ : public boost::noncopyable
{
public:
typedef Value value_type;
typedef Translator translator_type;
- typedef typename translator_type::indexable_type indexable_type;
+ typedef typename translator_type::indexable_type indexable_type;
typedef typename index::default_box_type<indexable_type>::type box_type;
- typedef typename detail::rtree::options_type<Parameters>::type options_type;
- typedef typename options_type::node_tag node_tag;
+ typedef typename detail::rtree::options_type<Parameters>::type options_type;
+ typedef typename options_type::node_tag node_tag;
typedef typename detail::rtree::node<value_type, typename options_type::parameters_type, box_type, node_tag>::type node;
typedef typename detail::rtree::internal_node<value_type, typename options_type::parameters_type, box_type, node_tag>::type internal_node;
@@ -75,8 +77,16 @@
detail::rtree::apply_visitor(del_v, *m_root);
}
- // TODO: awulkiew - change name to query?
+ template <typename Predicates, typename OutIter>
+ inline void 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);
+
+ detail::rtree::apply_visitor(find_v, *m_root);
+ }
+ // TODO: delete find method
template <typename Geometry, typename OutIter>
inline void find(Geometry const& geom, OutIter out_it) const
{
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -19,8 +19,8 @@
template <typename Value, typename Options, typename Translator, typename Box>
class are_boxes_ok
- : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, true>::type
- , index::nonassignable
+ : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, true>::type
+ , index::nonassignable
{
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;
@@ -76,27 +76,27 @@
typedef typename rtree::elements_type<leaf>::type elements_type;
elements_type const& elements = rtree::elements(n);
- // non-root node
+ // non-root node
if (!m_is_root)
{
- if ( elements.empty() )
- {
- result = false;
- return;
- }
+ if ( elements.empty() )
+ {
+ result = false;
+ return;
+ }
- Box box_exp;
- geometry::convert(m_tr(elements.front()), box_exp);
- for(typename elements_type::const_iterator it = elements.begin() + 1;
- it != elements.end() ; ++it)
- {
- geometry::expand(box_exp, m_tr(*it));
- }
-
- result = geometry::equals(box_exp, m_box);
- }
- else
- result = true;
+ Box box_exp;
+ geometry::convert(m_tr(elements.front()), box_exp);
+ for(typename elements_type::const_iterator it = elements.begin() + 1;
+ it != elements.end() ; ++it)
+ {
+ geometry::expand(box_exp, m_tr(*it));
+ }
+
+ result = geometry::equals(box_exp, m_box);
+ }
+ else
+ result = true;
}
bool result;
@@ -115,7 +115,7 @@
typedef rtree<Value, Options, Translator> rt;
detail::rtree::visitors::are_boxes_ok<
typename rt::value_type,
- typename rt::options_type,
+ typename rt::options_type,
typename rt::translator_type,
typename rt::box_type> v(tree.get_translator());
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -18,8 +18,8 @@
template <typename Value, typename Options, typename Translator, typename Box>
class are_levels_ok
- : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, true>::type
- , index::nonassignable
+ : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, true>::type
+ , index::nonassignable
{
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;
@@ -40,10 +40,10 @@
return;
}
- size_t current_level_backup = m_current_level;
- ++m_current_level;
+ size_t current_level_backup = m_current_level;
+ ++m_current_level;
- for ( typename elements_type::const_iterator it = elements.begin();
+ for ( typename elements_type::const_iterator it = elements.begin();
it != elements.end() ; ++it)
{
rtree::apply_visitor(*this, *it->second);
@@ -52,7 +52,7 @@
return;
}
- m_current_level = current_level_backup;
+ m_current_level = current_level_backup;
}
inline void operator()(leaf const& n)
@@ -60,7 +60,7 @@
typedef typename rtree::elements_type<leaf>::type elements_type;
elements_type const& elements = rtree::elements(n);
- // empty leaf in non-root node
+ // empty leaf in non-root node
if (0 < m_current_level && elements.empty())
{
result = false;
@@ -68,13 +68,13 @@
}
if ( m_leafs_level == std::numeric_limits<size_t>::max() )
- {
- m_leafs_level = m_current_level;
- }
- else if ( m_leafs_level != m_current_level )
- {
- result = false;
- }
+ {
+ m_leafs_level = m_current_level;
+ }
+ else if ( m_leafs_level != m_current_level )
+ {
+ result = false;
+ }
}
bool result;
@@ -82,7 +82,7 @@
private:
Translator const& m_tr;
size_t m_leafs_level;
- size_t m_current_level;
+ size_t m_current_level;
};
}}} // namespace detail::rtree::visitors
@@ -93,7 +93,7 @@
typedef rtree<Value, Options, Translator> rt;
detail::rtree::visitors::are_levels_ok<
typename rt::value_type,
- typename rt::options_type,
+ typename rt::options_type,
typename rt::translator_type,
typename rt::box_type> v(tree.get_translator());
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/find.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/find.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/find.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -142,8 +142,8 @@
template <typename Value, typename Options, typename Translator, typename Box, typename Geometry, typename OutIter>
struct find
- : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, true>::type
- , index::nonassignable
+ : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, true>::type
+ , index::nonassignable
{
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;
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -196,7 +196,7 @@
)
{
typedef typename rtree<Value, Options, Translator>::value_type value_type;
- typedef typename rtree<Value, Options, Translator>::options_type options_type;
+ typedef typename rtree<Value, Options, Translator>::options_type options_type;
typedef typename rtree<Value, Options, Translator>::translator_type translator_type;
typedef typename rtree<Value, Options, Translator>::box_type box_type;
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-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -40,7 +40,7 @@
{
children_type & children = rtree::elements(n);
- BOOST_GEOMETRY_INDEX_ASSERT(!children.empty(), "can't choose the next node if children are empty");
+ BOOST_GEOMETRY_INDEX_ASSERT(!children.empty(), "can't choose the next node if children are empty");
size_t children_count = children.size();
@@ -94,61 +94,61 @@
class split<Value, Options, Translator, Box, split_default_tag>
{
protected:
- 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;
+ 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;
- typedef typename Options::parameters_type parameters_type;
+ typedef typename Options::parameters_type parameters_type;
public:
- template <typename Node>
- 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)
- {
- // create additional node
- node * second_node = rtree::create_node(Node());
- Node & n2 = rtree::get<Node>(*second_node);
-
- // redistribute elements
- Box box1, box2;
- redistribute_elements<Value, Options, Translator, Box, typename Options::redistribute_tag>::
- apply(n, n2, box1, box2, tr);
-
- // check numbers of elements
- BOOST_GEOMETRY_INDEX_ASSERT(parameters_type::min_elements <= rtree::elements(n).size() &&
- rtree::elements(n).size() <= parameters_type::max_elements,
- "unexpected number of elements");
- BOOST_GEOMETRY_INDEX_ASSERT(parameters_type::min_elements <= rtree::elements(n2).size() &&
- rtree::elements(n2).size() <= parameters_type::max_elements,
- "unexpected number of elements");
-
- // node is not the root - just add the new node
- if ( parent_node != 0 )
- {
- // update old node's box
- rtree::elements(*parent_node)[current_child_index].first = box1;
- // add new node to the parent's children
- rtree::elements(*parent_node).push_back(std::make_pair(box2, second_node));
- }
- // node is the root - add level
- else
- {
- 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());
-
- 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));
-
- root_node = new_root;
- ++leafs_level;
- }
- }
+ template <typename Node>
+ 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)
+ {
+ // create additional node
+ node * second_node = rtree::create_node(Node());
+ Node & n2 = rtree::get<Node>(*second_node);
+
+ // redistribute elements
+ Box box1, box2;
+ redistribute_elements<Value, Options, Translator, Box, typename Options::redistribute_tag>::
+ apply(n, n2, box1, box2, tr);
+
+ // check numbers of elements
+ BOOST_GEOMETRY_INDEX_ASSERT(parameters_type::min_elements <= rtree::elements(n).size() &&
+ rtree::elements(n).size() <= parameters_type::max_elements,
+ "unexpected number of elements");
+ BOOST_GEOMETRY_INDEX_ASSERT(parameters_type::min_elements <= rtree::elements(n2).size() &&
+ rtree::elements(n2).size() <= parameters_type::max_elements,
+ "unexpected number of elements");
+
+ // node is not the root - just add the new node
+ if ( parent_node != 0 )
+ {
+ // update old node's box
+ rtree::elements(*parent_node)[current_child_index].first = box1;
+ // add new node to the parent's children
+ rtree::elements(*parent_node).push_back(std::make_pair(box2, second_node));
+ }
+ // node is the root - add level
+ else
+ {
+ 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());
+
+ 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));
+
+ root_node = new_root;
+ ++leafs_level;
+ }
+ }
};
// ----------------------------------------------------------------------- //
@@ -156,15 +156,15 @@
// Default insert visitor
template <typename Element, typename Value, typename Options, typename Translator, typename Box>
class insert
- : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, false>::type
- , index::nonassignable
+ : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, false>::type
+ , index::nonassignable
{
protected:
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;
- typedef typename Options::parameters_type parameters_type;
+ typedef typename Options::parameters_type parameters_type;
inline insert(node* & root,
size_t & leafs_level,
@@ -174,7 +174,7 @@
)
: m_element(element)
, m_tr(t)
- , m_relative_level(relative_level)
+ , m_relative_level(relative_level)
, m_level(leafs_level - relative_level)
, m_root_node(root)
, m_leafs_level(leafs_level)
@@ -182,8 +182,8 @@
, m_current_child_index(0)
, m_current_level(0)
{
- BOOST_GEOMETRY_INDEX_ASSERT(m_relative_level <= leafs_level, "unexpected level value");
- BOOST_GEOMETRY_INDEX_ASSERT(m_level <= m_leafs_level, "unexpected level value");
+ BOOST_GEOMETRY_INDEX_ASSERT(m_relative_level <= leafs_level, "unexpected level value");
+ BOOST_GEOMETRY_INDEX_ASSERT(m_level <= m_leafs_level, "unexpected level value");
// TODO
// assert - check if Box is correct
}
@@ -209,13 +209,13 @@
template <typename Node>
inline void post_traverse(Node &n)
{
- BOOST_GEOMETRY_INDEX_ASSERT(0 == m_parent || &n == rtree::get<Node>(rtree::elements(*m_parent)[m_current_child_index].second),
- "if node isn't the root current_child_index should be valid");
+ BOOST_GEOMETRY_INDEX_ASSERT(0 == m_parent || &n == rtree::get<Node>(rtree::elements(*m_parent)[m_current_child_index].second),
+ "if node isn't the root current_child_index should be valid");
// handle overflow
if ( parameters_type::max_elements < rtree::elements(n).size() )
{
- split(n);
+ split(n);
}
}
@@ -241,17 +241,17 @@
m_current_level = current_level_bckup;
}
- 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);
- }
+ 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);
+ }
// TODO: awulkiew - implement dispatchable split::apply to enable additional nodes creation
Element const& m_element;
Translator const& m_tr;
- const size_t m_relative_level;
+ const size_t m_relative_level;
const size_t m_level;
node* & m_root_node;
@@ -272,7 +272,7 @@
// 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>
+ : public detail::insert<Element, Value, Options, Translator, Box>
{
typedef detail::insert<Element, Value, Options, Translator, Box> base;
typedef typename base::node node;
@@ -290,7 +290,7 @@
inline void operator()(internal_node & n)
{
- BOOST_GEOMETRY_INDEX_ASSERT(base::m_current_level < base::m_leafs_level, "unexpected level");
+ BOOST_GEOMETRY_INDEX_ASSERT(base::m_current_level < base::m_leafs_level, "unexpected level");
if ( base::m_current_level < base::m_level )
{
@@ -299,7 +299,7 @@
}
else
{
- BOOST_GEOMETRY_INDEX_ASSERT(base::m_level == base::m_current_level, "unexpected level");
+ BOOST_GEOMETRY_INDEX_ASSERT(base::m_level == base::m_current_level, "unexpected level");
// push new child node
rtree::elements(n).push_back(base::m_element);
@@ -317,7 +317,7 @@
// 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>
+ : public detail::insert<Value, Value, Options, Translator, Box>
{
typedef detail::insert<Value, Value, Options, Translator, Box> base;
typedef typename base::node node;
@@ -335,8 +335,8 @@
inline void operator()(internal_node & n)
{
- BOOST_GEOMETRY_INDEX_ASSERT(base::m_current_level < base::m_leafs_level, "unexpected level");
- BOOST_GEOMETRY_INDEX_ASSERT(base::m_current_level < base::m_level, "unexpected level");
+ BOOST_GEOMETRY_INDEX_ASSERT(base::m_current_level < base::m_leafs_level, "unexpected level");
+ BOOST_GEOMETRY_INDEX_ASSERT(base::m_current_level < base::m_level, "unexpected level");
// next traversing step
base::traverse(*this, n);
@@ -346,8 +346,8 @@
inline void operator()(leaf & n)
{
- BOOST_GEOMETRY_INDEX_ASSERT(base::m_current_level == base::m_leafs_level, "unexpected level");
- BOOST_GEOMETRY_INDEX_ASSERT(base::m_level == base::m_current_level || base::m_level == std::numeric_limits<size_t>::max(), "unexpected level");
+ BOOST_GEOMETRY_INDEX_ASSERT(base::m_current_level == base::m_leafs_level, "unexpected level");
+ BOOST_GEOMETRY_INDEX_ASSERT(base::m_level == base::m_current_level || base::m_level == std::numeric_limits<size_t>::max(), "unexpected level");
rtree::elements(n).push_back(base::m_element);
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/print.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/print.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/print.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -182,7 +182,7 @@
std::ostream & operator<<(std::ostream & os, rtree<Value, Options, Translator> const& tree)
{
typedef typename rtree<Value, Options, Translator>::value_type value_type;
- typedef typename rtree<Value, Options, Translator>::options_type options_type;
+ typedef typename rtree<Value, Options, Translator>::options_type options_type;
typedef typename rtree<Value, Options, Translator>::translator_type translator_type;
typedef typename rtree<Value, Options, Translator>::box_type box_type;
detail::rtree::visitors::print<value_type, options_type, translator_type, box_type> print_v(os, tree.get_translator());
Added: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/query.hpp
==============================================================================
--- (empty file)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/visitors/query.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -0,0 +1,70 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Boost.Index - R-tree spatial query
+//
+// Copyright 2011 Adam Wulkiewicz.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_VISITORS_QUERY_HPP
+#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_VISITORS_QUERY_HPP
+
+#include <boost/geometry/extensions/index/rtree/node/node.hpp>
+
+namespace boost { namespace geometry { namespace index {
+
+namespace detail { namespace rtree { namespace visitors {
+
+template <typename Value, typename Options, typename Translator, typename Box, typename Predicates, typename OutIter>
+struct query
+ : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, true>::type
+ , index::nonassignable
+{
+ 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 query(Translator const& t, Predicates const& p, OutIter out_it)
+ : tr(t), pred(p), out_iter(out_it)
+ {}
+
+ inline void operator()(internal_node const& n)
+ {
+ typedef typename rtree::elements_type<internal_node>::type elements_type;
+ elements_type const& elements = rtree::elements(n);
+
+ for (typename elements_type::const_iterator it = elements.begin();
+ it != elements.end(); ++it)
+ {
+ if ( index::predicates_check<rtree::node_predicates_tag>(pred, it->first) )
+ rtree::apply_visitor(*this, *it->second);
+ }
+ }
+
+ inline void operator()(leaf const& n)
+ {
+ typedef typename rtree::elements_type<leaf>::type elements_type;
+ elements_type const& elements = rtree::elements(n);
+
+ for (typename elements_type::const_iterator it = elements.begin();
+ it != elements.end(); ++it)
+ {
+ if ( index::predicates_check<rtree::value_predicates_tag>(pred, tr(*it)) )
+ {
+ out_iter = *it;
+ ++out_iter;
+ }
+ }
+ }
+
+ Translator const& tr;
+ Predicates const& pred;
+ OutIter out_iter;
+};
+
+}}} // namespace detail::rtree::visitors
+
+}}} // namespace boost::geometry::index
+
+#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_VISITORS_QUERY_HPP
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-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -23,14 +23,14 @@
// Default remove algorithm
template <typename Value, typename Options, typename Translator, typename Box>
class remove
- : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, false>::type
- , index::nonassignable
+ : public rtree::visitor<Value, typename Options::parameters_type, Box, typename Options::node_tag, false>::type
+ , index::nonassignable
{
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;
- typedef typename Options::parameters_type parameters_type;
+ typedef typename Options::parameters_type parameters_type;
public:
inline remove(node* & root,
@@ -104,8 +104,8 @@
// n is root node
else
{
- BOOST_GEOMETRY_INDEX_ASSERT(&n == rtree::get<internal_node>(m_root_node), "node must be the root");
- BOOST_GEOMETRY_INDEX_ASSERT(m_is_value_removed, "value not found");
+ BOOST_GEOMETRY_INDEX_ASSERT(&n == rtree::get<internal_node>(m_root_node), "node must be the root");
+ BOOST_GEOMETRY_INDEX_ASSERT(m_is_value_removed, "value not found");
// reinsert elements from removed nodes
// begin with levels closer to the root
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/translator/getter.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/translator/getter.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/translator/getter.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -17,7 +17,7 @@
{
typedef Indexable indexable_type;
- indexable_type const& operator()(Value const& v) const
+ indexable_type const& operator()(Value const& v) const
{
return (v.*Getter)();
}
@@ -25,7 +25,7 @@
bool equals(Value const& v1, Value const& v2) const
{
//return geometry::equals(operator()(v1), operator()(v2));
- return v1 == v2;
+ return v1 == v2;
}
};
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/translator/helpers.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/translator/helpers.hpp (original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/translator/helpers.hpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -173,15 +173,15 @@
static bool apply(std::pair<First, Second> const& p1, std::pair<First, Second> const& p2)
{
return
- dispatch::equals<
- First,
- typename traits::tag<First>::type
- >::apply(p1.first, p2.first)
- &&
dispatch::equals<
- Second,
- typename traits::tag<Second>::type
- >::apply(p1.second, p2.second);
+ First,
+ typename traits::tag<First>::type
+ >::apply(p1.first, p2.first)
+ &&
+ dispatch::equals<
+ Second,
+ typename traits::tag<Second>::type
+ >::apply(p1.second, p2.second);
}
};
Modified: sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp
==============================================================================
--- sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp (original)
+++ sandbox-branches/geometry/index/tests/additional_sizes_and_times.cpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -26,16 +26,16 @@
namespace bg = boost::geometry;
namespace bgi = bg::index;
- //typedef bg::model::d2::point_xy<double> P;
+ //typedef bg::model::d2::point_xy<double> P;
typedef bg::model::point<double, 2, bg::cs::cartesian> P;
typedef bg::model::box<P> B;
- //typedef bgi::rtree<std::pair<B, size_t>, bgi::linear<32, 8> > RT;
+ typedef bgi::rtree<std::pair<B, size_t>, bgi::linear<32, 8> > RT;
//typedef bgi::rtree<std::pair<B, size_t>, bgi::quadratic<32, 8> > RT;
- typedef bgi::rtree<std::pair<B, size_t>, bgi::rstar<32, 8> > RT;
- /*typedef bgi::rtree<
- std::pair<B, size_t>,
- bgi::options::rtree<bgi::rstar<32, 8, 0, 10>, bgi::reinsert_tag, bgi::choose_by_area_diff_tag, bgi::rstar_tag, bgi::default_tag>
- > RT;*/
+ //typedef bgi::rtree<std::pair<B, size_t>, bgi::rstar<32, 8> > RT;
+ /*typedef bgi::rtree<
+ std::pair<B, size_t>,
+ bgi::options::rtree<bgi::rstar<32, 8, 0, 10>, bgi::reinsert_tag, bgi::choose_by_area_diff_tag, bgi::rstar_tag, bgi::default_tag>
+ > RT;*/
// load config file
std::ifstream file_cfg("config.txt");
@@ -89,13 +89,13 @@
else
{
boost::mt19937 rng;
- //rng.seed(static_cast<unsigned int>(std::time(0)));
+ //rng.seed(static_cast<unsigned int>(std::time(0)));
- float max_val = static_cast<float>(values_count / 2);
+ float max_val = static_cast<float>(values_count / 2);
boost::uniform_real<float> range(-max_val, max_val);
- boost::variate_generator<boost::mt19937&, boost::uniform_real<float> > rnd(rng, range);
-
+ boost::variate_generator<boost::mt19937&, boost::uniform_real<float> > rnd(rng, range);
+
std::cout << "randomizing data\n";
for ( size_t i = 0 ; i < values_count ; ++i )
{
@@ -127,14 +127,14 @@
std::cout << "BOXES OK\n";
else
std::cout << "WRONG BOXES\n";
- if ( bgi::are_levels_ok(t) )
- std::cout << "LEVELS OK\n";
- else
- std::cout << "WRONG LEVELS\n";
+ if ( bgi::are_levels_ok(t) )
+ std::cout << "LEVELS OK\n";
+ else
+ std::cout << "WRONG LEVELS\n";
// searching test
{
- std::cout << "searching time test...\n";
+ std::cout << "find(B) searching time test...\n";
tim.restart();
size_t temp = 0;
for (size_t i = 0 ; i < queries_count ; ++i )
@@ -149,6 +149,40 @@
std::cout << "found: " << temp << "\n";
}
+ // searching test
+ {
+ std::cout << "query(intersects(B)) searching time test...\n";
+ tim.restart();
+ size_t temp = 0;
+ for (size_t i = 0 ; i < queries_count ; ++i )
+ {
+ float x = coords[i].first;
+ float y = coords[i].second;
+ std::deque< std::pair<B, size_t> > result;
+ t.query(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10))), std::back_inserter(result));
+ temp += result.size();
+ }
+ std::cout << "time: " << tim.elapsed() << "s\n";
+ std::cout << "found: " << temp << "\n";
+ }
+
+ // searching test
+ {
+ std::cout << "query(B) searching time test...\n";
+ tim.restart();
+ size_t temp = 0;
+ for (size_t i = 0 ; i < queries_count ; ++i )
+ {
+ float x = coords[i].first;
+ float y = coords[i].second;
+ std::deque< std::pair<B, size_t> > result;
+ t.query(B(P(x - 10, y - 10), P(x + 10, y + 10)), std::back_inserter(result));
+ temp += result.size();
+ }
+ std::cout << "time: " << tim.elapsed() << "s\n";
+ std::cout << "found: " << temp << "\n";
+ }
+
// elements removing test
{
std::cout << "removing time test...\n";
@@ -164,15 +198,15 @@
std::cout << "time: " << tim.elapsed() << "s\n";
}
- // check
- if ( bgi::are_boxes_ok(t) )
- std::cout << "BOXES OK\n";
- else
- std::cout << "WRONG BOXES\n";
- if ( bgi::are_levels_ok(t) )
- std::cout << "LEVELS OK\n";
- else
- std::cout << "WRONG LEVELS\n";
+ // check
+ if ( bgi::are_boxes_ok(t) )
+ std::cout << "BOXES OK\n";
+ else
+ std::cout << "WRONG BOXES\n";
+ if ( bgi::are_levels_ok(t) )
+ std::cout << "LEVELS OK\n";
+ else
+ std::cout << "WRONG LEVELS\n";
// searching test
{
@@ -184,7 +218,7 @@
float x = coords[i].first;
float y = coords[i].second;
std::deque< std::pair<B, size_t> > result;
- t.find(B(P(x - 10, y - 10), P(x + 10, y + 10)), std::back_inserter(result));
+ t.query(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10))), std::back_inserter(result));
temp += result.size();
}
std::cout << "time: " << tim.elapsed() << "s\n";
@@ -206,15 +240,15 @@
std::cout << "time: " << tim.elapsed() << "s\n";
}
- // check
- if ( bgi::are_boxes_ok(t) )
- std::cout << "BOXES OK\n";
- else
- std::cout << "WRONG BOXES\n";
- if ( bgi::are_levels_ok(t) )
- std::cout << "LEVELS OK\n";
- else
- std::cout << "WRONG LEVELS\n";
+ // check
+ if ( bgi::are_boxes_ok(t) )
+ std::cout << "BOXES OK\n";
+ else
+ std::cout << "WRONG BOXES\n";
+ if ( bgi::are_levels_ok(t) )
+ std::cout << "LEVELS OK\n";
+ else
+ std::cout << "WRONG LEVELS\n";
// searching test
{
@@ -226,7 +260,7 @@
float x = coords[i].first;
float y = coords[i].second;
std::deque< std::pair<B, size_t> > result;
- t.find(B(P(x - 10, y - 10), P(x + 10, y + 10)), std::back_inserter(result));
+ t.query(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10))), std::back_inserter(result));
temp += result.size();
}
std::cout << "time: " << tim.elapsed() << "s\n";
Modified: sandbox-branches/geometry/index/tests/main.cpp
==============================================================================
--- sandbox-branches/geometry/index/tests/main.cpp (original)
+++ sandbox-branches/geometry/index/tests/main.cpp 2011-08-26 20:05:54 EDT (Fri, 26 Aug 2011)
@@ -18,7 +18,7 @@
tests_translators_hpp();
tests_rtree_native_hpp<boost::geometry::index::linear<4, 2> >();
tests_rtree_native_hpp<boost::geometry::index::quadratic<4, 2> >();
- tests_rtree_native_hpp<boost::geometry::index::rstar<4, 2> >();
+ tests_rtree_native_hpp<boost::geometry::index::rstar<4, 2> >();
tests_rtree_filters_hpp();
/*
{
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