[llvm] [ADT] Implement ArrayRef::operator< and other comparisons (PR #147277)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 7 03:57:31 PDT 2025
https://github.com/jayfoad created https://github.com/llvm/llvm-project/pull/147277
Order ArrayRefs using std::lexicographical_compare, just like
std::vector and SmallVector.
>From 4f288d55eabbdb1bb7bb33963d0a3d4adb6188de Mon Sep 17 00:00:00 2001
From: Jay Foad <jay.foad at amd.com>
Date: Mon, 7 Jul 2025 11:41:45 +0100
Subject: [PATCH] [ADT] Implement ArrayRef::operator< and other comparisons
Order ArrayRefs using std::lexicographical_compare, just like
std::vector and SmallVector.
---
llvm/include/llvm/ADT/ArrayRef.h | 21 +++++++++++++++++++++
llvm/unittests/ADT/ArrayRefTest.cpp | 21 +++++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/llvm/include/llvm/ADT/ArrayRef.h b/llvm/include/llvm/ADT/ArrayRef.h
index 8091be2036642..ff8bdb8b4fec4 100644
--- a/llvm/include/llvm/ADT/ArrayRef.h
+++ b/llvm/include/llvm/ADT/ArrayRef.h
@@ -565,6 +565,27 @@ namespace llvm {
return !(LHS == RHS);
}
+ template <typename T>
+ inline bool operator<(ArrayRef<T> LHS, ArrayRef<T> RHS) {
+ return std::lexicographical_compare(LHS.begin(), LHS.end(), RHS.begin(),
+ RHS.end());
+ }
+
+ template <typename T>
+ inline bool operator>(ArrayRef<T> LHS, ArrayRef<T> RHS) {
+ return RHS < LHS;
+ }
+
+ template <typename T>
+ inline bool operator<=(ArrayRef<T> LHS, ArrayRef<T> RHS) {
+ return !(LHS > RHS);
+ }
+
+ template <typename T>
+ inline bool operator>=(ArrayRef<T> LHS, ArrayRef<T> RHS) {
+ return !(LHS < RHS);
+ }
+
/// @}
template <typename T> hash_code hash_value(ArrayRef<T> S) {
diff --git a/llvm/unittests/ADT/ArrayRefTest.cpp b/llvm/unittests/ADT/ArrayRefTest.cpp
index b5fc0a100571e..736c8fbb26b38 100644
--- a/llvm/unittests/ADT/ArrayRefTest.cpp
+++ b/llvm/unittests/ADT/ArrayRefTest.cpp
@@ -231,6 +231,27 @@ TEST(ArrayRefTest, EmptyEquals) {
EXPECT_TRUE(ArrayRef<unsigned>() == ArrayRef<unsigned>());
}
+TEST(ArrayRefTest, Compare) {
+ ArrayRef<char> Ban("Ban");
+ ArrayRef<char> Banana("Banana");
+ ArrayRef<char> Band("Band");
+
+ EXPECT_TRUE(Ban < Banana);
+ EXPECT_TRUE(Ban <= Banana);
+ EXPECT_FALSE(Ban > Banana);
+ EXPECT_FALSE(Ban >= Banana);
+
+ EXPECT_FALSE(Banana < Banana);
+ EXPECT_TRUE(Banana <= Banana);
+ EXPECT_FALSE(Banana > Banana);
+ EXPECT_TRUE(Banana >= Banana);
+
+ EXPECT_TRUE(Banana < Band);
+ EXPECT_TRUE(Banana <= Band);
+ EXPECT_FALSE(Banana > Band);
+ EXPECT_FALSE(Banana >= Band);
+}
+
TEST(ArrayRefTest, ConstConvert) {
int buf[4];
for (int i = 0; i < 4; ++i)
More information about the llvm-commits
mailing list