summaryrefslogtreecommitdiff
path: root/boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp
diff options
context:
space:
mode:
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.hpp52
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;
};