diff options
author | Andrei Golubev <andrei.golubev@qt.io> | 2020-08-12 11:37:06 +0200 |
---|---|---|
committer | Andrei Golubev <andrei.golubev@qt.io> | 2020-08-27 18:58:20 +0200 |
commit | 4a56a5f6cf76c7f47d15f1d3dbab3852357b22a3 (patch) | |
tree | dfabf36e014ee40cec6c03ed9de989232ae0697e /tests/auto/corelib/tools/qlist | |
parent | f9bb3aa5ce15040cf84fa28ae42030a322dce5d1 (diff) |
Support GrowsBackwards prepend in QList
Restored previously deleted logic of setting GrowsBackwards flag for
prepend-like cases. This should be sufficient to fully enable prepend
optimization
Fixed QList::emplace to not use implementation detail logic. Updated
tests to cover changed behavior and its correctness
Task-number: QTBUG-84320
Change-Id: I4aadab0647fe436140b7bb5cf71309f6887e36ab
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Diffstat (limited to 'tests/auto/corelib/tools/qlist')
-rw-r--r-- | tests/auto/corelib/tools/qlist/tst_qlist.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp index f37633b64c..8a7100d14c 100644 --- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp +++ b/tests/auto/corelib/tools/qlist/tst_qlist.cpp @@ -332,6 +332,7 @@ private slots: void emplaceConsistentWithStdVectorInt(); void emplaceConsistentWithStdVectorCustom(); void emplaceConsistentWithStdVectorMovable(); + void emplaceConsistentWithStdVectorQString(); void emplaceReturnsIterator(); void emplaceBack(); void emplaceBackReturnsRef(); @@ -874,7 +875,7 @@ void tst_QList::appendList() const v6 << (QList<ConstructionCounted>() << 3 << 4); QCOMPARE(v6, expectedFour); QCOMPARE(v6.at(0).copies, 2); - QCOMPARE(v6.at(0).moves, 1); + QCOMPARE(v6.at(0).moves, 2); // += QList<ConstructionCounted> v7; @@ -2916,6 +2917,11 @@ void tst_QList::emplaceConsistentWithStdVectorMovable() emplaceConsistentWithStdVectorImpl<Movable>(); } +void tst_QList::emplaceConsistentWithStdVectorQString() +{ + emplaceConsistentWithStdVectorImpl<QString>(); +} + void tst_QList::emplaceReturnsIterator() { QList<Movable> vec; @@ -3008,20 +3014,29 @@ static void squeezeVec(QList<T> &qVec, std::vector<T> &stdVec) template<typename T> void tst_QList::emplaceConsistentWithStdVectorImpl() const { - QList<T> qVec {'a', 'b', 'c', 'd', 'e'}; - std::vector<T> stdVec {'a', 'b', 'c', 'd', 'e'}; + // fast-patch to make QString work with the old logic + const auto convert = [] (char i) { + if constexpr (std::is_same_v<QString, T>) { + return QChar(i); + } else { + return i; + } + }; + + QList<T> qVec {convert('a'), convert('b'), convert('c'), convert('d'), convert('e')}; + std::vector<T> stdVec {convert('a'), convert('b'), convert('c'), convert('d'), convert('e')}; vecEq(qVec, stdVec); - qVec.emplaceBack('f'); - stdVec.emplace_back('f'); + qVec.emplaceBack(convert('f')); + stdVec.emplace_back(convert('f')); vecEq(qVec, stdVec); - qVec.emplace(3, 'g'); - stdVec.emplace(stdVec.begin() + 3, 'g'); + qVec.emplace(3, convert('g')); + stdVec.emplace(stdVec.begin() + 3, convert('g')); vecEq(qVec, stdVec); T t; - // while QList is safe with regards to emplacing elements moved form itself, it's UB + // while QList is safe with regards to emplacing elements moved from itself, it's UB // for std::vector, so do the moving in two steps there. qVec.emplaceBack(std::move(qVec[0])); stdVec.emplace_back(std::move(t = std::move(stdVec[0]))); |