From ef93fdeb098f78a0afe1df72c53ba26bf7a11c60 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 3 Sep 2020 13:41:39 +0200 Subject: Provide methods for adding values to a sequential iterable Provide functionality to add and remove values, so that you can use a sequential iterable as stack or queue if the underlying container supports this. To this end, provide a way to specify whether the value should be added or removed at the beginning or the end of the iterable. Change-Id: If63d302f3ca085e56d601116ce4dfaa6b94a0c4f Reviewed-by: Edward Welbourne --- .../kernel/qmetacontainer/tst_qmetacontainer.cpp | 8 ++++---- .../auto/corelib/kernel/qvariant/tst_qvariant.cpp | 23 +++++++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) (limited to 'tests/auto') diff --git a/tests/auto/corelib/kernel/qmetacontainer/tst_qmetacontainer.cpp b/tests/auto/corelib/kernel/qmetacontainer/tst_qmetacontainer.cpp index 69f8cf0169..c4892de2cc 100644 --- a/tests/auto/corelib/kernel/qmetacontainer/tst_qmetacontainer.cpp +++ b/tests/auto/corelib/kernel/qmetacontainer/tst_qmetacontainer.cpp @@ -215,7 +215,7 @@ void tst_QMetaContainer::testSequence_data() QTest::addColumn("hasRandomAccessIterator"); QTest::addColumn("canInsertAtIterator"); QTest::addColumn("canEraseAtIterator"); - QTest::addColumn("isOrdered"); + QTest::addColumn("isSortable"); QTest::addRow("QVector") << static_cast(&qvector) @@ -256,7 +256,7 @@ void tst_QMetaContainer::testSequence() QFETCH(bool, hasRandomAccessIterator); QFETCH(bool, canInsertAtIterator); QFETCH(bool, canEraseAtIterator); - QFETCH(bool, isOrdered); + QFETCH(bool, isSortable); QVERIFY(metaSequence.canAddValue()); QCOMPARE(metaSequence.hasSize(), hasSize); @@ -267,7 +267,7 @@ void tst_QMetaContainer::testSequence() QCOMPARE(metaSequence.hasRandomAccessIterator(), hasRandomAccessIterator); QCOMPARE(metaSequence.canInsertValueAtIterator(), canInsertAtIterator); QCOMPARE(metaSequence.canEraseValueAtIterator(), canEraseAtIterator); - QCOMPARE(metaSequence.isOrdered(), isOrdered); + QCOMPARE(metaSequence.isSortable(), isSortable); QVariant var1(metaType); QVariant var2(metaType); @@ -434,7 +434,7 @@ void tst_QMetaContainer::testSequence() const qsizetype newSize = metaSequence.diffIterator(end, it); - if (metaSequence.isOrdered()) { + if (metaSequence.isSortable()) { QCOMPARE(newSize, size + 3); QVariant var4(metaType); metaSequence.valueAtIterator(it, var4.data()); diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index d606f449cf..b0e622e440 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -4539,7 +4539,8 @@ void tst_QVariant::shouldDeleteVariantDataWorksForSequential() [](const void *, QtMetaContainerPrivate::QMetaSequenceInterface::Position) -> void* { return nullptr; }; - metaSequence.addValueFn = [](void *, const void *) {}; + metaSequence.addValueFn = [](void *, const void *, + QtMetaContainerPrivate::QMetaSequenceInterface::Position) {}; metaSequence.advanceConstIteratorFn = [](void *, qsizetype) {}; metaSequence.destroyConstIteratorFn = [](const void *){}; metaSequence.compareConstIteratorFn = [](const void *, const void *) { @@ -4697,10 +4698,19 @@ void tst_QVariant::sequentialIterableAppend() QVERIFY(variant.canConvert()); auto asIterable = variant.value(); const int i = 3, j = 4; - void *mutableIterable = const_cast(asIterable.constIterable()); - asIterable.metaSequence().addValue(mutableIterable, &i); - asIterable.metaSequence().addValue(mutableIterable, &j); + void *mutableIterable = asIterable.mutableIterable(); + asIterable.metaSequence().addValueAtEnd(mutableIterable, &i); + asIterable.metaSequence().addValueAtEnd(mutableIterable, &j); QCOMPARE(variant.value>(), QList ({ 1, 2, 3, 4 })); + + asIterable.metaSequence().addValueAtBegin(mutableIterable, &i); + asIterable.metaSequence().addValueAtBegin(mutableIterable, &j); + QCOMPARE(variant.value>(), QList ({ 4, 3, 1, 2, 3, 4 })); + + asIterable.metaSequence().removeValueAtBegin(mutableIterable); + QCOMPARE(variant.value>(), QList ({ 3, 1, 2, 3, 4 })); + asIterable.metaSequence().removeValueAtEnd(mutableIterable); + QCOMPARE(variant.value>(), QList ({ 3, 1, 2, 3 })); } { QSet container { QByteArray{"hello"}, QByteArray{"world"} }; @@ -4709,11 +4719,14 @@ void tst_QVariant::sequentialIterableAppend() auto asIterable = variant.value(); QByteArray qba1 {"goodbye"}; QByteArray qba2 { "moon" }; - void *mutableIterable = const_cast(asIterable.constIterable()); + void *mutableIterable = asIterable.mutableIterable(); asIterable.metaSequence().addValue(mutableIterable, &qba1); asIterable.metaSequence().addValue(mutableIterable, &qba2); QSet reference { "hello", "world", "goodbye", "moon" }; QCOMPARE(variant.value>(), reference); + asIterable.metaSequence().addValue(mutableIterable, &qba1); + asIterable.metaSequence().addValue(mutableIterable, &qba2); + QCOMPARE(variant.value>(), reference); } } -- cgit v1.2.3