[libc-commits] [libc] [libc][support][FixedVector] add reverse iterator (PR #86732)
via libc-commits
libc-commits at lists.llvm.org
Tue Mar 26 13:25:43 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libc
Author: Nick Desaulniers (nickdesaulniers)
<details>
<summary>Changes</summary>
Critically, we don't want to return an iterator to the end of the underlying
cpp::array "store." Add a test to catch this issue.
This will be used by __cxa_finalize to iterate backwards through a FixedVector.
Link: #<!-- -->85651
---
Full diff: https://github.com/llvm/llvm-project/pull/86732.diff
2 Files Affected:
- (modified) libc/src/__support/fixedvector.h (+6)
- (modified) libc/test/src/__support/fixedvector_test.cpp (+16)
``````````diff
diff --git a/libc/src/__support/fixedvector.h b/libc/src/__support/fixedvector.h
index fff905d8c6c418..393190379dff2b 100644
--- a/libc/src/__support/fixedvector.h
+++ b/libc/src/__support/fixedvector.h
@@ -11,6 +11,8 @@
#include "src/__support/CPP/array.h"
+#include "src/__support/CPP/iterator.h"
+
namespace LIBC_NAMESPACE {
// A fixed size data store backed by an underlying cpp::array data structure. It
@@ -55,6 +57,10 @@ template <typename T, size_t CAPACITY> class FixedVector {
// matches the `destroy` API of those other data structures so that users
// can easily swap one data structure for the other.
static void destroy(FixedVector<T, CAPACITY> *store) { store->reset(); }
+
+ using reverse_iterator = typename cpp::array<T, CAPACITY>::reverse_iterator;
+ LIBC_INLINE constexpr reverse_iterator rbegin() { return reverse_iterator{&store[item_count]}; }
+ LIBC_INLINE constexpr reverse_iterator rend() { return store.rend(); }
};
} // namespace LIBC_NAMESPACE
diff --git a/libc/test/src/__support/fixedvector_test.cpp b/libc/test/src/__support/fixedvector_test.cpp
index a70ebfabed2270..4e92081321de7a 100644
--- a/libc/test/src/__support/fixedvector_test.cpp
+++ b/libc/test/src/__support/fixedvector_test.cpp
@@ -43,3 +43,19 @@ TEST(LlvmLibcFixedVectorTest, Destroy) {
LIBC_NAMESPACE::FixedVector<int, 20>::destroy(&fixed_vector);
ASSERT_TRUE(fixed_vector.empty());
}
+
+TEST(LlvmLibcFixedVectorTest, Iteration) {
+ LIBC_NAMESPACE::FixedVector<int, 20> v;
+ for (int i = 0; i < 3; i++)
+ v.push_back(i);
+ auto it = v.rbegin();
+ ASSERT_EQ(*it, 2);
+ ASSERT_EQ(*++it, 1);
+ ASSERT_EQ(*++it, 0);
+ // TODO: need an overload of Test::test for iterators?
+ // ASSERT_EQ(++it, v.rend());
+ // ASSERT_EQ(v.rbegin(), v.rbegin());
+ ASSERT_TRUE(++it == v.rend());
+ for (auto it = v.rbegin(), e = v.rend(); it != e; ++it)
+ ASSERT_GT(*it, -1);
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/86732
More information about the libc-commits
mailing list