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.hpp33
1 files changed, 18 insertions, 15 deletions
diff --git a/boost/intrusive/detail/reverse_iterator.hpp b/boost/intrusive/detail/reverse_iterator.hpp
index 6a6fee5ac2..552e8f4d71 100644
--- a/boost/intrusive/detail/reverse_iterator.hpp
+++ b/boost/intrusive/detail/reverse_iterator.hpp
@@ -23,6 +23,7 @@
#include <boost/intrusive/detail/config_begin.hpp>
#include <boost/intrusive/detail/iterator.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
namespace boost {
namespace intrusive {
@@ -49,10 +50,17 @@ class reverse_iterator
{}
template<class OtherIt>
- reverse_iterator(const reverse_iterator<OtherIt>& r)
+ reverse_iterator( const reverse_iterator<OtherIt>& r
+ , typename boost::intrusive::detail::enable_if_convertible<OtherIt, It>::type* =0
+ )
: m_current(r.base())
{}
+ template<class OtherIt>
+ typename boost::intrusive::detail::enable_if_convertible<OtherIt, It, reverse_iterator &>::type
+ operator=( const reverse_iterator<OtherIt>& r)
+ { m_current = r.base(); return *this; }
+
It base() const
{ return m_current; }
@@ -60,10 +68,10 @@ class reverse_iterator
{ It temp(m_current); --temp; return *temp; }
pointer operator->() const
- { It temp(m_current); --temp; return temp.operator->(); }
+ { 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; }
@@ -109,22 +117,17 @@ class reverse_iterator
reverse_iterator& operator+=(difference_type off)
{ m_current -= off; return *this; }
- friend reverse_iterator operator+(const reverse_iterator & l, difference_type off)
- {
- reverse_iterator tmp(l.m_current);
- tmp.m_current -= off;
- return tmp;
- }
+ friend reverse_iterator operator+(reverse_iterator l, difference_type off)
+ { l.m_current -= off; return l; }
+
+ 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-(const reverse_iterator & l, difference_type off)
- {
- reverse_iterator tmp(l.m_current);
- tmp.m_current += off;
- return tmp;
- }
+ friend reverse_iterator operator-(reverse_iterator l, difference_type off)
+ { l.m_current += off; return l; }
friend difference_type operator-(const reverse_iterator& l, const reverse_iterator& r)
{ return r.m_current - l.m_current; }