From 51048e1f31df5be45e71a75fc535111dd36c4c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Thu, 24 Nov 2011 17:22:37 +0100 Subject: Adding detach to QArrayDataPointer Detaching operations added to SimpleVector Change-Id: I5f549582cf579569f08cb8d53a6d12fe32b862e6 Reviewed-by: Bradley T. Hughes Reviewed-by: Thiago Macieira --- tests/auto/corelib/tools/qarraydata/simplevector.h | 25 +++++++++++++++ .../corelib/tools/qarraydata/tst_qarraydata.cpp | 37 ++++++++++++++++++---- 2 files changed, 56 insertions(+), 6 deletions(-) (limited to 'tests/auto/corelib/tools/qarraydata') diff --git a/tests/auto/corelib/tools/qarraydata/simplevector.h b/tests/auto/corelib/tools/qarraydata/simplevector.h index c5e19f3c55..9ab28a9ddd 100644 --- a/tests/auto/corelib/tools/qarraydata/simplevector.h +++ b/tests/auto/corelib/tools/qarraydata/simplevector.h @@ -93,15 +93,35 @@ public: size_t size() const { return d->size; } size_t capacity() const { return d->alloc; } + iterator begin() { detach(); return d->begin(); } + iterator end() { detach(); return d->end(); } + const_iterator begin() const { return d->begin(); } const_iterator end() const { return d->end(); } const_iterator constBegin() const { return begin(); } const_iterator constEnd() const { return end(); } + T &operator[](size_t i) { Q_ASSERT(i < size_t(d->size)); detach(); return begin()[i]; } + T &at(size_t i) { Q_ASSERT(i < size_t(d->size)); detach(); return begin()[i]; } + const T &operator[](size_t i) const { Q_ASSERT(i < size_t(d->size)); return begin()[i]; } const T &at(size_t i) const { Q_ASSERT(i < size_t(d->size)); return begin()[i]; } + T &front() + { + Q_ASSERT(!isEmpty()); + detach(); + return *begin(); + } + + T &back() + { + Q_ASSERT(!isEmpty()); + detach(); + return *(end() - 1); + } + const T &front() const { Q_ASSERT(!isEmpty()); @@ -231,6 +251,11 @@ public: d.clear(); } + void detach() + { + d.detach(); + } + private: QArrayDataPointer d; }; diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp index 63a26ed926..e9a3218331 100644 --- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp +++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp @@ -81,6 +81,8 @@ private slots: void arrayOps(); }; +template const T &const_(const T &t) { return t; } + void tst_QArrayData::referenceCounting() { { @@ -320,13 +322,36 @@ void tst_QArrayData::simpleVector() QVERIFY(v6 >= v1); QVERIFY(!(v1 >= v6)); - QCOMPARE(v6.front(), 0); - QCOMPARE(v6.back(), 6); + { + SimpleVector temp(v6); + + QCOMPARE(const_(v6).front(), 0); + QCOMPARE(const_(v6).back(), 6); + + QVERIFY(temp.isShared()); + QVERIFY(temp.isSharedWith(v6)); + + QCOMPARE(temp.front(), 0); + QCOMPARE(temp.back(), 6); + + // Detached + QVERIFY(!temp.isShared()); + const int *const tempBegin = temp.begin(); + + for (size_t i = 0; i < v6.size(); ++i) { + QCOMPARE(const_(v6)[i], int(i)); + QCOMPARE(const_(v6).at(i), int(i)); + QCOMPARE(&const_(v6)[i], &const_(v6).at(i)); + + QCOMPARE(const_(v8)[i], const_(v6)[i]); + + QCOMPARE(temp[i], int(i)); + QCOMPARE(temp.at(i), int(i)); + QCOMPARE(&temp[i], &temp.at(i)); + } - for (size_t i = 0; i < v6.size(); ++i) { - QCOMPARE(v6[i], int(i)); - QCOMPARE(v6.at(i), int(i)); - QCOMPARE(&v6[i], &v6.at(i)); + // A single detach should do + QCOMPARE(temp.begin(), tempBegin); } { -- cgit v1.2.3