diff options
author | Mark D. Roth <roth@google.com> | 2018-01-23 14:25:50 -0800 |
---|---|---|
committer | Mark D. Roth <roth@google.com> | 2018-01-23 14:25:50 -0800 |
commit | 19688bf7a8b8b172faeba347d81d9b6cafecb874 (patch) | |
tree | 8890930585e93b1b134824a60092e3cde6719808 | |
parent | ac0808b107d73613191b66617a547a201871a845 (diff) |
Add clear() method for InlinedVector<>.
-rw-r--r-- | src/core/lib/gprpp/inlined_vector.h | 33 | ||||
-rw-r--r-- | test/core/gprpp/inlined_vector_test.cc | 22 |
2 files changed, 43 insertions, 12 deletions
diff --git a/src/core/lib/gprpp/inlined_vector.h b/src/core/lib/gprpp/inlined_vector.h index b78f85b893..55ba77debd 100644 --- a/src/core/lib/gprpp/inlined_vector.h +++ b/src/core/lib/gprpp/inlined_vector.h @@ -46,18 +46,7 @@ template <typename T, size_t N> class InlinedVector { public: InlinedVector() {} - ~InlinedVector() { - for (size_t i = 0; i < size_ && i < N; ++i) { - T& value = *reinterpret_cast<T*>(inline_ + i); - value.~T(); - } - if (size_ > N) { // Avoid subtracting two signed values. - for (size_t i = 0; i < size_ - N; ++i) { - dynamic_[i].~T(); - } - } - gpr_free(dynamic_); - } + ~InlinedVector() { destroy_elements(); } // For now, we do not support copying. InlinedVector(const InlinedVector&) = delete; @@ -100,7 +89,27 @@ class InlinedVector { size_t size() const { return size_; } + void clear() { + destroy_elements(); + dynamic_ = nullptr; + size_ = 0; + dynamic_capacity_ = 0; + } + private: + void destroy_elements() { + for (size_t i = 0; i < size_ && i < N; ++i) { + T& value = *reinterpret_cast<T*>(inline_ + i); + value.~T(); + } + if (size_ > N) { // Avoid subtracting two signed values. + for (size_t i = 0; i < size_ - N; ++i) { + dynamic_[i].~T(); + } + } + gpr_free(dynamic_); + } + typename std::aligned_storage<sizeof(T)>::type inline_[N]; T* dynamic_ = nullptr; size_t size_ = 0; diff --git a/test/core/gprpp/inlined_vector_test.cc b/test/core/gprpp/inlined_vector_test.cc index 0e712dafe4..8def67f9e3 100644 --- a/test/core/gprpp/inlined_vector_test.cc +++ b/test/core/gprpp/inlined_vector_test.cc @@ -64,6 +64,28 @@ TEST(InlinedVectorTest, EmplaceBack) { EXPECT_EQ(3, *v[0]); } +TEST(InlinedVectorTest, ClearAndRepopulate) { + const int kNumElements = 10; + InlinedVector<int, 5> v; + EXPECT_EQ(0, v.size()); + for (int i = 0; i < kNumElements; ++i) { + v.push_back(i); + EXPECT_EQ(i + 1, v.size()); + } + for (int i = 0; i < kNumElements; ++i) { + EXPECT_EQ(i, v[i]); + } + v.clear(); + EXPECT_EQ(0, v.size()); + for (int i = 0; i < kNumElements; ++i) { + v.push_back(kNumElements + i); + EXPECT_EQ(i + 1, v.size()); + } + for (int i = 0; i < kNumElements; ++i) { + EXPECT_EQ(kNumElements + i, v[i]); + } +} + } // namespace testing } // namespace grpc_core |