Chris@102
|
1 /////////////////////////////////////////////////////////////////////////////
|
Chris@102
|
2 //
|
Chris@102
|
3 // (C) Copyright Ion Gaztanaga 2014-2014
|
Chris@102
|
4 //
|
Chris@102
|
5 // Distributed under the Boost Software License, Version 1.0.
|
Chris@102
|
6 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@102
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
8 //
|
Chris@102
|
9 // See http://www.boost.org/libs/intrusive for documentation.
|
Chris@102
|
10 //
|
Chris@102
|
11 /////////////////////////////////////////////////////////////////////////////
|
Chris@102
|
12
|
Chris@102
|
13 #ifndef BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP
|
Chris@102
|
14 #define BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP
|
Chris@102
|
15
|
Chris@102
|
16 #ifndef BOOST_CONFIG_HPP
|
Chris@102
|
17 # include <boost/config.hpp>
|
Chris@102
|
18 #endif
|
Chris@102
|
19
|
Chris@102
|
20 #if defined(BOOST_HAS_PRAGMA_ONCE)
|
Chris@102
|
21 # pragma once
|
Chris@102
|
22 #endif
|
Chris@102
|
23
|
Chris@102
|
24 #include <boost/intrusive/detail/config_begin.hpp>
|
Chris@102
|
25 #include <boost/intrusive/detail/iterator.hpp>
|
Chris@102
|
26
|
Chris@102
|
27 namespace boost {
|
Chris@102
|
28 namespace intrusive {
|
Chris@102
|
29
|
Chris@102
|
30 template<class It>
|
Chris@102
|
31 class reverse_iterator
|
Chris@102
|
32 {
|
Chris@102
|
33 public:
|
Chris@102
|
34 typedef typename boost::intrusive::iterator_traits<It>::pointer pointer;
|
Chris@102
|
35 typedef typename boost::intrusive::iterator_traits<It>::reference reference;
|
Chris@102
|
36 typedef typename boost::intrusive::iterator_traits<It>::difference_type difference_type;
|
Chris@102
|
37 typedef typename boost::intrusive::iterator_traits<It>::iterator_category iterator_category;
|
Chris@102
|
38 typedef typename boost::intrusive::iterator_traits<It>::value_type value_type;
|
Chris@102
|
39
|
Chris@102
|
40
|
Chris@102
|
41 typedef It iterator_type;
|
Chris@102
|
42
|
Chris@102
|
43 reverse_iterator()
|
Chris@102
|
44 : m_current() //Value initialization to achieve "null iterators" (N3644)
|
Chris@102
|
45 {}
|
Chris@102
|
46
|
Chris@102
|
47 explicit reverse_iterator(It r)
|
Chris@102
|
48 : m_current(r)
|
Chris@102
|
49 {}
|
Chris@102
|
50
|
Chris@102
|
51 template<class OtherIt>
|
Chris@102
|
52 reverse_iterator(const reverse_iterator<OtherIt>& r)
|
Chris@102
|
53 : m_current(r.base())
|
Chris@102
|
54 {}
|
Chris@102
|
55
|
Chris@102
|
56 It base() const
|
Chris@102
|
57 { return m_current; }
|
Chris@102
|
58
|
Chris@102
|
59 reference operator*() const
|
Chris@102
|
60 { It temp(m_current); --temp; return *temp; }
|
Chris@102
|
61
|
Chris@102
|
62 pointer operator->() const
|
Chris@102
|
63 { It temp(m_current); --temp; return temp.operator->(); }
|
Chris@102
|
64
|
Chris@102
|
65 reference operator[](difference_type off) const
|
Chris@102
|
66 { return this->m_current[-off-1]; }
|
Chris@102
|
67
|
Chris@102
|
68 reverse_iterator& operator++()
|
Chris@102
|
69 { --m_current; return *this; }
|
Chris@102
|
70
|
Chris@102
|
71 reverse_iterator operator++(int)
|
Chris@102
|
72 {
|
Chris@102
|
73 reverse_iterator temp = *this;
|
Chris@102
|
74 --m_current;
|
Chris@102
|
75 return temp;
|
Chris@102
|
76 }
|
Chris@102
|
77
|
Chris@102
|
78 reverse_iterator& operator--()
|
Chris@102
|
79 {
|
Chris@102
|
80 ++m_current;
|
Chris@102
|
81 return *this;
|
Chris@102
|
82 }
|
Chris@102
|
83
|
Chris@102
|
84 reverse_iterator operator--(int)
|
Chris@102
|
85 {
|
Chris@102
|
86 reverse_iterator temp(*this);
|
Chris@102
|
87 ++m_current;
|
Chris@102
|
88 return temp;
|
Chris@102
|
89 }
|
Chris@102
|
90
|
Chris@102
|
91 friend bool operator==(const reverse_iterator& l, const reverse_iterator& r)
|
Chris@102
|
92 { return l.m_current == r.m_current; }
|
Chris@102
|
93
|
Chris@102
|
94 friend bool operator!=(const reverse_iterator& l, const reverse_iterator& r)
|
Chris@102
|
95 { return l.m_current != r.m_current; }
|
Chris@102
|
96
|
Chris@102
|
97 friend bool operator<(const reverse_iterator& l, const reverse_iterator& r)
|
Chris@102
|
98 { return l.m_current > r.m_current; }
|
Chris@102
|
99
|
Chris@102
|
100 friend bool operator<=(const reverse_iterator& l, const reverse_iterator& r)
|
Chris@102
|
101 { return l.m_current >= r.m_current; }
|
Chris@102
|
102
|
Chris@102
|
103 friend bool operator>(const reverse_iterator& l, const reverse_iterator& r)
|
Chris@102
|
104 { return l.m_current < r.m_current; }
|
Chris@102
|
105
|
Chris@102
|
106 friend bool operator>=(const reverse_iterator& l, const reverse_iterator& r)
|
Chris@102
|
107 { return l.m_current <= r.m_current; }
|
Chris@102
|
108
|
Chris@102
|
109 reverse_iterator& operator+=(difference_type off)
|
Chris@102
|
110 { m_current -= off; return *this; }
|
Chris@102
|
111
|
Chris@102
|
112 friend reverse_iterator operator+(const reverse_iterator & l, difference_type off)
|
Chris@102
|
113 {
|
Chris@102
|
114 reverse_iterator tmp(l.m_current);
|
Chris@102
|
115 tmp.m_current -= off;
|
Chris@102
|
116 return tmp;
|
Chris@102
|
117 }
|
Chris@102
|
118
|
Chris@102
|
119 reverse_iterator& operator-=(difference_type off)
|
Chris@102
|
120 { m_current += off; return *this; }
|
Chris@102
|
121
|
Chris@102
|
122 friend reverse_iterator operator-(const reverse_iterator & l, difference_type off)
|
Chris@102
|
123 {
|
Chris@102
|
124 reverse_iterator tmp(l.m_current);
|
Chris@102
|
125 tmp.m_current += off;
|
Chris@102
|
126 return tmp;
|
Chris@102
|
127 }
|
Chris@102
|
128
|
Chris@102
|
129 friend difference_type operator-(const reverse_iterator& l, const reverse_iterator& r)
|
Chris@102
|
130 { return r.m_current - l.m_current; }
|
Chris@102
|
131
|
Chris@102
|
132 private:
|
Chris@102
|
133 It m_current; // the wrapped iterator
|
Chris@102
|
134 };
|
Chris@102
|
135
|
Chris@102
|
136 } //namespace intrusive {
|
Chris@102
|
137 } //namespace boost {
|
Chris@102
|
138
|
Chris@102
|
139 #include <boost/intrusive/detail/config_end.hpp>
|
Chris@102
|
140
|
Chris@102
|
141 #endif //BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP
|