diff --git a/include/boost/geometry/iterators/box_iterator.hpp b/include/boost/geometry/iterators/box_iterator.hpp index d3857f170..f177da610 100644 --- a/include/boost/geometry/iterators/box_iterator.hpp +++ b/include/boost/geometry/iterators/box_iterator.hpp @@ -32,7 +32,7 @@ struct box_iterator < box_iterator, typename point_type::type const, - boost::bidirectional_traversal_tag + boost::random_access_traversal_tag > { explicit inline box_iterator(Box const& box) @@ -80,6 +80,11 @@ private: m_index--; } + inline difference_type distance_to(box_iterator const& other) const + { + return other.m_index - this->m_index; + } + inline void init(Box const& box) { // asb -> lower_left, lower_right, upper_left, upper_right diff --git a/include/boost/geometry/iterators/segment_range_iterator.hpp b/include/boost/geometry/iterators/segment_range_iterator.hpp index e344ac493..396f5042c 100644 --- a/include/boost/geometry/iterators/segment_range_iterator.hpp +++ b/include/boost/geometry/iterators/segment_range_iterator.hpp @@ -32,7 +32,7 @@ struct segment_range_iterator < segment_range_iterator, typename point_type::type const, - boost::bidirectional_traversal_tag + boost::random_access_traversal_tag > { // Default constructor is required to check concept of Range @@ -90,13 +90,18 @@ private: m_index--; } + inline difference_type distance_to(segment_range_iterator const& other) const + { + return other.m_index - this->m_index; + } + inline void init(Segment const& segment) { assign_point_from_index<0>(segment, m_points[0]); assign_point_from_index<1>(segment, m_points[1]); } - // We HAVE TO copy the points, because a segment does not need + // We HAVE TO copy the points, because a segment does not need // to consist of two points, // and we are expected to return a point here point_type m_points[2]; diff --git a/include/boost/geometry/ranges/box_range.hpp b/include/boost/geometry/ranges/box_range.hpp index 7c3ffe365..fc81c0495 100644 --- a/include/boost/geometry/ranges/box_range.hpp +++ b/include/boost/geometry/ranges/box_range.hpp @@ -43,7 +43,7 @@ private : }; -// All box ranges can be handled as linestrings +// All box ranges can be handled as rings namespace traits { template diff --git a/test/ranges/box_range.cpp b/test/ranges/box_range.cpp index 07a8d04f8..59d47e803 100644 --- a/test/ranges/box_range.cpp +++ b/test/ranges/box_range.cpp @@ -46,6 +46,12 @@ void test_geometry(std::string const& wkt, std::string const& expected) it--; // Not verified further, same as segment } + + { + // Check random access behaviour + int const n = boost::size(range); + BOOST_CHECK_EQUAL(n, 5); + } } diff --git a/test/ranges/segment_range.cpp b/test/ranges/segment_range.cpp index deb4ccef4..7285b702f 100644 --- a/test/ranges/segment_range.cpp +++ b/test/ranges/segment_range.cpp @@ -52,6 +52,12 @@ void test_geometry(std::string const& wkt, std::string const& expected) out << " " << boost::geometry::get<0>(*it2) << boost::geometry::get<1>(*it2); BOOST_CHECK_EQUAL(out.str(), expected); } + + { + // Check random access behaviour + int const n = boost::size(range); + BOOST_CHECK_EQUAL(n, 2); + } }