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
17namespace LIBC_NAMESPACE {
18namespace cpp {
19
20template <typename T> struct iterator_traits;
21template <typename T> struct iterator_traits<T *> {
22 using reference = T &;
23 using value_type = T;
24};
25
26template <typename Iter> class reverse_iterator {
27 Iter current;
28
29public:
30 using reference = typename iterator_traits<Iter>::reference;
31 using value_type = typename iterator_traits<Iter>::value_type;
32 using iterator_type = Iter;
33
34 LIBC_INLINE reverse_iterator() : current() {}
35 LIBC_INLINE constexpr explicit reverse_iterator(Iter it) : current(it) {}
36
37 template <typename Other,
38 cpp::enable_if_t<!cpp::is_same_v<Iter, Other> &&
39 cpp::is_convertible_v<const Other &, Iter>,
40 int> = 0>
41 LIBC_INLINE constexpr explicit reverse_iterator(const Other &it)
42 : current(it) {}
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
76 LIBC_INLINE constexpr reference operator*() const {
77 Iter tmp = current;
78 return *--tmp;
79 }
80 LIBC_INLINE constexpr reverse_iterator operator--() {
81 ++current;
82 return *this;
83 }
84 LIBC_INLINE constexpr reverse_iterator &operator++() {
85 --current;
86 return *this;
87 }
88 LIBC_INLINE constexpr reverse_iterator operator++(int) {
89 reverse_iterator tmp(*this);
90 --current;
91 return tmp;
92 }
93};
94
95} // namespace cpp
96} // namespace LIBC_NAMESPACE
97
98#endif // LLVM_LIBC_SRC___SUPPORT_CPP_ITERATOR_H
99

source code of libc/src/__support/CPP/iterator.h