@@ -20,13 +20,15 @@ namespace cpp {
20
20
template <typename T> struct iterator_traits ;
21
21
template <typename T> struct iterator_traits <T *> {
22
22
using reference = T &;
23
+ using value_type = T;
23
24
};
24
25
25
26
template <typename Iter> class reverse_iterator {
26
27
Iter current;
27
28
28
29
public:
29
30
using reference = typename iterator_traits<Iter>::reference;
31
+ using value_type = typename iterator_traits<Iter>::value_type;
30
32
31
33
LIBC_INLINE reverse_iterator () : current() {}
32
34
LIBC_INLINE constexpr explicit reverse_iterator (Iter it) : current(it) {}
@@ -38,6 +40,38 @@ template <typename Iter> class reverse_iterator {
38
40
LIBC_INLINE constexpr explicit reverse_iterator (const Other &it)
39
41
: current(it) {}
40
42
43
+ LIBC_INLINE friend constexpr bool operator ==(const reverse_iterator &lhs,
44
+ const reverse_iterator &rhs) {
45
+ return lhs.base () == rhs.base ();
46
+ }
47
+
48
+ LIBC_INLINE friend constexpr bool operator !=(const reverse_iterator &lhs,
49
+ const reverse_iterator &rhs) {
50
+ return lhs.base () != rhs.base ();
51
+ }
52
+
53
+ LIBC_INLINE friend constexpr bool operator <(const reverse_iterator &lhs,
54
+ const reverse_iterator &rhs) {
55
+ return lhs.base () < rhs.base ();
56
+ }
57
+
58
+ LIBC_INLINE friend constexpr bool operator <=(const reverse_iterator &lhs,
59
+ const reverse_iterator &rhs) {
60
+ return lhs.base () <= rhs.base ();
61
+ }
62
+
63
+ LIBC_INLINE friend constexpr bool operator >(const reverse_iterator &lhs,
64
+ const reverse_iterator &rhs) {
65
+ return lhs.base () > rhs.base ();
66
+ }
67
+
68
+ LIBC_INLINE friend constexpr bool operator >=(const reverse_iterator &lhs,
69
+ const reverse_iterator &rhs) {
70
+ return lhs.base () >= rhs.base ();
71
+ }
72
+
73
+ LIBC_INLINE constexpr iterator_type base () const { current; }
74
+
41
75
LIBC_INLINE constexpr reference operator *() const {
42
76
Iter tmp = current;
43
77
return *--tmp;
0 commit comments