From 19688bf7a8b8b172faeba347d81d9b6cafecb874 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 23 Jan 2018 14:25:50 -0800 Subject: Add clear() method for InlinedVector<>. --- src/core/lib/gprpp/inlined_vector.h | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'src') 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 class InlinedVector { public: InlinedVector() {} - ~InlinedVector() { - for (size_t i = 0; i < size_ && i < N; ++i) { - T& value = *reinterpret_cast(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(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::type inline_[N]; T* dynamic_ = nullptr; size_t size_ = 0; -- cgit v1.2.3 From 9ab4d0c82699064efebd8a15eebf66e3db8bf256 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 23 Jan 2018 14:57:11 -0800 Subject: Add const version of operator[]. --- src/core/lib/gprpp/inlined_vector.h | 9 +++++++++ test/core/gprpp/inlined_vector_test.cc | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) (limited to 'src') diff --git a/src/core/lib/gprpp/inlined_vector.h b/src/core/lib/gprpp/inlined_vector.h index 55ba77debd..8044c682d1 100644 --- a/src/core/lib/gprpp/inlined_vector.h +++ b/src/core/lib/gprpp/inlined_vector.h @@ -61,6 +61,15 @@ class InlinedVector { } } + const T& operator[](size_t offset) const { + assert(offset < size_); + if (offset < N) { + return *reinterpret_cast(inline_ + offset); + } else { + return dynamic_[offset - N]; + } + } + template void emplace_back(Args&&... args) { if (size_ < N) { diff --git a/test/core/gprpp/inlined_vector_test.cc b/test/core/gprpp/inlined_vector_test.cc index 8def67f9e3..83b21b80f8 100644 --- a/test/core/gprpp/inlined_vector_test.cc +++ b/test/core/gprpp/inlined_vector_test.cc @@ -86,6 +86,22 @@ TEST(InlinedVectorTest, ClearAndRepopulate) { } } +TEST(InlinedVectorTest, ConstIndexOperator) { + const int kNumElements = 10; + InlinedVector v; + EXPECT_EQ(0, v.size()); + for (int i = 0; i < kNumElements; ++i) { + v.push_back(i); + EXPECT_EQ(i + 1, v.size()); + } + auto const_func = [kNumElements](const InlinedVector& v) { + for (int i = 0; i < kNumElements; ++i) { + EXPECT_EQ(i, v[i]); + } + }; + const_func(v); +} + } // namespace testing } // namespace grpc_core -- cgit v1.2.3 From 10f38f5a3374f418ef1249f38cb33e77e2e7ed46 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 24 Jan 2018 08:01:53 -0800 Subject: Initialize data members in a single place. --- src/core/lib/gprpp/inlined_vector.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/core/lib/gprpp/inlined_vector.h b/src/core/lib/gprpp/inlined_vector.h index 8044c682d1..2ced3d74b8 100644 --- a/src/core/lib/gprpp/inlined_vector.h +++ b/src/core/lib/gprpp/inlined_vector.h @@ -40,12 +40,12 @@ namespace grpc_core { // ANY METHOD ADDED HERE MUST COMPLY WITH THE INTERFACE IN THE absl // IMPLEMENTATION! // -// TODO(ctiller, nnoble, roth): Replace this with absl::InlinedVector -// once we integrate absl into the gRPC build system in a usable way. +// TODO(nnoble, roth): Replace this with absl::InlinedVector once we +// integrate absl into the gRPC build system in a usable way. template class InlinedVector { public: - InlinedVector() {} + InlinedVector() { init_data(); } ~InlinedVector() { destroy_elements(); } // For now, we do not support copying. @@ -100,12 +100,16 @@ class InlinedVector { void clear() { destroy_elements(); + init_data(); + } + + private: + void init_data() { 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(inline_ + i); @@ -120,9 +124,9 @@ class InlinedVector { } typename std::aligned_storage::type inline_[N]; - T* dynamic_ = nullptr; - size_t size_ = 0; - size_t dynamic_capacity_ = 0; + T* dynamic_; + size_t size_; + size_t dynamic_capacity_; }; } // namespace grpc_core -- cgit v1.2.3