summaryrefslogtreecommitdiff
path: root/absl/container/inlined_vector.h
diff options
context:
space:
mode:
Diffstat (limited to 'absl/container/inlined_vector.h')
-rw-r--r--absl/container/inlined_vector.h20
1 files changed, 12 insertions, 8 deletions
diff --git a/absl/container/inlined_vector.h b/absl/container/inlined_vector.h
index 16865272..61e0cfb4 100644
--- a/absl/container/inlined_vector.h
+++ b/absl/container/inlined_vector.h
@@ -784,16 +784,20 @@ class InlinedVector {
// Destroys all elements in the inlined vector, sets the size of `0` and
// deallocates the heap allocation if the inlined vector was allocated.
void clear() noexcept {
- size_type s = size();
- if (storage_.GetIsAllocated()) {
- Destroy(storage_.GetAllocatedData(), storage_.GetAllocatedData() + s);
- AllocatorTraits::deallocate(storage_.GetAllocator(),
- storage_.GetAllocatedData(),
+ const bool is_allocated = storage_.GetIsAllocated();
+
+ pointer the_data =
+ is_allocated ? storage_.GetAllocatedData() : storage_.GetInlinedData();
+
+ inlined_vector_internal::DestroyElements(storage_.GetAllocator(), the_data,
+ storage_.GetSize());
+
+ if (is_allocated) {
+ AllocatorTraits::deallocate(storage_.GetAllocator(), the_data,
storage_.GetAllocatedCapacity());
- } else if (s != 0) { // do nothing for empty vectors
- Destroy(storage_.GetInlinedData(), storage_.GetInlinedData() + s);
}
- storage_.SetInlinedSize(0);
+
+ storage_.SetInlinedSize(/* size = */ 0);
}
// `InlinedVector::reserve()`