Export of internal Abseil changes.
-- 2f187776e55fe7741882d64aa4fb04d361dcd1da by Shaindel Schwartz <shaindel@google.com>: Fix spaces. PiperOrigin-RevId: 254880665 -- 50a2c390c1e56bec574e9418a6d0c5765f2e1d56 by CJ Johnson <johnsoncj@google.com>: Fixes a ubsan violation bug report: https://github.com/abseil/abseil-cpp/issues/337 PiperOrigin-RevId: 254846112 -- 563fee16ee0ac32a93292c3b2d1cf9543bad4758 by CJ Johnson <johnsoncj@google.com>: In the InlinedVector copy-assignment operator, substitutes-in a call to DeallocateIfAllocated() (which was not previously available) PiperOrigin-RevId: 254835012 -- d07f4d91b43242c5e8bd90f1e93f55f7972eed04 by Shaindel Schwartz <shaindel@google.com>: #336 PiperOrigin-RevId: 254833534 -- 1ad0fe00169a794176605a897f15fad8625339bd by Shaindel Schwartz <shaindel@google.com>: #335 PiperOrigin-RevId: 254826748 -- 436a29591c60c6ac9bb7b98e4906c0a7466611c1 by Shaindel Schwartz <shaindel@google.com>: Import of CCTZ from GitHub. PiperOrigin-RevId: 254820333 -- e782a5387a750319eb6ed5d9927ec2463bd68ebb by CJ Johnson <johnsoncj@google.com>: Updates the definition of InlinedVector::resize(...) to be exception safe and adds exception safety tests PiperOrigin-RevId: 254818993 -- 6d2f8538fb06a09af47232d86b32dfc020b62133 by CJ Johnson <johnsoncj@google.com>: Removes unnecessary transaction object from the implementation of InlinedVector::reserve(n) PiperOrigin-RevId: 254804166 -- 9a3a806702679a7442837089469cf171194da776 by Abseil Team <absl-team@google.com>: Internal Change. PiperOrigin-RevId: 254489023 -- ded1463ef81f3257645becc6be58df3b433ea21f by CJ Johnson <johnsoncj@google.com>: Updates the definition of InlinedVector::reserve(size_type) to be exception safe and adds exception safety tests PiperOrigin-RevId: 254463057 GitOrigin-RevId: 2f187776e55fe7741882d64aa4fb04d361dcd1da Change-Id: Id41fc5a62c8d71021e803721ecdbfb3ce60ef574
This commit is contained in:
parent
5162fc83d2
commit
d65e19dfcd
11 changed files with 232 additions and 92 deletions
|
|
@ -467,11 +467,7 @@ class InlinedVector {
|
|||
if (IsMemcpyOk::value || other.storage_.GetIsAllocated()) {
|
||||
inlined_vector_internal::DestroyElements(storage_.GetAllocPtr(), data(),
|
||||
size());
|
||||
if (storage_.GetIsAllocated()) {
|
||||
AllocatorTraits::deallocate(*storage_.GetAllocPtr(),
|
||||
storage_.GetAllocatedData(),
|
||||
storage_.GetAllocatedCapacity());
|
||||
}
|
||||
storage_.DeallocateIfAllocated();
|
||||
storage_.MemcpyFrom(other.storage_);
|
||||
other.storage_.SetInlinedSize(0);
|
||||
} else {
|
||||
|
|
@ -525,49 +521,13 @@ class InlinedVector {
|
|||
// Resizes the inlined vector to contain `n` elements. If `n` is smaller than
|
||||
// the inlined vector's current size, extra elements are destroyed. If `n` is
|
||||
// larger than the initial size, new elements are value-initialized.
|
||||
void resize(size_type n) {
|
||||
size_type s = size();
|
||||
if (n < s) {
|
||||
erase(begin() + n, end());
|
||||
return;
|
||||
}
|
||||
reserve(n);
|
||||
assert(capacity() >= n);
|
||||
|
||||
// Fill new space with elements constructed in-place.
|
||||
if (storage_.GetIsAllocated()) {
|
||||
UninitializedFill(storage_.GetAllocatedData() + s,
|
||||
storage_.GetAllocatedData() + n);
|
||||
storage_.SetAllocatedSize(n);
|
||||
} else {
|
||||
UninitializedFill(storage_.GetInlinedData() + s,
|
||||
storage_.GetInlinedData() + n);
|
||||
storage_.SetInlinedSize(n);
|
||||
}
|
||||
}
|
||||
void resize(size_type n) { storage_.Resize(DefaultValueAdapter(), n); }
|
||||
|
||||
// Overload of `InlinedVector::resize()` to resize the inlined vector to
|
||||
// contain `n` elements where, if `n` is larger than `size()`, the new values
|
||||
// will be copy-constructed from `v`.
|
||||
void resize(size_type n, const_reference v) {
|
||||
size_type s = size();
|
||||
if (n < s) {
|
||||
erase(begin() + n, end());
|
||||
return;
|
||||
}
|
||||
reserve(n);
|
||||
assert(capacity() >= n);
|
||||
|
||||
// Fill new space with copies of `v`.
|
||||
if (storage_.GetIsAllocated()) {
|
||||
UninitializedFill(storage_.GetAllocatedData() + s,
|
||||
storage_.GetAllocatedData() + n, v);
|
||||
storage_.SetAllocatedSize(n);
|
||||
} else {
|
||||
UninitializedFill(storage_.GetInlinedData() + s,
|
||||
storage_.GetInlinedData() + n, v);
|
||||
storage_.SetInlinedSize(n);
|
||||
}
|
||||
storage_.Resize(CopyValueAdapter(v), n);
|
||||
}
|
||||
|
||||
// `InlinedVector::insert()`
|
||||
|
|
@ -784,22 +744,7 @@ class InlinedVector {
|
|||
// NOTE: If `n` does not exceed `capacity()`, `reserve()` will have no
|
||||
// effects. Otherwise, `reserve()` will reallocate, performing an n-time
|
||||
// element-wise move of everything contained.
|
||||
void reserve(size_type n) {
|
||||
if (n <= capacity()) {
|
||||
return;
|
||||
}
|
||||
const size_type s = size();
|
||||
size_type target = (std::max)(static_cast<size_type>(N), n);
|
||||
size_type new_capacity = capacity();
|
||||
while (new_capacity < target) {
|
||||
new_capacity <<= 1;
|
||||
}
|
||||
pointer new_data =
|
||||
AllocatorTraits::allocate(*storage_.GetAllocPtr(), new_capacity);
|
||||
UninitializedCopy(std::make_move_iterator(data()),
|
||||
std::make_move_iterator(data() + s), new_data);
|
||||
ResetAllocation(new_data, new_capacity, s);
|
||||
}
|
||||
void reserve(size_type n) { storage_.Reserve(n); }
|
||||
|
||||
// `InlinedVector::shrink_to_fit()`
|
||||
//
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue