From fa55322ddc5b0449f02e7f23889ec959e7931c84 Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Sun, 6 Jan 2013 00:58:54 +0000 Subject: [PATCH] Fixed error in nearest_query() - for Iterator which is not an inserter - operator++ call added. [SVN r82371] --- .../geometry/extensions/index/rtree/rtree.hpp | 9 ++++---- .../index/rtree/visitors/nearest_query.hpp | 22 +++++++++---------- test/rtree/test_rtree.hpp | 6 +++++ tests/additional_speed.cpp | 18 ++++++++++++++- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/include/boost/geometry/extensions/index/rtree/rtree.hpp b/include/boost/geometry/extensions/index/rtree/rtree.hpp index b39c1fa63..42d93477c 100644 --- a/include/boost/geometry/extensions/index/rtree/rtree.hpp +++ b/include/boost/geometry/extensions/index/rtree/rtree.hpp @@ -938,7 +938,7 @@ private: detail::rtree::apply_visitor(nearest_v, *m_root); - return result.get(v); + return result.finish(); } /*! @@ -958,10 +958,11 @@ private: typedef detail::rtree::visitors::nearest_query_result_k< value_type, translator_type, - point_type + point_type, + OutIter > result_type; - result_type result(k); + result_type result(k, out_it); detail::rtree::visitors::nearest_query< value_type, @@ -976,7 +977,7 @@ private: detail::rtree::apply_visitor(nearest_v, *m_root); - return result.get(out_it); + return result.finish(); } translator_type m_translator; diff --git a/include/boost/geometry/extensions/index/rtree/visitors/nearest_query.hpp b/include/boost/geometry/extensions/index/rtree/visitors/nearest_query.hpp index b48aac667..e269fa1ce 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/nearest_query.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/nearest_query.hpp @@ -33,7 +33,7 @@ public: typename translator::indexable_type::type >::type distance_type; - inline nearest_query_result_one(Value const& value) + inline nearest_query_result_one(Value & value) : m_value(value) , m_comp_dist((std::numeric_limits::max)()) {} @@ -57,18 +57,17 @@ public: return m_comp_dist; } - inline size_t get(Value & v) + inline size_t finish() { - v = m_value; return is_comparable_distance_valid() ? 1 : 0; } private: - Value m_value; + Value & m_value; distance_type m_comp_dist; }; -template +template struct nearest_query_result_k { public: @@ -77,8 +76,8 @@ public: typename translator::indexable_type::type >::type distance_type; - inline explicit nearest_query_result_k(size_t k) - : m_count(k) + inline explicit nearest_query_result_k(size_t k, OutIt out_it) + : m_count(k), m_out_it(out_it) { BOOST_GEOMETRY_INDEX_ASSERT(0 < m_count, "Number of neighbors should be greater than 0"); @@ -122,12 +121,11 @@ public: : m_neighbors.front().first; } - template - inline size_t get(OutIter & out_it) + inline size_t finish() { typedef typename std::vector< std::pair >::const_iterator neighbors_iterator; - for ( neighbors_iterator it = m_neighbors.begin() ; it != m_neighbors.end() ; ++it ) - *out_it = it->second; + for ( neighbors_iterator it = m_neighbors.begin() ; it != m_neighbors.end() ; ++it, ++m_out_it ) + *m_out_it = it->second; return m_neighbors.size(); } @@ -141,6 +139,8 @@ private: } size_t m_count; + OutIt m_out_it; + std::vector< std::pair > m_neighbors; distance_type m_biggest_comp_dist; }; diff --git a/test/rtree/test_rtree.hpp b/test/rtree/test_rtree.hpp index 0593c76c1..12a18be8e 100644 --- a/test/rtree/test_rtree.hpp +++ b/test/rtree/test_rtree.hpp @@ -857,6 +857,12 @@ void test_nearest_query_k(Rtree const& rtree, std::vector const& input, P } test_exactly_the_same_outputs(rtree, output, rtree | bgi::adaptors::nearest_queried(pt, k)); + + std::vector output2(k, generate_value_default::apply()); + size_t found_count = rtree.nearest_query(pt, k, output2.begin()); + output2.resize(found_count, generate_value_default::apply()); + + test_exactly_the_same_outputs(rtree, output, output2); } // rtree nearest not found diff --git a/tests/additional_speed.cpp b/tests/additional_speed.cpp index 623a7b57e..5ed9f558d 100644 --- a/tests/additional_speed.cpp +++ b/tests/additional_speed.cpp @@ -94,6 +94,7 @@ int main() std::vector result; result.reserve(100); + B result_one; // query test { @@ -117,7 +118,7 @@ int main() // searching test { - std::cout << "nearest 5 searching time test... (" + std::cout << "nearest 10 searching time test... (" << queries_count / 10 << ")\n"; tim.restart(); size_t temp = 0; @@ -131,6 +132,21 @@ int main() std::cout << "time: " << tim.elapsed() << "s\n"; std::cout << "found: " << temp << "\n"; } + + { + std::cout << "nearest 1 searching time test... (" + << queries_count / 10 << ")\n"; + tim.restart(); + size_t temp = 0; + for (size_t i = 0 ; i < queries_count / 10 ; ++i ) + { + float x = coords[i].first + 100; + float y = coords[i].second + 100; + temp += t.nearest_query(P(x, y), result_one); + } + std::cout << "time: " << tim.elapsed() << "s\n"; + std::cout << "found: " << temp << "\n"; + } } return 0;