[libc-commits] [libc] [libc] Add front() and erase() to FixedVector (PR #213866)
Pavel Labath via libc-commits
libc-commits at lists.llvm.org
Tue Aug 4 00:55:38 PDT 2026
https://github.com/labath created https://github.com/llvm/llvm-project/pull/213866
Add front() accessors and erase() method to FixedVector. I use these to clean up the pop_front implementation in if_nameindex_test.cpp, which previously manually shifted elements and popped the back.
Assisted by Gemini.
>From b058d8a37949363aed41117783eada1cf6f655c4 Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Tue, 4 Aug 2026 07:54:19 +0000
Subject: [PATCH] [libc] Add front() and erase() to FixedVector
Add front() accessors and erase() method to FixedVector. I use these
to clean up the pop_front implementation in if_nameindex_test.cpp, which
previously manually shifted elements and popped the back.
Assisted by Gemini.
---
libc/src/__support/fixedvector.h | 18 +++++++++
libc/test/src/__support/fixedvector_test.cpp | 37 +++++++++++++++++++
libc/test/src/net/linux/if_nameindex_test.cpp | 7 +---
3 files changed, 57 insertions(+), 5 deletions(-)
diff --git a/libc/src/__support/fixedvector.h b/libc/src/__support/fixedvector.h
index 34601f86dc017..daa6a4101916d 100644
--- a/libc/src/__support/fixedvector.h
+++ b/libc/src/__support/fixedvector.h
@@ -57,6 +57,16 @@ template <typename T, size_t CAPACITY> class FixedVector {
return true;
}
+ LIBC_INLINE constexpr const T &front() const {
+ LIBC_ASSERT(!empty());
+ return store[0];
+ }
+
+ LIBC_INLINE constexpr T &front() {
+ LIBC_ASSERT(!empty());
+ return store[0];
+ }
+
LIBC_INLINE constexpr const T &back() const {
LIBC_ASSERT(!empty());
return store[item_count - 1];
@@ -75,6 +85,14 @@ template <typename T, size_t CAPACITY> class FixedVector {
return true;
}
+ LIBC_INLINE constexpr iterator erase(iterator pos) {
+ LIBC_ASSERT(pos >= begin() && pos < end());
+ for (iterator it = pos; it + 1 != end(); ++it)
+ *it = *(it + 1);
+ pop_back();
+ return pos;
+ }
+
LIBC_INLINE constexpr T &operator[](size_t idx) {
LIBC_ASSERT(idx < item_count);
return store[idx];
diff --git a/libc/test/src/__support/fixedvector_test.cpp b/libc/test/src/__support/fixedvector_test.cpp
index 8be18a52ec015..3e5972f8869d4 100644
--- a/libc/test/src/__support/fixedvector_test.cpp
+++ b/libc/test/src/__support/fixedvector_test.cpp
@@ -106,3 +106,40 @@ TEST(LlvmLibcFixedVectorTest, ConstForwardIteration) {
ASSERT_EQ(*it, arr[idx]);
}
}
+
+TEST(LlvmLibcFixedVectorTest, Front) {
+ LIBC_NAMESPACE::FixedVector<int, 20> fixed_vector;
+ for (int i = 0; i < 5; i++)
+ ASSERT_TRUE(fixed_vector.push_back(i));
+ ASSERT_EQ(fixed_vector.front(), 0);
+ fixed_vector.front() = 10;
+ ASSERT_EQ(fixed_vector.front(), 10);
+ fixed_vector.front() = 0;
+
+ const auto &const_vector = fixed_vector;
+ ASSERT_EQ(const_vector.front(), 0);
+}
+
+TEST(LlvmLibcFixedVectorTest, Erase) {
+ LIBC_NAMESPACE::FixedVector<int, 20> fixed_vector;
+ for (int i = 0; i < 5; i++)
+ ASSERT_TRUE(fixed_vector.push_back(i));
+
+ auto it = fixed_vector.erase(fixed_vector.begin());
+ ASSERT_EQ(it, fixed_vector.begin());
+ ASSERT_EQ(fixed_vector.size(), size_t(4));
+ ASSERT_EQ(fixed_vector.front(), 1);
+ ASSERT_EQ(fixed_vector.back(), 4);
+
+ it = fixed_vector.erase(fixed_vector.begin() + 1);
+ ASSERT_EQ(it, fixed_vector.begin() + 1);
+ ASSERT_EQ(fixed_vector.size(), size_t(3));
+ ASSERT_EQ(fixed_vector[0], 1);
+ ASSERT_EQ(fixed_vector[1], 3);
+ ASSERT_EQ(fixed_vector[2], 4);
+
+ it = fixed_vector.erase(fixed_vector.end() - 1);
+ ASSERT_EQ(it, fixed_vector.end());
+ ASSERT_EQ(fixed_vector.size(), size_t(2));
+ ASSERT_EQ(fixed_vector.back(), 3);
+}
diff --git a/libc/test/src/net/linux/if_nameindex_test.cpp b/libc/test/src/net/linux/if_nameindex_test.cpp
index 1285f967ad0b1..f210584092ce0 100644
--- a/libc/test/src/net/linux/if_nameindex_test.cpp
+++ b/libc/test/src/net/linux/if_nameindex_test.cpp
@@ -49,11 +49,8 @@ template <typename T, size_t CAPACITY>
static optional<T> pop_front(FixedVector<T, CAPACITY> &vec) {
if (vec.empty())
return nullopt;
- // TODO: Add front() and erase() to FixedVector, then clean this up.
- T first = vec[0];
- for (size_t i = 1; i < vec.size(); ++i)
- vec[i - 1] = vec[i];
- vec.pop_back();
+ T first = vec.front();
+ vec.erase(vec.begin());
return first;
}
More information about the libc-commits
mailing list