Boost logo

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