summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/tools/qarraydata
diff options
context:
space:
mode:
authorJoão Abecasis <joao.abecasis@nokia.com>2012-02-16 23:27:44 +0100
committerQt by Nokia <qt-info@nokia.com>2012-04-02 16:34:21 +0200
commit15e3ae6b9da9b32236d3e3348ede86c3acf06fb4 (patch)
tree20e674797a075c94b1319a0547233595b26fa34d /tests/auto/corelib/tools/qarraydata
parent8c413f3eff2de761ae038294195831de753b9252 (diff)
Introduce QArrayDataOps::truncate
This enables a truncating resize() to be implemented. It is similar to destroyAll(), but updates the size() as it goes, so it is safe to use outside a container's destructor (and doesn't necessarily destroy all elements). The appendInitialize test was repurposed and now doubles as an additional test for QArrayDataOps as well as exercising SimpleVector's resize(). Change-Id: Iee94a685c9ea436c6af5b1b77486734a38c49ca1 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests/auto/corelib/tools/qarraydata')
-rw-r--r--tests/auto/corelib/tools/qarraydata/simplevector.h30
-rw-r--r--tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp67
2 files changed, 95 insertions, 2 deletions
diff --git a/tests/auto/corelib/tools/qarraydata/simplevector.h b/tests/auto/corelib/tools/qarraydata/simplevector.h
index 54c9fae589..641516e0d0 100644
--- a/tests/auto/corelib/tools/qarraydata/simplevector.h
+++ b/tests/auto/corelib/tools/qarraydata/simplevector.h
@@ -170,6 +170,36 @@ public:
detached.swap(*this);
}
+ void resize(size_t newSize)
+ {
+ if (size() == newSize)
+ return;
+
+ if (d->ref.isShared() || newSize > capacity()) {
+ SimpleVector detached(Data::allocate(
+ d->detachCapacity(newSize), d->detachFlags()));
+ if (newSize) {
+ if (newSize < size()) {
+ const T *const begin = constBegin();
+ detached.d->copyAppend(begin, begin + newSize);
+ } else {
+ if (size()) {
+ const T *const begin = constBegin();
+ detached.d->copyAppend(begin, begin + size());
+ }
+ detached.d->appendInitialize(newSize);
+ }
+ }
+ detached.swap(*this);
+ return;
+ }
+
+ if (newSize > size())
+ d->appendInitialize(newSize);
+ else
+ d->truncate(newSize);
+ }
+
void prepend(const_iterator first, const_iterator last)
{
if (!d->size) {
diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp
index b3b8040b1c..53217b2222 100644
--- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp
+++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp
@@ -81,7 +81,7 @@ private slots:
void typedData();
void gccBug43247();
void arrayOps();
- void appendInitialize();
+ void arrayOps2();
void setSharable_data();
void setSharable();
void fromRawData();
@@ -1115,7 +1115,7 @@ void tst_QArrayData::arrayOps()
}
}
-void tst_QArrayData::appendInitialize()
+void tst_QArrayData::arrayOps2()
{
CountedObject::LeakChecker leakChecker; Q_UNUSED(leakChecker)
@@ -1137,6 +1137,69 @@ void tst_QArrayData::appendInitialize()
QCOMPARE(vo[i].id, i);
QCOMPARE(int(vo[i].flags), int(CountedObject::DefaultConstructed));
}
+
+ ////////////////////////////////////////////////////////////////////////////
+ // appendInitialize, again
+
+ // These will detach
+ vi.resize(10);
+ vs.resize(10);
+ vo.resize(10);
+
+ QCOMPARE(vi.size(), size_t(10));
+ QCOMPARE(vs.size(), size_t(10));
+ QCOMPARE(vo.size(), size_t(10));
+
+ QCOMPARE(CountedObject::liveCount, size_t(10));
+ for (size_t i = 0; i < 5; ++i) {
+ QCOMPARE(vi[i], 0);
+ QVERIFY(vs[i].isNull());
+
+ QCOMPARE(vo[i].id, i);
+ QCOMPARE(int(vo[i].flags), CountedObject::DefaultConstructed
+ | CountedObject::CopyConstructed);
+ }
+
+ for (size_t i = 5; i < 10; ++i) {
+ QCOMPARE(vi[i], 0);
+ QVERIFY(vs[i].isNull());
+
+ QCOMPARE(vo[i].id, i + 5);
+ QCOMPARE(int(vo[i].flags), int(CountedObject::DefaultConstructed));
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ // truncate
+ QVERIFY(!vi.isShared());
+ QVERIFY(!vs.isShared());
+ QVERIFY(!vo.isShared());
+
+ // These shouldn't detach
+ vi.resize(7);
+ vs.resize(7);
+ vo.resize(7);
+
+ QCOMPARE(vi.size(), size_t(7));
+ QCOMPARE(vs.size(), size_t(7));
+ QCOMPARE(vo.size(), size_t(7));
+
+ QCOMPARE(CountedObject::liveCount, size_t(7));
+ for (size_t i = 0; i < 5; ++i) {
+ QCOMPARE(vi[i], 0);
+ QVERIFY(vs[i].isNull());
+
+ QCOMPARE(vo[i].id, i);
+ QCOMPARE(int(vo[i].flags), CountedObject::DefaultConstructed
+ | CountedObject::CopyConstructed);
+ }
+
+ for (size_t i = 5; i < 7; ++i) {
+ QCOMPARE(vi[i], 0);
+ QVERIFY(vs[i].isNull());
+
+ QCOMPARE(vo[i].id, i + 5);
+ QCOMPARE(int(vo[i].flags), int(CountedObject::DefaultConstructed));
+ }
}
Q_DECLARE_METATYPE(QArrayDataPointer<int>)