-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[libc][support][FixedVector] add reverse iterator #86732
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[libc][support][FixedVector] add reverse iterator #86732
Conversation
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
@llvm/pr-subscribers-libc Author: Nick Desaulniers (nickdesaulniers) ChangesCritically, we don't want to return an iterator to the end of the underlying 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:
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);
+}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overall LGTM
@@ -11,6 +11,8 @@ | |||
|
|||
#include "src/__support/CPP/array.h" | |||
|
|||
#include "src/__support/CPP/iterator.h" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
make sure to update the bazel.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done in 05c923c
✅ With the latest revision this PR passed the C/C++ code formatter. |
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