diff options
Diffstat (limited to 'absl/container')
-rw-r--r-- | absl/container/inlined_vector.h | 29 | ||||
-rw-r--r-- | absl/container/internal/inlined_vector.h | 16 |
2 files changed, 23 insertions, 22 deletions
diff --git a/absl/container/inlined_vector.h b/absl/container/inlined_vector.h index 784b07f446a5..e67885c2fc5d 100644 --- a/absl/container/inlined_vector.h +++ b/absl/container/inlined_vector.h @@ -507,12 +507,13 @@ class InlinedVector { template <typename InputIterator, DisableIfAtLeastForwardIterator<InputIterator>* = nullptr> void assign(InputIterator first, InputIterator last) { - size_type assign_index = 0; - for (; (assign_index < size()) && (first != last); - static_cast<void>(++assign_index), static_cast<void>(++first)) { - *(data() + assign_index) = *first; + size_type i = 0; + for (; i < size() && first != last; ++i, static_cast<void>(++first)) { + at(i) = *first; } - erase(data() + assign_index, data() + size()); + + erase(data() + i, data() + size()); + std::copy(first, last, std::back_inserter(*this)); } @@ -595,12 +596,15 @@ class InlinedVector { template <typename InputIterator, DisableIfAtLeastForwardIterator<InputIterator>* = nullptr> iterator insert(const_iterator pos, InputIterator first, InputIterator last) { - size_type initial_insert_index = std::distance(cbegin(), pos); - for (size_type insert_index = initial_insert_index; first != last; - static_cast<void>(++insert_index), static_cast<void>(++first)) { - insert(data() + insert_index, *first); + assert(pos >= begin()); + assert(pos <= end()); + + size_type index = std::distance(cbegin(), pos); + for (size_type i = index; first != last; ++i, static_cast<void>(++first)) { + insert(data() + i, *first); } - return iterator(data() + initial_insert_index); + + return iterator(data() + index); } // `InlinedVector::emplace()` @@ -677,6 +681,7 @@ class InlinedVector { // by `1` (unless the inlined vector is empty, in which case this is a no-op). void pop_back() noexcept { assert(!empty()); + AllocatorTraits::destroy(*storage_.GetAllocPtr(), data() + (size() - 1)); storage_.SubtractSize(1); } @@ -731,7 +736,9 @@ 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 { - storage_.DestroyAndDeallocate(); + inlined_vector_internal::DestroyElements(storage_.GetAllocPtr(), data(), + size()); + storage_.DeallocateIfAllocated(); storage_.SetInlinedSize(0); } diff --git a/absl/container/internal/inlined_vector.h b/absl/container/internal/inlined_vector.h index a84b5255a82e..c2802c823a8d 100644 --- a/absl/container/internal/inlined_vector.h +++ b/absl/container/internal/inlined_vector.h @@ -275,7 +275,11 @@ class Storage { explicit Storage(const allocator_type& alloc) : metadata_(alloc, /* empty and inlined */ 0) {} - ~Storage() { DestroyAndDeallocate(); } + ~Storage() { + pointer data = GetIsAllocated() ? GetAllocatedData() : GetInlinedData(); + inlined_vector_internal::DestroyElements(GetAllocPtr(), data, GetSize()); + DeallocateIfAllocated(); + } size_type GetSize() const { return GetSizeAndIsAllocated() >> 1; } @@ -377,8 +381,6 @@ class Storage { data_ = other_storage.data_; } - void DestroyAndDeallocate(); - template <typename ValueAdapter> void Initialize(ValueAdapter values, size_type new_size); @@ -433,14 +435,6 @@ class Storage { }; template <typename T, size_t N, typename A> -void Storage<T, N, A>::DestroyAndDeallocate() { - inlined_vector_internal::DestroyElements( - GetAllocPtr(), (GetIsAllocated() ? GetAllocatedData() : GetInlinedData()), - GetSize()); - DeallocateIfAllocated(); -} - -template <typename T, size_t N, typename A> template <typename ValueAdapter> auto Storage<T, N, A>::Initialize(ValueAdapter values, size_type new_size) -> void { |