1 /////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Ion Gaztanaga 2014-2014
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 // See http://www.boost.org/libs/intrusive for documentation.
11 /////////////////////////////////////////////////////////////////////////////
13 #ifndef BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP
14 #define BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP
16 #ifndef BOOST_CONFIG_HPP
17 # include <boost/config.hpp>
20 #if defined(BOOST_HAS_PRAGMA_ONCE)
24 #include <boost/intrusive/detail/config_begin.hpp>
25 #include <boost/intrusive/detail/iterator.hpp>
26 #include <boost/intrusive/detail/mpl.hpp>
32 class reverse_iterator
35 typedef typename boost::intrusive::iterator_traits<It>::pointer pointer;
36 typedef typename boost::intrusive::iterator_traits<It>::reference reference;
37 typedef typename boost::intrusive::iterator_traits<It>::difference_type difference_type;
38 typedef typename boost::intrusive::iterator_traits<It>::iterator_category iterator_category;
39 typedef typename boost::intrusive::iterator_traits<It>::value_type value_type;
42 typedef It iterator_type;
45 : m_current() //Value initialization to achieve "null iterators" (N3644)
48 explicit reverse_iterator(It r)
52 reverse_iterator(const reverse_iterator& r)
56 template<class OtherIt>
57 reverse_iterator( const reverse_iterator<OtherIt>& r
58 , typename boost::intrusive::detail::enable_if_convertible<OtherIt, It>::type* =0
63 reverse_iterator & operator=( const reverse_iterator& r)
64 { m_current = r.base(); return *this; }
66 template<class OtherIt>
67 typename boost::intrusive::detail::enable_if_convertible<OtherIt, It, reverse_iterator &>::type
68 operator=( const reverse_iterator<OtherIt>& r)
69 { m_current = r.base(); return *this; }
74 reference operator*() const
82 pointer operator->() const
86 return iterator_arrow_result(temp);
89 reference operator[](difference_type off) const
91 return this->m_current[-off - 1];
94 reverse_iterator& operator++()
100 reverse_iterator operator++(int)
102 reverse_iterator temp((*this));
107 reverse_iterator& operator--()
113 reverse_iterator operator--(int)
115 reverse_iterator temp((*this));
120 friend bool operator==(const reverse_iterator& l, const reverse_iterator& r)
121 { return l.m_current == r.m_current; }
123 friend bool operator!=(const reverse_iterator& l, const reverse_iterator& r)
124 { return l.m_current != r.m_current; }
126 friend bool operator<(const reverse_iterator& l, const reverse_iterator& r)
127 { return l.m_current > r.m_current; }
129 friend bool operator<=(const reverse_iterator& l, const reverse_iterator& r)
130 { return l.m_current >= r.m_current; }
132 friend bool operator>(const reverse_iterator& l, const reverse_iterator& r)
133 { return l.m_current < r.m_current; }
135 friend bool operator>=(const reverse_iterator& l, const reverse_iterator& r)
136 { return l.m_current <= r.m_current; }
138 reverse_iterator& operator+=(difference_type off)
139 { m_current -= off; return *this; }
141 reverse_iterator& operator-=(difference_type off)
142 { m_current += off; return *this; }
144 friend reverse_iterator operator+(reverse_iterator l, difference_type off)
145 { return (l += off); }
147 friend reverse_iterator operator+(difference_type off, reverse_iterator r)
148 { return (r += off); }
150 friend reverse_iterator operator-(reverse_iterator l, difference_type off)
151 { return (l-= off); }
153 friend difference_type operator-(const reverse_iterator& l, const reverse_iterator& r)
154 { return r.m_current - l.m_current; }
157 It m_current; // the wrapped iterator
160 } //namespace intrusive {
161 } //namespace boost {
163 #include <boost/intrusive/detail/config_end.hpp>
165 #endif //BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP