From 4f288d55eabbdb1bb7bb33963d0a3d4adb6188de Mon Sep 17 00:00:00 2001 From: Jay Foad 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 + inline bool operator<(ArrayRef LHS, ArrayRef RHS) { + return std::lexicographical_compare(LHS.begin(), LHS.end(), RHS.begin(), + RHS.end()); + } + + template + inline bool operator>(ArrayRef LHS, ArrayRef RHS) { + return RHS < LHS; + } + + template + inline bool operator<=(ArrayRef LHS, ArrayRef RHS) { + return !(LHS > RHS); + } + + template + inline bool operator>=(ArrayRef LHS, ArrayRef RHS) { + return !(LHS < RHS); + } + /// @} template hash_code hash_value(ArrayRef 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() == ArrayRef()); } +TEST(ArrayRefTest, Compare) { + ArrayRef Ban("Ban"); + ArrayRef Banana("Banana"); + ArrayRef 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)