summaryrefslogtreecommitdiff
path: root/boost/intrusive/detail/reverse_iterator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/intrusive/detail/reverse_iterator.hpp')
-rw-r--r--boost/intrusive/detail/reverse_iterator.hpp45
1 files changed, 33 insertions, 12 deletions
diff --git a/boost/intrusive/detail/reverse_iterator.hpp b/boost/intrusive/detail/reverse_iterator.hpp
index 552e8f4d71..57631feb5d 100644
--- a/boost/intrusive/detail/reverse_iterator.hpp
+++ b/boost/intrusive/detail/reverse_iterator.hpp
@@ -43,12 +43,16 @@ class reverse_iterator
reverse_iterator()
: m_current() //Value initialization to achieve "null iterators" (N3644)
- {}
+ {}
explicit reverse_iterator(It r)
: m_current(r)
{}
+ reverse_iterator(const reverse_iterator& r)
+ : m_current(r.base())
+ {}
+
template<class OtherIt>
reverse_iterator( const reverse_iterator<OtherIt>& r
, typename boost::intrusive::detail::enable_if_convertible<OtherIt, It>::type* =0
@@ -56,6 +60,9 @@ class reverse_iterator
: m_current(r.base())
{}
+ reverse_iterator & operator=( const reverse_iterator& r)
+ { m_current = r.base(); return *this; }
+
template<class OtherIt>
typename boost::intrusive::detail::enable_if_convertible<OtherIt, It, reverse_iterator &>::type
operator=( const reverse_iterator<OtherIt>& r)
@@ -65,20 +72,34 @@ class reverse_iterator
{ return m_current; }
reference operator*() const
- { It temp(m_current); --temp; return *temp; }
+ {
+ It temp(m_current);
+ --temp;
+ reference r = *temp;
+ return r;
+ }
pointer operator->() const
- { It temp(m_current); --temp; return iterator_arrow_result(temp); }
+ {
+ It temp(m_current);
+ --temp;
+ return iterator_arrow_result(temp);
+ }
reference operator[](difference_type off) const
- { return this->m_current[-off - 1]; }
+ {
+ return this->m_current[-off - 1];
+ }
reverse_iterator& operator++()
- { --m_current; return *this; }
+ {
+ --m_current;
+ return *this;
+ }
reverse_iterator operator++(int)
{
- reverse_iterator temp = *this;
+ reverse_iterator temp((*this));
--m_current;
return temp;
}
@@ -91,7 +112,7 @@ class reverse_iterator
reverse_iterator operator--(int)
{
- reverse_iterator temp(*this);
+ reverse_iterator temp((*this));
++m_current;
return temp;
}
@@ -117,17 +138,17 @@ class reverse_iterator
reverse_iterator& operator+=(difference_type off)
{ m_current -= off; return *this; }
+ reverse_iterator& operator-=(difference_type off)
+ { m_current += off; return *this; }
+
friend reverse_iterator operator+(reverse_iterator l, difference_type off)
- { l.m_current -= off; return l; }
+ { return (l += off); }
friend reverse_iterator operator+(difference_type off, reverse_iterator r)
{ return (r += off); }
- reverse_iterator& operator-=(difference_type off)
- { m_current += off; return *this; }
-
friend reverse_iterator operator-(reverse_iterator l, difference_type off)
- { l.m_current += off; return l; }
+ { return (l-= off); }
friend difference_type operator-(const reverse_iterator& l, const reverse_iterator& r)
{ return r.m_current - l.m_current; }