From 1d7a38fbee98df430f60595bdd9be7ea802cc0a2 Mon Sep 17 00:00:00 2001 From: Phillip Palk Date: Thu, 7 Jun 2018 10:07:48 +1000 Subject: [PATCH] [iterators] fix return of a reference to a temporary object when using closing_iterator and ever_circling_iterator with transformed ranges. --- include/boost/geometry/iterators/closing_iterator.hpp | 7 +++++-- .../boost/geometry/iterators/ever_circling_iterator.hpp | 9 ++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/include/boost/geometry/iterators/closing_iterator.hpp b/include/boost/geometry/iterators/closing_iterator.hpp index a0ec6a5c9..f77c9342b 100644 --- a/include/boost/geometry/iterators/closing_iterator.hpp +++ b/include/boost/geometry/iterators/closing_iterator.hpp @@ -38,9 +38,12 @@ struct closing_iterator < closing_iterator, typename boost::range_value::type const, - boost::random_access_traversal_tag + boost::random_access_traversal_tag, + typename boost::range_reference::type const, + typename boost::range_difference::type > { + typedef typename boost::range_reference::type const reference_type; typedef typename boost::range_difference::type difference_type; /// Constructor including the range it is based on @@ -71,7 +74,7 @@ struct closing_iterator private: friend class boost::iterator_core_access; - inline typename boost::range_value::type const& dereference() const + inline reference_type dereference() const { return *m_iterator; } diff --git a/include/boost/geometry/iterators/ever_circling_iterator.hpp b/include/boost/geometry/iterators/ever_circling_iterator.hpp index 569688aac..f164250fd 100644 --- a/include/boost/geometry/iterators/ever_circling_iterator.hpp +++ b/include/boost/geometry/iterators/ever_circling_iterator.hpp @@ -100,7 +100,9 @@ struct ever_circling_range_iterator < ever_circling_range_iterator, typename boost::range_value::type const, - boost::random_access_traversal_tag + boost::random_access_traversal_tag, + typename boost::range_reference::type const, + typename boost::range_difference::type > { /// Constructor including the range it is based on @@ -118,12 +120,13 @@ struct ever_circling_range_iterator , m_index(0) {} - typedef std::ptrdiff_t difference_type; + typedef typename boost::range_reference::type const reference_type; + typedef typename boost::range_difference::type difference_type; private: friend class boost::iterator_core_access; - inline typename boost::range_value::type const& dereference() const + inline reference_type dereference() const { return *m_iterator; }