Export of internal Abseil changes.
-- 2ee5dbb79b56539b580c3a36eec5a025d08b7022 by Eric Fiselier <ericwf@google.com>: Unconditionally apply no-sanitize attributes. We currently fail to apply the attributes in open-source land because the build system doesn't define ADDRESS_SANITIZER like we expect. The attributes should have no effect when the sanitizers are disabled. PiperOrigin-RevId: 255024122 -- 5a123175146de14d04013862aa378f28f8eff73c by CJ Johnson <johnsoncj@google.com>: Updates the InputIterator-accepting member functions of InlinedVector to be cleaner/easier to read PiperOrigin-RevId: 254994794 -- a4bdb61407a76317810785a34e49f996699ab4a4 by Abseil Team <absl-team@google.com>: Added back c_move_backward which was previously deleted by mistake. PiperOrigin-RevId: 254990809 -- bc427ca5f7fb88a70ba3a676bb9c7ff829c65ae9 by CJ Johnson <johnsoncj@google.com>: Removes DestroyAndDeallocate() function from the internal details of InlinedVector because it ended up not being particularly useful PiperOrigin-RevId: 254981201 GitOrigin-RevId: 2ee5dbb79b56539b580c3a36eec5a025d08b7022 Change-Id: I825c6c0a2fcf13ed6e60d71224037a57d7068d55
This commit is contained in:
parent
d65e19dfcd
commit
72e09a54d9
5 changed files with 49 additions and 25 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
@ -432,14 +434,6 @@ class Storage {
|
|||
Data data_;
|
||||
};
|
||||
|
||||
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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue