xref: /aosp_15_r20/external/llvm-libc/src/__support/CPP/iterator.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- Standalone implementation of iterator -------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H
10 #define LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H
11 
12 #include "src/__support/CPP/type_traits/enable_if.h"
13 #include "src/__support/CPP/type_traits/is_convertible.h"
14 #include "src/__support/CPP/type_traits/is_same.h"
15 #include "src/__support/macros/attributes.h"
16 #include "src/__support/macros/config.h"
17 
18 namespace LIBC_NAMESPACE_DECL {
19 namespace cpp {
20 
21 template <typename T> struct iterator_traits;
22 template <typename T> struct iterator_traits<T *> {
23   using reference = T &;
24   using value_type = T;
25 };
26 
27 template <typename Iter> class reverse_iterator {
28   Iter current;
29 
30 public:
31   using reference = typename iterator_traits<Iter>::reference;
32   using value_type = typename iterator_traits<Iter>::value_type;
33   using iterator_type = Iter;
34 
35   LIBC_INLINE reverse_iterator() : current() {}
36   LIBC_INLINE constexpr explicit reverse_iterator(Iter it) : current(it) {}
37 
38   template <typename Other,
39             cpp::enable_if_t<!cpp::is_same_v<Iter, Other> &&
40                                  cpp::is_convertible_v<const Other &, Iter>,
41                              int> = 0>
42   LIBC_INLINE constexpr explicit reverse_iterator(const Other &it)
43       : current(it) {}
44 
45   LIBC_INLINE friend constexpr bool operator==(const reverse_iterator &lhs,
46                                                const reverse_iterator &rhs) {
47     return lhs.base() == rhs.base();
48   }
49 
50   LIBC_INLINE friend constexpr bool operator!=(const reverse_iterator &lhs,
51                                                const reverse_iterator &rhs) {
52     return lhs.base() != rhs.base();
53   }
54 
55   LIBC_INLINE friend constexpr bool operator<(const reverse_iterator &lhs,
56                                               const reverse_iterator &rhs) {
57     return lhs.base() > rhs.base();
58   }
59 
60   LIBC_INLINE friend constexpr bool operator<=(const reverse_iterator &lhs,
61                                                const reverse_iterator &rhs) {
62     return lhs.base() >= rhs.base();
63   }
64 
65   LIBC_INLINE friend constexpr bool operator>(const reverse_iterator &lhs,
66                                               const reverse_iterator &rhs) {
67     return lhs.base() < rhs.base();
68   }
69 
70   LIBC_INLINE friend constexpr bool operator>=(const reverse_iterator &lhs,
71                                                const reverse_iterator &rhs) {
72     return lhs.base() <= rhs.base();
73   }
74 
75   LIBC_INLINE constexpr iterator_type base() const { return current; }
76 
77   LIBC_INLINE constexpr reference operator*() const {
78     Iter tmp = current;
79     return *--tmp;
80   }
81   LIBC_INLINE constexpr reverse_iterator operator--() {
82     ++current;
83     return *this;
84   }
85   LIBC_INLINE constexpr reverse_iterator &operator++() {
86     --current;
87     return *this;
88   }
89   LIBC_INLINE constexpr reverse_iterator operator++(int) {
90     reverse_iterator tmp(*this);
91     --current;
92     return tmp;
93   }
94 };
95 
96 } // namespace cpp
97 } // namespace LIBC_NAMESPACE_DECL
98 
99 #endif // LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H
100