Export of internal Abseil changes.
-- c321829735accc2e6beb81e6a5a4421e5647b876 by CJ Johnson <johnsoncj@google.com>: Updates the definition of InlinedVector::swap(InlinedVector&) to be exception safe and adds exception safety tests PiperOrigin-RevId: 255511536 -- 0d86445891748efb09430eb9ede267b54185a246 by CJ Johnson <johnsoncj@google.com>: Updates the definition of InlinedVector::erase(...) to be exception safe and adds an exception safety test for it. PiperOrigin-RevId: 255492671 -- f07e8fa62dfe9eb0d025b27fca8c6db43c5a328f by CJ Johnson <johnsoncj@google.com>: Updates the implementation of InlinedVector::emplace_back(...) to be exception safe and adds exception safety tests PiperOrigin-RevId: 255422837 -- 4c3be92bfe4c1636a03cef8fd5aa802fed0d2c61 by Abseil Team <absl-team@google.com>: Internal Change PiperOrigin-RevId: 255422693 -- 6df38ea42f00678c357a539016163f8ac4c084e6 by Gennadiy Rozental <rogeeff@google.com>: Introduce public interfaces for setting and getting program usage messages. PiperOrigin-RevId: 255291467 -- 8f21d594aed3971d37db70226847c693eb548edb by Laramie Leavitt <lar@google.com>: Move absl/random's copy of ABSL_ATTRIBUTE_FORCE_INLINE and ABSL_ATTRIBUTE_NEVER_INLINE into .cc files and rename to prevent conflicts. https://github.com/abseil/abseil-cpp/issues/343 PiperOrigin-RevId: 255288599 -- 6b7430ad0c8bd860fb9394894f5eeedd1acc9f77 by CJ Johnson <johnsoncj@google.com>: Updates the ScopedAllocatorWorks test for InlinedVector to not rely on the byte count allocated by the standard library In doing so, removes LegacyNextCapacityFrom(...) impl function from InlinedVector Also applies clang-format to the test file PiperOrigin-RevId: 255207606 GitOrigin-RevId: c321829735accc2e6beb81e6a5a4421e5647b876 Change-Id: I7438211c36c4549fca2e866658f8d579c65d7d52
This commit is contained in:
parent
72e09a54d9
commit
c964fcffac
16 changed files with 518 additions and 367 deletions
|
@ -76,12 +76,9 @@ TYPED_TEST_SUITE_P(InstanceTest);
|
|||
// destroyed in the erase(begin, end) test.
|
||||
class RefCounted {
|
||||
public:
|
||||
RefCounted(int value, int* count) : value_(value), count_(count) {
|
||||
Ref();
|
||||
}
|
||||
RefCounted(int value, int* count) : value_(value), count_(count) { Ref(); }
|
||||
|
||||
RefCounted(const RefCounted& v)
|
||||
: value_(v.value_), count_(v.count_) {
|
||||
RefCounted(const RefCounted& v) : value_(v.value_), count_(v.count_) {
|
||||
Ref();
|
||||
}
|
||||
|
||||
|
@ -290,7 +287,7 @@ TEST(RefCountedVec, EraseBeginEnd) {
|
|||
}
|
||||
|
||||
// Check that the elements at the end are preserved.
|
||||
for (int i = erase_end; i< len; ++i) {
|
||||
for (int i = erase_end; i < len; ++i) {
|
||||
EXPECT_EQ(1, counts[i]);
|
||||
}
|
||||
}
|
||||
|
@ -552,10 +549,10 @@ TEST(IntVec, Resize) {
|
|||
static const int kResizeElem = 1000000;
|
||||
for (int k = 0; k < 10; k++) {
|
||||
// Enlarging resize
|
||||
v.resize(len+k, kResizeElem);
|
||||
EXPECT_EQ(len+k, v.size());
|
||||
EXPECT_LE(len+k, v.capacity());
|
||||
for (int i = 0; i < len+k; i++) {
|
||||
v.resize(len + k, kResizeElem);
|
||||
EXPECT_EQ(len + k, v.size());
|
||||
EXPECT_LE(len + k, v.capacity());
|
||||
for (int i = 0; i < len + k; i++) {
|
||||
if (i < len) {
|
||||
EXPECT_EQ(i, v[i]);
|
||||
} else {
|
||||
|
@ -866,7 +863,7 @@ TYPED_TEST_P(InstanceTest, Swap) {
|
|||
auto min_len = std::min(l1, l2);
|
||||
auto max_len = std::max(l1, l2);
|
||||
for (int i = 0; i < l1; i++) a.push_back(Instance(i));
|
||||
for (int i = 0; i < l2; i++) b.push_back(Instance(100+i));
|
||||
for (int i = 0; i < l2; i++) b.push_back(Instance(100 + i));
|
||||
EXPECT_EQ(tracker.instances(), l1 + l2);
|
||||
tracker.ResetCopiesMovesSwaps();
|
||||
{
|
||||
|
@ -934,7 +931,7 @@ TEST(IntVec, EqualAndNotEqual) {
|
|||
EXPECT_FALSE(a == b);
|
||||
EXPECT_TRUE(a != b);
|
||||
|
||||
b[i] = b[i] - 1; // Back to before
|
||||
b[i] = b[i] - 1; // Back to before
|
||||
EXPECT_TRUE(a == b);
|
||||
EXPECT_FALSE(a != b);
|
||||
}
|
||||
|
@ -1001,7 +998,7 @@ TYPED_TEST_P(InstanceTest, CountConstructorsDestructors) {
|
|||
|
||||
// reserve() must not increase the number of initialized objects
|
||||
SCOPED_TRACE("reserve");
|
||||
v.reserve(len+1000);
|
||||
v.reserve(len + 1000);
|
||||
EXPECT_EQ(tracker.instances(), len);
|
||||
EXPECT_EQ(tracker.copies() + tracker.moves(), len);
|
||||
|
||||
|
@ -1247,9 +1244,8 @@ void InstanceCountElemAssignWithAllocationTest() {
|
|||
absl::InlinedVector<Instance, 2> v(original_contents.begin(),
|
||||
original_contents.end());
|
||||
v.assign(3, Instance(123));
|
||||
EXPECT_THAT(v,
|
||||
AllOf(SizeIs(3),
|
||||
ElementsAre(ValueIs(123), ValueIs(123), ValueIs(123))));
|
||||
EXPECT_THAT(v, AllOf(SizeIs(3), ElementsAre(ValueIs(123), ValueIs(123),
|
||||
ValueIs(123))));
|
||||
EXPECT_LE(v.size(), v.capacity());
|
||||
}
|
||||
}
|
||||
|
@ -1528,8 +1524,8 @@ TYPED_TEST_P(InstanceTest, InitializerListAssign) {
|
|||
SCOPED_TRACE(original_size);
|
||||
absl::InlinedVector<Instance, 2> v(original_size, Instance(12345));
|
||||
v.assign({Instance(3), Instance(4), Instance(5)});
|
||||
EXPECT_THAT(v, AllOf(SizeIs(3),
|
||||
ElementsAre(ValueIs(3), ValueIs(4), ValueIs(5))));
|
||||
EXPECT_THAT(
|
||||
v, AllOf(SizeIs(3), ElementsAre(ValueIs(3), ValueIs(4), ValueIs(5))));
|
||||
EXPECT_LE(3, v.capacity());
|
||||
}
|
||||
}
|
||||
|
@ -1554,7 +1550,7 @@ TEST(DynamicVec, DynamicVecCompiles) {
|
|||
TEST(AllocatorSupportTest, Constructors) {
|
||||
using MyAlloc = CountingAllocator<int>;
|
||||
using AllocVec = absl::InlinedVector<int, 4, MyAlloc>;
|
||||
const int ia[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
|
||||
const int ia[] = {0, 1, 2, 3, 4, 5, 6, 7};
|
||||
int64_t allocated = 0;
|
||||
MyAlloc alloc(&allocated);
|
||||
{ AllocVec ABSL_ATTRIBUTE_UNUSED v; }
|
||||
|
@ -1570,7 +1566,7 @@ TEST(AllocatorSupportTest, Constructors) {
|
|||
TEST(AllocatorSupportTest, CountAllocations) {
|
||||
using MyAlloc = CountingAllocator<int>;
|
||||
using AllocVec = absl::InlinedVector<int, 4, MyAlloc>;
|
||||
const int ia[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
|
||||
const int ia[] = {0, 1, 2, 3, 4, 5, 6, 7};
|
||||
int64_t allocated = 0;
|
||||
MyAlloc alloc(&allocated);
|
||||
{
|
||||
|
@ -1634,8 +1630,8 @@ TEST(AllocatorSupportTest, SwapBothAllocated) {
|
|||
int64_t allocated1 = 0;
|
||||
int64_t allocated2 = 0;
|
||||
{
|
||||
const int ia1[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
|
||||
const int ia2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
|
||||
const int ia1[] = {0, 1, 2, 3, 4, 5, 6, 7};
|
||||
const int ia2[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
|
||||
MyAlloc a1(&allocated1);
|
||||
MyAlloc a2(&allocated2);
|
||||
AllocVec v1(ia1, ia1 + ABSL_ARRAYSIZE(ia1), a1);
|
||||
|
@ -1659,8 +1655,8 @@ TEST(AllocatorSupportTest, SwapOneAllocated) {
|
|||
int64_t allocated1 = 0;
|
||||
int64_t allocated2 = 0;
|
||||
{
|
||||
const int ia1[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
|
||||
const int ia2[] = { 0, 1, 2, 3 };
|
||||
const int ia1[] = {0, 1, 2, 3, 4, 5, 6, 7};
|
||||
const int ia2[] = {0, 1, 2, 3};
|
||||
MyAlloc a1(&allocated1);
|
||||
MyAlloc a2(&allocated2);
|
||||
AllocVec v1(ia1, ia1 + ABSL_ARRAYSIZE(ia1), a1);
|
||||
|
@ -1681,65 +1677,42 @@ TEST(AllocatorSupportTest, SwapOneAllocated) {
|
|||
|
||||
TEST(AllocatorSupportTest, ScopedAllocatorWorks) {
|
||||
using StdVector = std::vector<int, CountingAllocator<int>>;
|
||||
using MyAlloc =
|
||||
std::scoped_allocator_adaptor<CountingAllocator<StdVector>>;
|
||||
using AllocVec = absl::InlinedVector<StdVector, 4, MyAlloc>;
|
||||
using Alloc = CountingAllocator<StdVector>;
|
||||
using ScopedAlloc = std::scoped_allocator_adaptor<Alloc>;
|
||||
using AllocVec = absl::InlinedVector<StdVector, 1, ScopedAlloc>;
|
||||
|
||||
// MSVC 2017's std::vector allocates different amounts of memory in debug
|
||||
// versus opt mode.
|
||||
int64_t test_allocated = 0;
|
||||
StdVector v(CountingAllocator<int>{&test_allocated});
|
||||
// The amount of memory allocated by a default constructed vector<int>
|
||||
auto default_std_vec_allocated = test_allocated;
|
||||
v.push_back(1);
|
||||
// The amound of memory allocated by a copy-constructed vector<int> with one
|
||||
// element.
|
||||
int64_t one_element_std_vec_copy_allocated = test_allocated;
|
||||
{
|
||||
int64_t total_allocated_byte_count = 0;
|
||||
|
||||
int64_t allocated = 0;
|
||||
AllocVec vec(MyAlloc{CountingAllocator<StdVector>{&allocated}});
|
||||
EXPECT_EQ(allocated, 0);
|
||||
AllocVec inlined_case(ScopedAlloc(Alloc(+&total_allocated_byte_count)));
|
||||
inlined_case.emplace_back();
|
||||
|
||||
// This default constructs a vector<int>, but the allocator should pass itself
|
||||
// into the vector<int>, so check allocation compared to that.
|
||||
// The absl::InlinedVector does not allocate any memory.
|
||||
// The vector<int> may allocate any memory.
|
||||
auto expected = default_std_vec_allocated;
|
||||
vec.resize(1);
|
||||
EXPECT_EQ(allocated, expected);
|
||||
int64_t absl_responsible_for_count = total_allocated_byte_count;
|
||||
EXPECT_EQ(absl_responsible_for_count, 0);
|
||||
|
||||
// We make vector<int> allocate memory.
|
||||
// It must go through the allocator even though we didn't construct the
|
||||
// vector directly. This assumes that vec[0] doesn't need to grow its
|
||||
// allocation.
|
||||
expected += sizeof(int);
|
||||
vec[0].push_back(1);
|
||||
EXPECT_EQ(allocated, expected);
|
||||
inlined_case[0].emplace_back();
|
||||
EXPECT_GT(total_allocated_byte_count, absl_responsible_for_count);
|
||||
|
||||
// Another allocating vector.
|
||||
expected += one_element_std_vec_copy_allocated;
|
||||
vec.push_back(vec[0]);
|
||||
EXPECT_EQ(allocated, expected);
|
||||
inlined_case.clear();
|
||||
EXPECT_EQ(total_allocated_byte_count, 0);
|
||||
}
|
||||
|
||||
// Overflow the inlined memory.
|
||||
// The absl::InlinedVector will now allocate.
|
||||
expected += sizeof(StdVector) * 8 + default_std_vec_allocated * 3;
|
||||
vec.resize(5);
|
||||
EXPECT_EQ(allocated, expected);
|
||||
{
|
||||
int64_t total_allocated_byte_count = 0;
|
||||
|
||||
// Adding one more in external mode should also work.
|
||||
expected += one_element_std_vec_copy_allocated;
|
||||
vec.push_back(vec[0]);
|
||||
EXPECT_EQ(allocated, expected);
|
||||
AllocVec allocated_case(ScopedAlloc(Alloc(+&total_allocated_byte_count)));
|
||||
allocated_case.emplace_back();
|
||||
allocated_case.emplace_back();
|
||||
|
||||
// And extending these should still work. This assumes that vec[0] does not
|
||||
// need to grow its allocation.
|
||||
expected += sizeof(int);
|
||||
vec[0].push_back(1);
|
||||
EXPECT_EQ(allocated, expected);
|
||||
int64_t absl_responsible_for_count = total_allocated_byte_count;
|
||||
EXPECT_GT(absl_responsible_for_count, 0);
|
||||
|
||||
vec.clear();
|
||||
EXPECT_EQ(allocated, 0);
|
||||
allocated_case[1].emplace_back();
|
||||
EXPECT_GT(total_allocated_byte_count, absl_responsible_for_count);
|
||||
|
||||
allocated_case.clear();
|
||||
EXPECT_EQ(total_allocated_byte_count, 0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(AllocatorSupportTest, SizeAllocConstructor) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue