@@ -20,13 +20,16 @@ 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;
32
+ using iterator_type = Iter;
30
33
31
34
LIBC_INLINE reverse_iterator () : current() {}
32
35
LIBC_INLINE constexpr explicit reverse_iterator (Iter it) : current(it) {}
@@ -38,6 +41,38 @@ template <typename Iter> class reverse_iterator {
38
41
LIBC_INLINE constexpr explicit reverse_iterator (const Other &it)
39
42
: current(it) {}
40
43
44
+ LIBC_INLINE friend constexpr bool operator ==(const reverse_iterator &lhs,
45
+ const reverse_iterator &rhs) {
46
+ return lhs.base () == rhs.base ();
47
+ }
48
+
49
+ LIBC_INLINE friend constexpr bool operator !=(const reverse_iterator &lhs,
50
+ const reverse_iterator &rhs) {
51
+ return lhs.base () != rhs.base ();
52
+ }
53
+
54
+ LIBC_INLINE friend constexpr bool operator <(const reverse_iterator &lhs,
55
+ const reverse_iterator &rhs) {
56
+ return lhs.base () > rhs.base ();
57
+ }
58
+
59
+ LIBC_INLINE friend constexpr bool operator <=(const reverse_iterator &lhs,
60
+ const reverse_iterator &rhs) {
61
+ return lhs.base () >= rhs.base ();
62
+ }
63
+
64
+ LIBC_INLINE friend constexpr bool operator >(const reverse_iterator &lhs,
65
+ const reverse_iterator &rhs) {
66
+ return lhs.base () < rhs.base ();
67
+ }
68
+
69
+ LIBC_INLINE friend constexpr bool operator >=(const reverse_iterator &lhs,
70
+ const reverse_iterator &rhs) {
71
+ return lhs.base () <= rhs.base ();
72
+ }
73
+
74
+ LIBC_INLINE constexpr iterator_type base () const { return current; }
75
+
41
76
LIBC_INLINE constexpr reference operator *() const {
42
77
Iter tmp = current;
43
78
return *--tmp;
0 commit comments