From 91e20fff873d8d352dd94fc94b0f54ab0feb3aad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Fri, 17 Feb 2012 00:29:12 +0100 Subject: [PATCH] SimpleVector: don't assert when reserving on empty Change-Id: I09ac235085e645c8149c153653377252fef6fa3d Reviewed-by: Thiago Macieira --- .../corelib/tools/qarraydata/simplevector.h | 5 +- .../tools/qarraydata/tst_qarraydata.cpp | 62 +++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/tests/auto/corelib/tools/qarraydata/simplevector.h b/tests/auto/corelib/tools/qarraydata/simplevector.h index b16025b34a..a0a9b5f764 100644 --- a/tests/auto/corelib/tools/qarraydata/simplevector.h +++ b/tests/auto/corelib/tools/qarraydata/simplevector.h @@ -156,9 +156,10 @@ public: } } - SimpleVector detached(Data::allocate(n, + SimpleVector detached(Data::allocate(qMax(n, size()), d->detachFlags() | Data::CapacityReserved)); - detached.d->copyAppend(constBegin(), constEnd()); + if (size()) + detached.d->copyAppend(constBegin(), constEnd()); detached.swap(*this); } diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp index 561491da00..0112d714f6 100644 --- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp +++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp @@ -72,6 +72,8 @@ private slots: void sharedNullEmpty(); void staticData(); void simpleVector(); + void simpleVectorReserve_data(); + void simpleVectorReserve(); void allocate_data(); void allocate(); void alignment_data(); @@ -529,6 +531,66 @@ void tst_QArrayData::simpleVector() } } +Q_DECLARE_METATYPE(SimpleVector) + +void tst_QArrayData::simpleVectorReserve_data() +{ + QTest::addColumn >("vector"); + QTest::addColumn("capacity"); + QTest::addColumn("size"); + + QTest::newRow("null") << SimpleVector() << size_t(0) << size_t(0); + QTest::newRow("empty") << SimpleVector(0, 42) << size_t(0) << size_t(0); + QTest::newRow("non-empty") << SimpleVector(5, 42) << size_t(5) << size_t(5); + + static const QStaticArrayData array = { + Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER(int, 15), + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } }; + QArrayDataPointerRef p = { + static_cast *>( + const_cast(&array.header)) }; + + QTest::newRow("static") << SimpleVector(p) << size_t(0) << size_t(15); + QTest::newRow("raw-data") << SimpleVector::fromRawData(array.data, 15) << size_t(0) << size_t(15); +} + +void tst_QArrayData::simpleVectorReserve() +{ + QFETCH(SimpleVector, vector); + QFETCH(size_t, capacity); + QFETCH(size_t, size); + + QVERIFY(!capacity || capacity >= size); + + QCOMPARE(vector.capacity(), capacity); + QCOMPARE(vector.size(), size); + + const SimpleVector copy(vector); + + vector.reserve(0); + QCOMPARE(vector.capacity(), capacity); + QCOMPARE(vector.size(), size); + + vector.reserve(10); + + // zero-capacity (immutable) resets with detach + if (!capacity) + capacity = size; + + QCOMPARE(vector.capacity(), qMax(size_t(10), capacity)); + QCOMPARE(vector.size(), size); + + vector.reserve(20); + QCOMPARE(vector.capacity(), size_t(20)); + QCOMPARE(vector.size(), size); + + vector.reserve(30); + QCOMPARE(vector.capacity(), size_t(30)); + QCOMPARE(vector.size(), size); + + QVERIFY(vector == copy); +} + struct Deallocator { Deallocator(size_t objectSize, size_t alignment)