From a5306c35d1cf1e471e2a073aa1ba279081ea47ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Wed, 24 Jun 2015 14:34:45 +0100 Subject: QList: Introduce constFirst() and constEnd() Allows to easily prevent detaching in common code like: getList().first() [ChangeLog][QtCore][QList] Added the convenience constFirst and constLast functions. Task-number: QTBUG-46026 Change-Id: I51ecb51fe91fc7d993ad35b5c7392f4da88e5f7b Reviewed-by: Thiago Macieira --- src/corelib/tools/qlist.cpp | 24 ++++- src/corelib/tools/qlist.h | 2 + tests/auto/corelib/tools/qlist/tst_qlist.cpp | 136 +++++++++++++++++++++++++++ 3 files changed, 160 insertions(+), 2 deletions(-) diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp index f4901d336e..d774548d3a 100644 --- a/src/corelib/tools/qlist.cpp +++ b/src/corelib/tools/qlist.cpp @@ -1227,7 +1227,7 @@ void **QListData::erase(void **xi) not be empty. If the list can be empty, call isEmpty() before calling this function. - \sa last(), isEmpty() + \sa constFirst(), last(), isEmpty() */ /*! \fn const T& QList::first() const @@ -1235,13 +1235,23 @@ void **QListData::erase(void **xi) \overload */ +/*! \fn const T& QList::constFirst() const + \since 5.6 + + Returns a const reference to the first item in the list. The list must + not be empty. If the list can be empty, call isEmpty() before + calling this function. + + \sa constLast(), isEmpty(), first() +*/ + /*! \fn T& QList::last() Returns a reference to the last item in the list. The list must not be empty. If the list can be empty, call isEmpty() before calling this function. - \sa first(), isEmpty() + \sa constLast(), first(), isEmpty() */ /*! \fn const T& QList::last() const @@ -1249,6 +1259,16 @@ void **QListData::erase(void **xi) \overload */ +/*! \fn const T& QList::constLast() const + \since 5.6 + + Returns a reference to the last item in the list. The list must + not be empty. If the list can be empty, call isEmpty() before + calling this function. + + \sa constFirst(), isEmpty(), last() +*/ + /*! \fn void QList::removeFirst() Removes the first item in the list. Calling this function is diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index e446a6625b..ac46dc3244 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -331,9 +331,11 @@ public: inline int count() const { return p.size(); } inline int length() const { return p.size(); } // Same as count() inline T& first() { Q_ASSERT(!isEmpty()); return *begin(); } + inline const T& constFirst() const { return first(); } inline const T& first() const { Q_ASSERT(!isEmpty()); return at(0); } T& last() { Q_ASSERT(!isEmpty()); return *(--end()); } const T& last() const { Q_ASSERT(!isEmpty()); return at(count() - 1); } + inline const T& constLast() const { return last(); } inline void removeFirst() { Q_ASSERT(!isEmpty()); erase(begin()); } inline void removeLast() { Q_ASSERT(!isEmpty()); erase(--end()); } inline bool startsWith(const T &t) const { return !isEmpty() && first() == t; } diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp index dd9371fbe1..9ae69c2f61 100644 --- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp +++ b/tests/auto/corelib/tools/qlist/tst_qlist.cpp @@ -313,6 +313,8 @@ private slots: void lastOptimal() const; void lastMovable() const; void lastComplex() const; + void constFirst() const; + void constLast() const; void beginOptimal() const; void beginMovable() const; void beginComplex() const; @@ -729,6 +731,140 @@ void tst_QList::firstComplex() const QCOMPARE(liveCount, Complex::getLiveCount()); } +void tst_QList::constFirst() const +{ + // Based on tst_QVector::constFirst() + QList list; + list << 69 << 42 << 3; + + // test it starts ok + QCOMPARE(list.constFirst(), 69); + QVERIFY(list.isDetached()); + + QList listCopy = list; + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); + + QCOMPARE(list.constFirst(), 69); + QCOMPARE(listCopy.constFirst(), 69); + + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); + + // test removal changes + list.removeAt(0); + QVERIFY(list.isDetached()); + QVERIFY(!list.isSharedWith(listCopy)); + QCOMPARE(list.constFirst(), 42); + QCOMPARE(listCopy.constFirst(), 69); + + listCopy = list; + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); + + QCOMPARE(list.constFirst(), 42); + QCOMPARE(listCopy.constFirst(), 42); + + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); + + // test prepend changes + list.prepend(23); + QVERIFY(list.isDetached()); + QVERIFY(!list.isSharedWith(listCopy)); + QCOMPARE(list.constFirst(), 23); + QCOMPARE(listCopy.constFirst(), 42); + + listCopy = list; + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); + + QCOMPARE(list.constFirst(), 23); + QCOMPARE(listCopy.constFirst(), 23); + + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); +} + +void tst_QList::constLast() const +{ + // Based on tst_QVector::constLast() + QList list; + list << 69 << 42 << 3; + + // test it starts ok + QCOMPARE(list.constLast(), 3); + QVERIFY(list.isDetached()); + + QList listCopy = list; + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); + + QCOMPARE(list.constLast(), 3); + QCOMPARE(listCopy.constLast(), 3); + + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); + + // test removal changes + list.removeLast(); + QVERIFY(list.isDetached()); + QVERIFY(!list.isSharedWith(listCopy)); + QCOMPARE(list.constLast(), 42); + QCOMPARE(listCopy.constLast(), 3); + + listCopy = list; + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); + + QCOMPARE(list.constLast(), 42); + QCOMPARE(listCopy.constLast(), 42); + + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); + + // test prepend changes + list.append(23); + QVERIFY(list.isDetached()); + QVERIFY(!list.isSharedWith(listCopy)); + QCOMPARE(list.constLast(), 23); + QCOMPARE(listCopy.constLast(), 42); + + listCopy = list; + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); + + QCOMPARE(list.constLast(), 23); + QCOMPARE(listCopy.constLast(), 23); + + QVERIFY(!list.isDetached()); + QVERIFY(!listCopy.isDetached()); + QVERIFY(list.isSharedWith(listCopy)); + QVERIFY(listCopy.isSharedWith(list)); +} + template void tst_QList::last() const { -- cgit v1.2.3