$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r83964 - in trunk/boost/geometry/index: . detail detail/rtree/visitors
From: adam.wulkiewicz_at_[hidden]
Date: 2013-04-19 08:57:13
Author: awulkiew
Date: 2013-04-19 08:57:12 EDT (Fri, 19 Apr 2013)
New Revision: 83964
URL: http://svn.boost.org/trac/boost/changeset/83964
Log:
geometry.index.rtree: Removed distance predicates member unnecessarily stored in nearest visitor.
Text files modified: 
   trunk/boost/geometry/index/detail/distance_predicates.hpp          |    16 +++++++++                               
   trunk/boost/geometry/index/detail/rtree/visitors/nearest_query.hpp |    34 +++++++++++--------                     
   trunk/boost/geometry/index/rtree.hpp                               |    67 ++++++++++++++++----------------------- 
   3 files changed, 63 insertions(+), 54 deletions(-)
Modified: trunk/boost/geometry/index/detail/distance_predicates.hpp
==============================================================================
--- trunk/boost/geometry/index/detail/distance_predicates.hpp	(original)
+++ trunk/boost/geometry/index/detail/distance_predicates.hpp	2013-04-19 08:57:12 EDT (Fri, 19 Apr 2013)
@@ -29,6 +29,22 @@
 namespace boost { namespace geometry { namespace index { namespace detail {
 
 // ------------------------------------------------------------------ //
+// distance_predicates_type
+// ------------------------------------------------------------------ //
+
+template <typename NearestPredicate>
+struct distance_predicates_type
+{
+    typedef void type;
+};
+
+template <typename DistancePredicates>
+struct distance_predicates_type< detail::nearest<DistancePredicates> >
+{
+    typedef DistancePredicates type;
+};
+
+// ------------------------------------------------------------------ //
 // relations
 // ------------------------------------------------------------------ //
 
Modified: trunk/boost/geometry/index/detail/rtree/visitors/nearest_query.hpp
==============================================================================
--- trunk/boost/geometry/index/detail/rtree/visitors/nearest_query.hpp	(original)
+++ trunk/boost/geometry/index/detail/rtree/visitors/nearest_query.hpp	2013-04-19 08:57:12 EDT (Fri, 19 Apr 2013)
@@ -148,8 +148,8 @@
     typename Translator,
     typename Box,
     typename Allocators,
-    typename DistancesPredicates,
     typename Predicates,
+    unsigned NearestPredicateIndex,
     typename Result
 >
 class nearest_query
@@ -162,27 +162,35 @@
     typedef typename rtree::internal_node<Value, parameters_type, Box, Allocators, typename Options::node_tag>::type internal_node;
     typedef typename rtree::leaf<Value, parameters_type, Box, Allocators, typename Options::node_tag>::type leaf;
 
-    typedef index::detail::distances_calc<DistancesPredicates, Box, index::detail::bounds_tag> node_distances_calc;
+    typedef index::detail::predicates_element<NearestPredicateIndex, Predicates> nearest_predicate_access;
+    typedef typename index::detail::distance_predicates_type<typename nearest_predicate_access::type>::type distance_predicates_type;
+
+    typedef index::detail::distances_calc<distance_predicates_type, Box, index::detail::bounds_tag> node_distances_calc;
     typedef typename node_distances_calc::result_type node_distances_type;
-    typedef index::detail::distances_predicates_check<DistancesPredicates, Box, index::detail::bounds_tag> node_distances_predicates_check;
+    typedef index::detail::distances_predicates_check<distance_predicates_type, Box, index::detail::bounds_tag> node_distances_predicates_check;
 
     typedef index::detail::distances_calc<
-        DistancesPredicates,
+        distance_predicates_type,
         typename indexable_type<Translator>::type,
         index::detail::value_tag
     > value_distances_calc;
     typedef typename value_distances_calc::result_type value_distances_type;
     typedef index::detail::distances_predicates_check<
-        DistancesPredicates,
+        distance_predicates_type,
         typename indexable_type<Translator>::type,
         index::detail::value_tag
     > value_distances_predicates_check;
 
+    inline distance_predicates_type const& dist_pred() const
+    {
+        return nearest_predicate_access::get(m_pred).distance_predicates;
+    }
+
     static const unsigned predicates_len = index::detail::predicates_length<Predicates>::value;
 
-    inline nearest_query(parameters_type const& parameters, Translator const& translator, DistancesPredicates const& dist_pred, Predicates const& pred, Result & r)
+    inline nearest_query(parameters_type const& parameters, Translator const& translator, Predicates const& pred, Result & r)
         : m_parameters(parameters), m_translator(translator)
-        , m_dist_pred(dist_pred), m_pred(pred)
+        , m_pred(pred)
         , m_result(r)
     {}
 
@@ -210,7 +218,7 @@
             if ( index::detail::predicates_check<index::detail::bounds_tag, 0, predicates_len>(m_pred, 0, it->first) )
             {
                 // calculate node's distance(s) for distance predicate
-                node_distances_type node_dist_data = node_distances_calc::apply(m_dist_pred, it->first);
+                node_distances_type node_dist_data = node_distances_calc::apply(dist_pred(), it->first);
 
                 // TODO: awulkiew - consider at first calculating near distance only,
                 //                  comparing it with m_result.comparable_distance if it's valid,
@@ -224,7 +232,7 @@
                 }
 
                 // if current node distance(s) meets distance predicate
-                if ( node_distances_predicates_check::apply(m_dist_pred, node_dist_data) )
+                if ( node_distances_predicates_check::apply(dist_pred(), node_dist_data) )
                 {
                     // add current node's data into the list
                     active_branch_list.push_back( std::make_pair(node_dist_data, it->second) );
@@ -265,16 +273,16 @@
             if ( index::detail::predicates_check<index::detail::value_tag, 0, predicates_len>(m_pred, *it, m_translator(*it)) )
             {
                 // calculate values distance for distance predicate
-                value_distances_type distances = value_distances_calc::apply(m_dist_pred, m_translator(*it));
+                value_distances_type distances = value_distances_calc::apply(dist_pred(), m_translator(*it));
 
                 // TODO: awulkiew - consider at first calculating point relation distance only,
                 //                  comparing it with m_result.comparable_distance if it's valid,
                 //                  after that calculate the rest of distances and check predicates
 
                 // if distance meets distance predicate
-                if ( value_distances_predicates_check::apply(m_dist_pred, distances) )
+                if ( value_distances_predicates_check::apply(dist_pred(), distances) )
                 {
-                    typedef typename index::detail::point_relation<DistancesPredicates>::type point_relation_type;
+                    typedef typename index::detail::point_relation<distance_predicates_type>::type point_relation_type;
                     typedef typename index::detail::relation<point_relation_type>::tag point_relation_tag;
 
                     // store value
@@ -325,9 +333,7 @@
     parameters_type const& m_parameters;
     Translator const& m_translator;
 
-    DistancesPredicates m_dist_pred;
     Predicates m_pred;
-
     Result & m_result;
 };
 
Modified: trunk/boost/geometry/index/rtree.hpp
==============================================================================
--- trunk/boost/geometry/index/rtree.hpp	(original)
+++ trunk/boost/geometry/index/rtree.hpp	2013-04-19 08:57:12 EDT (Fri, 19 Apr 2013)
@@ -1132,10 +1132,34 @@
     size_type query_dispatch(Predicates const& predicates, OutIter out_it, boost::mpl::bool_<true> const& /*is_nearest*/) const
     {
         static const unsigned nearest_index = detail::predicates_find_nearest<Predicates>::value;
-        typedef detail::predicates_element<nearest_index, Predicates> element_access;
-        typename element_access::type const& nearest_pred = element_access::get(predicates);
+        typedef index::detail::predicates_element<nearest_index, Predicates> nearest_predicate_access;
+        typedef typename index::detail::distance_predicates_type<typename nearest_predicate_access::type >::type distance_predicates_type;
+        typedef typename detail::point_relation<distance_predicates_type>::type point_relation;
+        typedef typename detail::relation<point_relation>::value_type point_type;
+
+        typedef detail::rtree::visitors::nearest_query_result_k<
+            value_type,
+            translator_type,
+            point_type,
+            OutIter
+        > result_type;
+
+        result_type result(nearest_predicate_access::get(predicates).count, out_it);
+
+        detail::rtree::visitors::nearest_query<
+            value_type,
+            options_type,
+            translator_type,
+            box_type,
+            allocators_type,
+            Predicates,
+            nearest_index,
+            result_type
+        > nearest_v(m_members.parameters(), m_members.translator(), predicates, result);
 
-        return raw_nearest_k(nearest_pred.distance_predicates, nearest_pred.count, predicates, out_it);
+        detail::rtree::apply_visitor(nearest_v, *m_members.root);
+
+        return result.finish();
     }
 
 #ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
@@ -1189,43 +1213,6 @@
 
 #endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
 
-    /*!
-    \brief Find k values meeting distances and spatial predicates.
-
-    \par Exception-safety
-    strong
-    */
-    template <typename DistancesPredicates, typename Predicates, typename OutIter>
-    inline size_type raw_nearest_k(DistancesPredicates const& dpred, size_t k, Predicates const& pred, OutIter out_it) const
-    {
-        typedef typename detail::point_relation<DistancesPredicates>::type point_relation;
-        typedef typename detail::relation<point_relation>::value_type point_type;
-
-        typedef detail::rtree::visitors::nearest_query_result_k<
-            value_type,
-            translator_type,
-            point_type,
-            OutIter
-        > result_type;
-
-        result_type result(k, out_it);
-
-        detail::rtree::visitors::nearest_query<
-            value_type,
-            options_type,
-            translator_type,
-            box_type,
-            allocators_type,
-            DistancesPredicates,
-            Predicates,
-            result_type
-        > nearest_v(m_members.parameters(), m_members.translator(), dpred, pred, result);
-
-        detail::rtree::apply_visitor(nearest_v, *m_members.root);
-
-        return result.finish();
-    }
-
     struct members_holder
         : public translator_type
         , public Parameters