summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/tools/qlist.h5
-rw-r--r--tests/auto/corelib/tools/qlist/tst_qlist.cpp70
2 files changed, 67 insertions, 8 deletions
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h
index 662fede6f7..b50cd9090f 100644
--- a/src/corelib/tools/qlist.h
+++ b/src/corelib/tools/qlist.h
@@ -834,8 +834,11 @@ inline QList<T> &QList<T>::fill(parameter_type t, qsizetype newSize)
// we're detached
const T copy(t);
d->assign(d.begin(), d.begin() + qMin(size(), newSize), t);
- if (newSize > size())
+ if (newSize > size()) {
d->copyAppend(newSize - size(), copy);
+ } else if (newSize < size()) {
+ d->truncate(newSize);
+ }
}
return *this;
}
diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp
index 64123c61a7..80adb0f6a1 100644
--- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp
+++ b/tests/auto/corelib/tools/qlist/tst_qlist.cpp
@@ -256,7 +256,9 @@ private slots:
void fillInt() const;
void fillMovable() const;
void fillCustom() const;
- void fillDetaches() const;
+ void fillDetachInt() const;
+ void fillDetachMovable() const;
+ void fillDetachCustom() const;
void first() const;
void fromListInt() const;
void fromListMovable() const;
@@ -363,6 +365,7 @@ private:
template<typename T> void erase(bool shared) const;
template<typename T> void eraseReserved() const;
template<typename T> void fill() const;
+ template<typename T> void fillDetach() const;
template<typename T> void fromList() const;
template<typename T> void insert() const;
template<typename T> void qhash() const;
@@ -1443,6 +1446,10 @@ void tst_QList::fill() const
<< SimpleValue<T>::at(2) << SimpleValue<T>::at(2)
<< SimpleValue<T>::at(2) << SimpleValue<T>::at(2)
<< SimpleValue<T>::at(2) << SimpleValue<T>::at(2));
+
+ // make sure it can resize to smaller size as well
+ myvec.fill(SimpleValue<T>::at(3), 2);
+ QCOMPARE(myvec, QList<T>() << SimpleValue<T>::at(3) << SimpleValue<T>::at(3));
}
void tst_QList::fillInt() const
@@ -1464,14 +1471,63 @@ void tst_QList::fillCustom() const
QCOMPARE(instancesCount, Custom::counter.loadAcquire());
}
-void tst_QList::fillDetaches() const
+template<typename T>
+void tst_QList::fillDetach() const
{
- QList<int> test = { 1, 2, 3 };
- QList<int> copy = test;
- copy.fill(42);
+ // detaches to the same size
+ {
+ QList<T> original = { SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) };
+ QList<T> copy = original;
+ copy.fill(SimpleValue<T>::at(2));
+
+ QCOMPARE(original,
+ QList<T>({ SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) }));
+ QCOMPARE(copy,
+ QList<T>({ SimpleValue<T>::at(2), SimpleValue<T>::at(2), SimpleValue<T>::at(2) }));
+ }
+
+ // detaches and grows in size
+ {
+ QList<T> original = { SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) };
+ QList<T> copy = original;
+ copy.fill(SimpleValue<T>::at(2), 5);
- QCOMPARE(test, QList<int>({1, 2, 3}));
- QCOMPARE(copy, QList<int>({42, 42, 42}));
+ QCOMPARE(original,
+ QList<T>({ SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) }));
+ QCOMPARE(copy,
+ QList<T>({ SimpleValue<T>::at(2), SimpleValue<T>::at(2), SimpleValue<T>::at(2),
+ SimpleValue<T>::at(2), SimpleValue<T>::at(2) }));
+ }
+
+ // detaches and shrinks in size
+ {
+ QList<T> original = { SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) };
+ QList<T> copy = original;
+ copy.fill(SimpleValue<T>::at(2), 1);
+
+ QCOMPARE(original,
+ QList<T>({ SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) }));
+ QCOMPARE(copy, QList<T>({ SimpleValue<T>::at(2) }));
+ }
+}
+
+void tst_QList::fillDetachInt() const
+{
+ fillDetach<int>();
+}
+
+void tst_QList::fillDetachMovable() const
+{
+ const int instancesCount = Movable::counter.loadAcquire();
+ fillDetach<Movable>();
+ QCOMPARE(instancesCount, Movable::counter.loadAcquire());
+}
+
+void tst_QList::fillDetachCustom() const
+{
+ const int instancesCount = Custom::counter.loadAcquire();
+ fillDetach<Custom>();
+ QCOMPARE(instancesCount, Custom::counter.loadAcquire());
}
void tst_QList::first() const