diff options
Diffstat (limited to 'boost/intrusive/detail/reverse_iterator.hpp')
-rw-r--r-- | boost/intrusive/detail/reverse_iterator.hpp | 33 |
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; } |