[libc-commits] [libc] c5f839b - [reland][libc] Add reverse_iterator comparisons (#86188)
via libc-commits
libc-commits at lists.llvm.org
Fri Mar 22 01:50:45 PDT 2024
Author: Guillaume Chatelet
Date: 2024-03-22T09:50:42+01:00
New Revision: c5f839bd58e7f888acc4cb39a18e9e5bbaa9fb0a
URL: https://github.com/llvm/llvm-project/commit/c5f839bd58e7f888acc4cb39a18e9e5bbaa9fb0a
DIFF: https://github.com/llvm/llvm-project/commit/c5f839bd58e7f888acc4cb39a18e9e5bbaa9fb0a.diff
LOG: [reland][libc] Add reverse_iterator comparisons (#86188)
This is a reland of #86147 but with a proper `base()` function.
https://en.cppreference.com/w/cpp/iterator/reverse_iterator/operator_cmp
Added:
Modified:
libc/src/__support/CPP/iterator.h
Removed:
################################################################################
diff --git a/libc/src/__support/CPP/iterator.h b/libc/src/__support/CPP/iterator.h
index c5bfb1912c7b74..b0fd5c9f22ae01 100644
--- a/libc/src/__support/CPP/iterator.h
+++ b/libc/src/__support/CPP/iterator.h
@@ -20,6 +20,7 @@ namespace cpp {
template <typename T> struct iterator_traits;
template <typename T> struct iterator_traits<T *> {
using reference = T &;
+ using value_type = T;
};
template <typename Iter> class reverse_iterator {
@@ -27,6 +28,8 @@ template <typename Iter> class reverse_iterator {
public:
using reference = typename iterator_traits<Iter>::reference;
+ using value_type = typename iterator_traits<Iter>::value_type;
+ using iterator_type = Iter;
LIBC_INLINE reverse_iterator() : current() {}
LIBC_INLINE constexpr explicit reverse_iterator(Iter it) : current(it) {}
@@ -38,6 +41,38 @@ template <typename Iter> class reverse_iterator {
LIBC_INLINE constexpr explicit reverse_iterator(const Other &it)
: current(it) {}
+ LIBC_INLINE friend constexpr bool operator==(const reverse_iterator &lhs,
+ const reverse_iterator &rhs) {
+ return lhs.base() == rhs.base();
+ }
+
+ LIBC_INLINE friend constexpr bool operator!=(const reverse_iterator &lhs,
+ const reverse_iterator &rhs) {
+ return lhs.base() != rhs.base();
+ }
+
+ LIBC_INLINE friend constexpr bool operator<(const reverse_iterator &lhs,
+ const reverse_iterator &rhs) {
+ return lhs.base() > rhs.base();
+ }
+
+ LIBC_INLINE friend constexpr bool operator<=(const reverse_iterator &lhs,
+ const reverse_iterator &rhs) {
+ return lhs.base() >= rhs.base();
+ }
+
+ LIBC_INLINE friend constexpr bool operator>(const reverse_iterator &lhs,
+ const reverse_iterator &rhs) {
+ return lhs.base() < rhs.base();
+ }
+
+ LIBC_INLINE friend constexpr bool operator>=(const reverse_iterator &lhs,
+ const reverse_iterator &rhs) {
+ return lhs.base() <= rhs.base();
+ }
+
+ LIBC_INLINE constexpr iterator_type base() const { return current; }
+
LIBC_INLINE constexpr reference operator*() const {
Iter tmp = current;
return *--tmp;
More information about the libc-commits
mailing list