[llvm] 2725765 - [LLVM][ADT] Add `consume_front` and `consume_back` to ArrayRef (#146741)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 2 13:32:31 PDT 2025
Author: Rahul Joshi
Date: 2025-07-02T13:32:27-07:00
New Revision: 27257654324631a495f718e50c8e5a4530ea2e8f
URL: https://github.com/llvm/llvm-project/commit/27257654324631a495f718e50c8e5a4530ea2e8f
DIFF: https://github.com/llvm/llvm-project/commit/27257654324631a495f718e50c8e5a4530ea2e8f.diff
LOG: [LLVM][ADT] Add `consume_front` and `consume_back` to ArrayRef (#146741)
Add `consume_front` that returns the first element and drops it from the
current ArrayRef, and `consume_back` that returns the last element and
drops it from the current ArrayRef.
Added:
Modified:
llvm/include/llvm/ADT/ArrayRef.h
llvm/unittests/ADT/ArrayRefTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ADT/ArrayRef.h b/llvm/include/llvm/ADT/ArrayRef.h
index 7fe43c99e34a7..8091be2036642 100644
--- a/llvm/include/llvm/ADT/ArrayRef.h
+++ b/llvm/include/llvm/ADT/ArrayRef.h
@@ -158,6 +158,20 @@ namespace llvm {
return Data[Length-1];
}
+ /// consume_front() - Returns the first element and drops it from ArrayRef.
+ const T &consume_front() {
+ const T &Ret = front();
+ *this = drop_front();
+ return Ret;
+ }
+
+ /// consume_back() - Returns the last element and drops it from ArrayRef.
+ const T &consume_back() {
+ const T &Ret = back();
+ *this = drop_back();
+ return Ret;
+ }
+
// copy - Allocate copy in Allocator and return ArrayRef<T> to it.
template <typename Allocator> MutableArrayRef<T> copy(Allocator &A) {
T *Buff = A.template Allocate<T>(Length);
@@ -352,6 +366,20 @@ namespace llvm {
return data()[this->size()-1];
}
+ /// consume_front() - Returns the first element and drops it from ArrayRef.
+ T &consume_front() {
+ T &Ret = front();
+ *this = drop_front();
+ return Ret;
+ }
+
+ /// consume_back() - Returns the last element and drops it from ArrayRef.
+ T &consume_back() {
+ T &Ret = back();
+ *this = drop_back();
+ return Ret;
+ }
+
/// slice(n, m) - Chop off the first N elements of the array, and keep M
/// elements in the array.
MutableArrayRef<T> slice(size_t N, size_t M) const {
diff --git a/llvm/unittests/ADT/ArrayRefTest.cpp b/llvm/unittests/ADT/ArrayRefTest.cpp
index 985db1625454c..b5fc0a100571e 100644
--- a/llvm/unittests/ADT/ArrayRefTest.cpp
+++ b/llvm/unittests/ADT/ArrayRefTest.cpp
@@ -104,6 +104,48 @@ TEST(ArrayRefTest, DropFront) {
EXPECT_TRUE(AR1.drop_front(2).equals(AR2));
}
+TEST(ArrayRefTest, ConsumeFront) {
+ static const int TheNumbers[] = {4, 8, 15, 16, 23, 42};
+ ArrayRef<int> AR1(TheNumbers);
+ ArrayRef<int> AR2(&TheNumbers[2], AR1.size() - 2);
+ EXPECT_EQ(&AR1.consume_front(), &TheNumbers[0]);
+ EXPECT_EQ(&AR1.consume_front(), &TheNumbers[1]);
+ EXPECT_TRUE(AR1.equals(AR2));
+}
+
+TEST(ArrayRefTest, ConsumeBack) {
+ static const int TheNumbers[] = {4, 8, 15, 16, 23, 42};
+ ArrayRef<int> AR1(TheNumbers);
+ ArrayRef<int> AR2(TheNumbers, AR1.size() - 2);
+ EXPECT_EQ(&AR1.consume_back(), &TheNumbers[5]);
+ EXPECT_EQ(&AR1.consume_back(), &TheNumbers[4]);
+ EXPECT_TRUE(AR1.equals(AR2));
+}
+
+TEST(ArrayRefTest, MutableArryaRefConsumeFront) {
+ int TheNumbers[] = {4, 8, 15, 16, 23, 42};
+ MutableArrayRef<int> AR1(TheNumbers);
+ MutableArrayRef<int> AR2(&TheNumbers[2], AR1.size() - 2);
+ EXPECT_EQ(&AR1.consume_front(), &TheNumbers[0]);
+ EXPECT_EQ(&AR1.consume_front(), &TheNumbers[1]);
+ EXPECT_TRUE(AR1.equals(AR2));
+
+ AR1.consume_front() = 33;
+ EXPECT_EQ(TheNumbers[2], 33);
+}
+
+TEST(ArrayRefTest, MutableArryaRefConsumeBack) {
+ int TheNumbers[] = {4, 8, 15, 16, 23, 42};
+ MutableArrayRef<int> AR1(TheNumbers);
+ MutableArrayRef<int> AR2(TheNumbers, AR1.size() - 2);
+ EXPECT_EQ(&AR1.consume_back(), &TheNumbers[5]);
+ EXPECT_EQ(&AR1.consume_back(), &TheNumbers[4]);
+ EXPECT_TRUE(AR1.equals(AR2));
+
+ AR1.consume_back() = 33;
+ EXPECT_EQ(TheNumbers[3], 33);
+}
+
TEST(ArrayRefTest, DropWhile) {
static const int TheNumbers[] = {1, 3, 5, 8, 10, 11};
ArrayRef<int> AR1(TheNumbers);
More information about the llvm-commits
mailing list