Skip to content

[reland][libc] Add reverse_iterator comparisons #86188

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 22, 2024

Conversation

gchatelet
Copy link
Contributor

@gchatelet gchatelet commented Mar 21, 2024

This is a reland of #86147 but with a proper base() function.

https://en.cppreference.com/w/cpp/iterator/reverse_iterator/operator_cmp

@llvmbot llvmbot added the libc label Mar 21, 2024
@gchatelet gchatelet changed the title [libc] Add reverse_iterator comparisons (#86147) [reland][libc] Add reverse_iterator comparisons Mar 21, 2024
@llvmbot
Copy link
Member

llvmbot commented Mar 21, 2024

@llvm/pr-subscribers-libc

Author: Guillaume Chatelet (gchatelet)

Changes

https://en.cppreference.com/w/cpp/iterator/reverse_iterator/operator_cmp


Full diff: https://github.com/llvm/llvm-project/pull/86188.diff

1 Files Affected:

  • (modified) libc/src/__support/CPP/iterator.h (+35)
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;

@gchatelet
Copy link
Contributor Author

The fix 8cfdd0e is stacked on the original commit for easier review.

Copy link
Member

@nickdesaulniers nickdesaulniers left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry I missed this in code review of #86147. I guess without calls to these methods (in tests or sources) we don't observe diagnostics at compile time?

@gchatelet
Copy link
Contributor Author

Sorry I missed this in code review of #86147. I guess without calls to these methods (in tests or sources) we don't observe diagnostics at compile time?

Indeed.

@gchatelet gchatelet merged commit c5f839b into llvm:main Mar 22, 2024
@gchatelet gchatelet deleted the reland_reverse_iterator branch March 22, 2024 08:50
chencha3 pushed a commit to chencha3/llvm-project that referenced this pull request Mar 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants