diff options
Diffstat (limited to 'boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp')
-rw-r--r-- | boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp | 52 |
1 files changed, 22 insertions, 30 deletions
diff --git a/boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp b/boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp index d79fda84d9..e65b12b459 100644 --- a/boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp +++ b/boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp @@ -100,23 +100,36 @@ class range_segment_iterator Reference > { + static inline bool has_less_than_two_elements(Range const& r) + { + return boost::size(r) < ((closure<Range>::value == open) ? 1u : 2u); + } + public: typedef typename range_iterator_type<Range>::type iterator_type; // default constructor range_segment_iterator() - : m_it() + : m_it(), m_has_less_than_two_elements(false) {} // for begin range_segment_iterator(Range& r) : m_it(range_iterator_begin<Range>::apply(r)) + , m_has_less_than_two_elements(has_less_than_two_elements(r)) {} // for end range_segment_iterator(Range& r, bool) - : m_it(--range_iterator_end<Range>::apply(r)) - {} + : m_it(range_iterator_end<Range>::apply(r)) + , m_has_less_than_two_elements(has_less_than_two_elements(r)) + { + if (! m_has_less_than_two_elements) + { + // the range consists of at least two items + --m_it; + } + } template < @@ -143,33 +156,6 @@ public: BOOST_MPL_ASSERT_MSG((are_conv), NOT_CONVERTIBLE, (types<OtherRange>)); } - template - < - typename OtherRange, - typename OtherValue, - typename OtherReference - > - range_segment_iterator operator=(range_segment_iterator - < - OtherRange, - OtherValue, - OtherReference - > const& other) - { - typedef typename range_segment_iterator - < - OtherRange, OtherValue, OtherReference - >::iterator_type other_iterator_type; - - static const bool are_conv - = boost::is_convertible<other_iterator_type, iterator_type>::value; - - BOOST_MPL_ASSERT_MSG((are_conv), NOT_CONVERTIBLE, (types<OtherRange>)); - - m_it = other.m_it; - return *this; - } - private: friend class boost::iterator_core_access; @@ -178,6 +164,11 @@ private: inline Reference dereference() const { + if (m_has_less_than_two_elements) + { + return Reference(*m_it, *m_it); + } + iterator_type next(m_it); ++next; return Reference(*m_it, *next); @@ -211,6 +202,7 @@ private: private: iterator_type m_it; + bool m_has_less_than_two_elements; }; |