/**************************************************************************** ** ** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include namespace CheckContainerTraits { struct NotAContainer {}; static_assert(QContainerTraits::has_size_v>); static_assert(QContainerTraits::has_size_v>); static_assert(!QContainerTraits::has_size_v); static_assert(QContainerTraits::has_size_v>); static_assert(QContainerTraits::has_size_v>); static_assert(!QContainerTraits::has_size_v>); static_assert(QContainerTraits::has_clear_v>); static_assert(QContainerTraits::has_clear_v>); static_assert(!QContainerTraits::has_clear_v); static_assert(QContainerTraits::has_clear_v>); static_assert(QContainerTraits::has_clear_v>); static_assert(QContainerTraits::has_clear_v>); static_assert(QContainerTraits::has_at_index_v>); static_assert(!QContainerTraits::has_at_index_v>); static_assert(!QContainerTraits::has_at_index_v); static_assert(QContainerTraits::has_at_index_v>); static_assert(!QContainerTraits::has_at_index_v>); static_assert(!QContainerTraits::has_at_index_v>); static_assert(QContainerTraits::can_get_at_index_v>); static_assert(!QContainerTraits::can_get_at_index_v>); static_assert(!QContainerTraits::can_get_at_index_v); static_assert(QContainerTraits::can_get_at_index_v>); static_assert(!QContainerTraits::can_get_at_index_v>); static_assert(!QContainerTraits::can_get_at_index_v>); static_assert(QContainerTraits::can_set_at_index_v>); static_assert(!QContainerTraits::can_set_at_index_v>); static_assert(!QContainerTraits::can_set_at_index_v); static_assert(QContainerTraits::can_set_at_index_v>); static_assert(!QContainerTraits::can_set_at_index_v>); static_assert(!QContainerTraits::can_set_at_index_v>); static_assert(QContainerTraits::has_push_back_v>); static_assert(!QContainerTraits::has_push_back_v>); static_assert(!QContainerTraits::has_push_back_v); static_assert(QContainerTraits::has_push_back_v>); static_assert(!QContainerTraits::has_push_back_v>); static_assert(!QContainerTraits::has_push_back_v>); static_assert(QContainerTraits::has_push_front_v>); static_assert(!QContainerTraits::has_push_front_v>); static_assert(!QContainerTraits::has_push_front_v); static_assert(!QContainerTraits::has_push_front_v>); static_assert(!QContainerTraits::has_push_front_v>); static_assert(QContainerTraits::has_push_front_v>); static_assert(!QContainerTraits::has_insert_v>); static_assert(QContainerTraits::has_insert_v>); static_assert(!QContainerTraits::has_insert_v); static_assert(!QContainerTraits::has_insert_v>); static_assert(QContainerTraits::has_insert_v>); static_assert(!QContainerTraits::has_insert_v>); static_assert(QContainerTraits::has_pop_back_v>); static_assert(!QContainerTraits::has_pop_back_v>); static_assert(!QContainerTraits::has_pop_back_v); static_assert(QContainerTraits::has_pop_back_v>); static_assert(!QContainerTraits::has_pop_back_v>); static_assert(!QContainerTraits::has_pop_back_v>); static_assert(QContainerTraits::has_pop_front_v>); static_assert(!QContainerTraits::has_pop_front_v>); static_assert(!QContainerTraits::has_pop_front_v); static_assert(!QContainerTraits::has_pop_front_v>); static_assert(!QContainerTraits::has_pop_front_v>); static_assert(QContainerTraits::has_pop_front_v>); static_assert(QContainerTraits::has_iterator_v>); static_assert(QContainerTraits::has_iterator_v>); static_assert(!QContainerTraits::has_iterator_v); static_assert(QContainerTraits::has_iterator_v>); static_assert(QContainerTraits::has_iterator_v>); static_assert(QContainerTraits::has_iterator_v>); static_assert(QContainerTraits::has_const_iterator_v>); static_assert(QContainerTraits::has_const_iterator_v>); static_assert(!QContainerTraits::has_const_iterator_v); static_assert(QContainerTraits::has_const_iterator_v>); static_assert(QContainerTraits::has_const_iterator_v>); static_assert(QContainerTraits::has_const_iterator_v>); static_assert(QContainerTraits::iterator_dereferences_to_value_v>); static_assert(QContainerTraits::iterator_dereferences_to_value_v>); static_assert(!QContainerTraits::iterator_dereferences_to_value_v); static_assert(QContainerTraits::iterator_dereferences_to_value_v>); static_assert(QContainerTraits::iterator_dereferences_to_value_v>); static_assert(QContainerTraits::iterator_dereferences_to_value_v>); static_assert(QContainerTraits::can_set_value_at_iterator_v>); static_assert(!QContainerTraits::can_set_value_at_iterator_v>); static_assert(!QContainerTraits::can_set_value_at_iterator_v); static_assert(QContainerTraits::can_set_value_at_iterator_v>); static_assert(!QContainerTraits::can_set_value_at_iterator_v>); static_assert(QContainerTraits::can_set_value_at_iterator_v>); static_assert(QContainerTraits::can_insert_value_at_iterator_v>); static_assert(!QContainerTraits::can_insert_value_at_iterator_v>); static_assert(!QContainerTraits::can_insert_value_at_iterator_v); static_assert(QContainerTraits::can_insert_value_at_iterator_v>); static_assert(!QContainerTraits::can_insert_value_at_iterator_v>); // The iterator is only a hint, but syntactically indistinguishable from others. // It's explicitly there to be signature compatible with std::vector::insert, though. // Also, inserting into a set is not guaranteed to actually do anything. static_assert(QContainerTraits::can_insert_value_at_iterator_v>); static_assert(QContainerTraits::can_erase_at_iterator_v>); static_assert(QContainerTraits::can_erase_at_iterator_v>); static_assert(!QContainerTraits::can_erase_at_iterator_v); static_assert(QContainerTraits::can_erase_at_iterator_v>); static_assert(QContainerTraits::can_erase_at_iterator_v>); static_assert(!QContainerTraits::can_erase_at_iterator_v>); } class tst_QMetaContainer: public QObject { Q_OBJECT private: QVector qvector; std::vector stdvector; QSet qset; std::set stdset; std::forward_list forwardList; QHash qhash; QMap qmap; std::map stdmap; std::unordered_map stdunorderedmap; private slots: void init(); void testSequence_data(); void testSequence(); void testAssociation_data(); void testAssociation(); void cleanup(); }; void tst_QMetaContainer::init() { qvector = { QMetaType(), QMetaType::fromType(), QMetaType::fromType() }; stdvector = { QStringLiteral("foo"), QStringLiteral("bar"), QStringLiteral("baz") }; qset = { "aaa", "bbb", "ccc" }; stdset = { 1, 2, 3, 42, 45, 11 }; forwardList = { QMetaSequence::fromContainer>(), QMetaSequence::fromContainer>(), QMetaSequence::fromContainer>(), QMetaSequence::fromContainer>(), QMetaSequence::fromContainer>() }; qhash = { { 233, QMetaType() }, { 11, QMetaType::fromType() }, { 6626, QMetaType::fromType() } }; qmap = { { "eins", true }, { "zwei", false }, { "elfundvierzig", true } }; stdmap = { { QStringLiteral("dkdkdkd"), 58583 }, { QStringLiteral("ooo30393"), 12 }, { QStringLiteral("2dddd30393"), 999999 }, }; stdunorderedmap = { { 11, QMetaAssociation::fromContainer>() }, { 12, QMetaAssociation::fromContainer>() }, { 393, QMetaAssociation::fromContainer>() }, { 293, QMetaAssociation::fromContainer>() } }; } void tst_QMetaContainer::cleanup() { qvector.clear(); stdvector.clear(); qset.clear(); stdset.clear(); forwardList.clear(); qhash.clear(); qmap.clear(); stdmap.clear(); stdunorderedmap.clear(); } void tst_QMetaContainer::testSequence_data() { QTest::addColumn("container"); QTest::addColumn("metaSequence"); QTest::addColumn("metaType"); QTest::addColumn("hasSize"); QTest::addColumn("isIndexed"); QTest::addColumn("canRemove"); QTest::addColumn("hasBidirectionalIterator"); QTest::addColumn("hasRandomAccessIterator"); QTest::addColumn("canInsertAtIterator"); QTest::addColumn("canEraseAtIterator"); QTest::addColumn("isSortable"); QTest::addRow("QVector") << static_cast(&qvector) << QMetaSequence::fromContainer>() << QMetaType::fromType() << true << true << true << true << true << true << true << true; QTest::addRow("std::vector") << static_cast(&stdvector) << QMetaSequence::fromContainer>() << QMetaType::fromType() << true << true << true << true << true << true << true << true; QTest::addRow("QSet") << static_cast(&qset) << QMetaSequence::fromContainer>() << QMetaType::fromType() << true << false << false << false << false << false << true << false; QTest::addRow("std::set") << static_cast(&stdset) << QMetaSequence::fromContainer>() << QMetaType::fromType() << true << false << false << true << false << true << true << false; QTest::addRow("std::forward_list") << static_cast(&forwardList) << QMetaSequence::fromContainer>() << QMetaType::fromType() << false << false << true << false << false << false << false << true; } void tst_QMetaContainer::testSequence() { QFETCH(void *, container); QFETCH(QMetaSequence, metaSequence); QFETCH(QMetaType, metaType); QFETCH(bool, hasSize); QFETCH(bool, isIndexed); QFETCH(bool, canRemove); QFETCH(bool, hasBidirectionalIterator); QFETCH(bool, hasRandomAccessIterator); QFETCH(bool, canInsertAtIterator); QFETCH(bool, canEraseAtIterator); QFETCH(bool, isSortable); QVERIFY(metaSequence.canAddValue()); QCOMPARE(metaSequence.hasSize(), hasSize); QCOMPARE(metaSequence.canGetValueAtIndex(), isIndexed); QCOMPARE(metaSequence.canSetValueAtIndex(), isIndexed); QCOMPARE(metaSequence.canRemoveValue(), canRemove); QCOMPARE(metaSequence.hasBidirectionalIterator(), hasBidirectionalIterator); QCOMPARE(metaSequence.hasRandomAccessIterator(), hasRandomAccessIterator); QCOMPARE(metaSequence.canInsertValueAtIterator(), canInsertAtIterator); QCOMPARE(metaSequence.canEraseValueAtIterator(), canEraseAtIterator); QCOMPARE(metaSequence.isSortable(), isSortable); QVariant var1(metaType); QVariant var2(metaType); QVariant var3(metaType); if (hasSize) { const qsizetype size = metaSequence.size(container); // var1 is invalid, and our sets do not contain an invalid value so far. metaSequence.addValue(container, var1.constData()); QCOMPARE(metaSequence.size(container), size + 1); if (canRemove) { metaSequence.removeValue(container); QCOMPARE(metaSequence.size(container), size); } } else { metaSequence.addValue(container, var1.constData()); if (canRemove) metaSequence.removeValue(container); } if (isIndexed) { QVERIFY(hasSize); const qsizetype size = metaSequence.size(container); for (qsizetype i = 0; i < size; ++i) { metaSequence.valueAtIndex(container, i, var1.data()); metaSequence.valueAtIndex(container, size - i - 1, var2.data()); metaSequence.setValueAtIndex(container, i, var2.constData()); metaSequence.setValueAtIndex(container, size - i - 1, var1.constData()); metaSequence.valueAtIndex(container, i, var3.data()); QCOMPARE(var3, var2); metaSequence.valueAtIndex(container, size - i - 1, var3.data()); QCOMPARE(var3, var1); } } QVERIFY(metaSequence.hasIterator()); QVERIFY(metaSequence.hasConstIterator()); QVERIFY(metaSequence.canGetValueAtIterator()); QVERIFY(metaSequence.canGetValueAtConstIterator()); void *it = metaSequence.begin(container); void *end = metaSequence.end(container); QVERIFY(it); QVERIFY(end); void *constIt = metaSequence.constBegin(container); void *constEnd = metaSequence.constEnd(container); QVERIFY(constIt); QVERIFY(constEnd); const qsizetype size = metaSequence.diffIterator(end, it); QCOMPARE(size, metaSequence.diffConstIterator(constEnd, constIt)); if (hasSize) QCOMPARE(size, metaSequence.size(container)); qsizetype count = 0; for (; !metaSequence.compareIterator(it, end); metaSequence.advanceIterator(it, 1), metaSequence.advanceConstIterator(constIt, 1)) { metaSequence.valueAtIterator(it, var1.data()); if (isIndexed) { metaSequence.valueAtIndex(container, count, var2.data()); QCOMPARE(var1, var2); } metaSequence.valueAtConstIterator(constIt, var3.data()); QCOMPARE(var3, var1); ++count; } QCOMPARE(count, size); QVERIFY(metaSequence.compareConstIterator(constIt, constEnd)); metaSequence.destroyIterator(it); metaSequence.destroyIterator(end); metaSequence.destroyConstIterator(constIt); metaSequence.destroyConstIterator(constEnd); if (metaSequence.canSetValueAtIterator()) { void *it = metaSequence.begin(container); void *end = metaSequence.end(container); QVERIFY(it); QVERIFY(end); for (; !metaSequence.compareIterator(it, end); metaSequence.advanceIterator(it, 1)) { metaSequence.valueAtIterator(it, var1.data()); metaSequence.setValueAtIterator(it, var2.constData()); metaSequence.valueAtIterator(it, var3.data()); QCOMPARE(var2, var3); var2 = var1; } metaSequence.destroyIterator(it); metaSequence.destroyIterator(end); } if (metaSequence.hasBidirectionalIterator()) { void *it = metaSequence.end(container); void *end = metaSequence.begin(container); QVERIFY(it); QVERIFY(end); void *constIt = metaSequence.constEnd(container); void *constEnd = metaSequence.constBegin(container); QVERIFY(constIt); QVERIFY(constEnd); qsizetype size = 0; if (metaSequence.hasRandomAccessIterator()) { size = metaSequence.diffIterator(end, it); QCOMPARE(size, metaSequence.diffConstIterator(constEnd, constIt)); } else { size = -metaSequence.diffIterator(it, end); } if (hasSize) QCOMPARE(size, -metaSequence.size(container)); qsizetype count = 0; do { metaSequence.advanceIterator(it, -1); metaSequence.advanceConstIterator(constIt, -1); --count; metaSequence.valueAtIterator(it, var1.data()); if (isIndexed) { metaSequence.valueAtIndex(container, count - size, var2.data()); QCOMPARE(var1, var2); } metaSequence.valueAtConstIterator(constIt, var3.data()); QCOMPARE(var3, var1); } while (!metaSequence.compareIterator(it, end)); QCOMPARE(count, size); QVERIFY(metaSequence.compareConstIterator(constIt, constEnd)); metaSequence.destroyIterator(it); metaSequence.destroyIterator(end); metaSequence.destroyConstIterator(constIt); metaSequence.destroyConstIterator(constEnd); } if (canInsertAtIterator) { void *it = metaSequence.begin(container); void *end = metaSequence.end(container); const qsizetype size = metaSequence.diffIterator(end, it); metaSequence.destroyIterator(end); metaSequence.insertValueAtIterator(container, it, var1.constData()); metaSequence.destroyIterator(it); it = metaSequence.begin(container); metaSequence.insertValueAtIterator(container, it, var2.constData()); metaSequence.destroyIterator(it); it = metaSequence.begin(container); metaSequence.insertValueAtIterator(container, it, var3.constData()); metaSequence.destroyIterator(it); it = metaSequence.begin(container); end = metaSequence.end(container); const qsizetype newSize = metaSequence.diffIterator(end, it); if (metaSequence.isSortable()) { QCOMPARE(newSize, size + 3); QVariant var4(metaType); metaSequence.valueAtIterator(it, var4.data()); QCOMPARE(var4, var3); metaSequence.advanceIterator(it, 1); metaSequence.valueAtIterator(it, var4.data()); QCOMPARE(var4, var2); metaSequence.advanceIterator(it, 1); metaSequence.valueAtIterator(it, var4.data()); QCOMPARE(var4, var1); } else { QVERIFY(newSize >= size); } if (canEraseAtIterator) { for (int i = 0; i < newSize; ++i) { metaSequence.destroyIterator(it); it = metaSequence.begin(container); metaSequence.eraseValueAtIterator(container, it); } metaSequence.destroyIterator(it); it = metaSequence.begin(container); metaSequence.destroyIterator(end); end = metaSequence.end(container); QVERIFY(metaSequence.compareIterator(it, end)); metaSequence.addValue(container, var1.constData()); metaSequence.addValue(container, var2.constData()); metaSequence.addValue(container, var3.constData()); } metaSequence.destroyIterator(end); metaSequence.destroyIterator(it); } QVERIFY(metaSequence.canClear()); constIt = metaSequence.constBegin(container); constEnd = metaSequence.constEnd(container); QVERIFY(!metaSequence.compareConstIterator(constIt, constEnd)); metaSequence.destroyConstIterator(constIt); metaSequence.destroyConstIterator(constEnd); metaSequence.clear(container); constIt = metaSequence.constBegin(container); constEnd = metaSequence.constEnd(container); QVERIFY(metaSequence.compareConstIterator(constIt, constEnd)); metaSequence.destroyConstIterator(constIt); metaSequence.destroyConstIterator(constEnd); } void tst_QMetaContainer::testAssociation_data() { QTest::addColumn("container"); QTest::addColumn("metaAssociation"); QTest::addColumn("keyType"); QTest::addColumn("mappedType"); QTest::addColumn("hasSize"); QTest::addColumn("canRemove"); QTest::addColumn("canSetMapped"); QTest::addColumn("hasBidirectionalIterator"); QTest::addColumn("hasRandomAccessIterator"); QTest::addRow("QHash") << static_cast(&qhash) << QMetaAssociation::fromContainer>() << QMetaType::fromType() << QMetaType::fromType() << true << true << true << false << false; QTest::addRow("QMap") << static_cast(&qmap) << QMetaAssociation::fromContainer>() << QMetaType::fromType() << QMetaType::fromType() << true << true << true << true << false; QTest::addRow("std::map") << static_cast(&stdmap) << QMetaAssociation::fromContainer>() << QMetaType::fromType() << QMetaType::fromType() << true << true << true << true << false; QTest::addRow("std::unorderedmap") << static_cast(&stdunorderedmap) << QMetaAssociation::fromContainer>() << QMetaType::fromType() << QMetaType::fromType() << true << true << true << false << false; QTest::addRow("QSet") << static_cast(&qset) << QMetaAssociation::fromContainer>() << QMetaType::fromType() << QMetaType() << true << true << false << false << false; QTest::addRow("std::set") << static_cast(&stdset) << QMetaAssociation::fromContainer>() << QMetaType::fromType() << QMetaType() << true << true << false << true << false; } void tst_QMetaContainer::testAssociation() { QFETCH(void *, container); QFETCH(QMetaAssociation, metaAssociation); QFETCH(QMetaType, keyType); QFETCH(QMetaType, mappedType); QFETCH(bool, hasSize); QFETCH(bool, canRemove); QFETCH(bool, canSetMapped); QFETCH(bool, hasBidirectionalIterator); QFETCH(bool, hasRandomAccessIterator); QCOMPARE(metaAssociation.hasSize(), hasSize); QCOMPARE(metaAssociation.canRemoveKey(), canRemove); QCOMPARE(metaAssociation.canSetMappedAtKey(), canSetMapped); QCOMPARE(metaAssociation.canSetMappedAtIterator(), canSetMapped); // Apparently implementations can choose to provide "better" iterators than required by the std. if (hasBidirectionalIterator) QCOMPARE(metaAssociation.hasBidirectionalIterator(), hasBidirectionalIterator); if (hasRandomAccessIterator) QCOMPARE(metaAssociation.hasRandomAccessIterator(), hasRandomAccessIterator); QVariant key1(keyType); QVariant key2(keyType); QVariant key3(keyType); QVariant mapped1(mappedType); QVariant mapped2(mappedType); QVariant mapped3(mappedType); if (hasSize) { const qsizetype size = metaAssociation.size(container); QVERIFY(metaAssociation.canInsertKey()); // var1 is invalid, and our containers do not contain an invalid key so far. metaAssociation.insertKey(container, key1.constData()); QCOMPARE(metaAssociation.size(container), size + 1); metaAssociation.removeKey(container, key1.constData()); QCOMPARE(metaAssociation.size(container), size); } else { metaAssociation.insertKey(container, key1.constData()); metaAssociation.removeKey(container, key1.constData()); } QVERIFY(metaAssociation.hasIterator()); QVERIFY(metaAssociation.hasConstIterator()); QVERIFY(metaAssociation.canGetKeyAtIterator()); QVERIFY(metaAssociation.canGetKeyAtConstIterator()); void *it = metaAssociation.begin(container); void *end = metaAssociation.end(container); QVERIFY(it); QVERIFY(end); void *constIt = metaAssociation.constBegin(container); void *constEnd = metaAssociation.constEnd(container); QVERIFY(constIt); QVERIFY(constEnd); const qsizetype size = metaAssociation.diffIterator(end, it); QCOMPARE(size, metaAssociation.diffConstIterator(constEnd, constIt)); if (hasSize) QCOMPARE(size, metaAssociation.size(container)); qsizetype count = 0; for (; !metaAssociation.compareIterator(it, end); metaAssociation.advanceIterator(it, 1), metaAssociation.advanceConstIterator(constIt, 1)) { metaAssociation.keyAtIterator(it, key1.data()); metaAssociation.keyAtConstIterator(constIt, key3.data()); QCOMPARE(key3, key1); ++count; } QCOMPARE(count, size); QVERIFY(metaAssociation.compareConstIterator(constIt, constEnd)); metaAssociation.destroyIterator(it); metaAssociation.destroyIterator(end); metaAssociation.destroyConstIterator(constIt); metaAssociation.destroyConstIterator(constEnd); if (metaAssociation.canSetMappedAtIterator()) { void *it = metaAssociation.begin(container); void *end = metaAssociation.end(container); QVERIFY(it); QVERIFY(end); for (; !metaAssociation.compareIterator(it, end); metaAssociation.advanceIterator(it, 1)) { metaAssociation.mappedAtIterator(it, mapped1.data()); metaAssociation.setMappedAtIterator(it, mapped2.constData()); metaAssociation.mappedAtIterator(it, mapped3.data()); QCOMPARE(mapped2, mapped3); mapped2 = mapped1; } metaAssociation.destroyIterator(it); metaAssociation.destroyIterator(end); it = metaAssociation.constBegin(container); end = metaAssociation.constEnd(container); QVERIFY(it); QVERIFY(end); for (; !metaAssociation.compareConstIterator(it, end); metaAssociation.advanceConstIterator(it, 1)) { metaAssociation.mappedAtConstIterator(it, mapped1.data()); metaAssociation.keyAtConstIterator(it, key1.data()); metaAssociation.setMappedAtKey(container, key1.constData(), mapped2.constData()); metaAssociation.mappedAtConstIterator(it, mapped3.data()); QCOMPARE(mapped2, mapped3); mapped2 = mapped1; } metaAssociation.destroyConstIterator(it); metaAssociation.destroyConstIterator(end); } if (metaAssociation.hasBidirectionalIterator()) { void *it = metaAssociation.end(container); void *end = metaAssociation.begin(container); QVERIFY(it); QVERIFY(end); void *constIt = metaAssociation.constEnd(container); void *constEnd = metaAssociation.constBegin(container); QVERIFY(constIt); QVERIFY(constEnd); qsizetype size = 0; if (metaAssociation.hasRandomAccessIterator()) { size = metaAssociation.diffIterator(end, it); QCOMPARE(size, metaAssociation.diffConstIterator(constEnd, constIt)); } else { size = -metaAssociation.diffIterator(it, end); } if (hasSize) QCOMPARE(size, -metaAssociation.size(container)); qsizetype count = 0; do { metaAssociation.advanceIterator(it, -1); metaAssociation.advanceConstIterator(constIt, -1); --count; metaAssociation.keyAtIterator(it, key1.data()); metaAssociation.keyAtConstIterator(constIt, key3.data()); QCOMPARE(key3, key1); } while (!metaAssociation.compareIterator(it, end)); QCOMPARE(count, size); QVERIFY(metaAssociation.compareConstIterator(constIt, constEnd)); metaAssociation.destroyIterator(it); metaAssociation.destroyIterator(end); metaAssociation.destroyConstIterator(constIt); metaAssociation.destroyConstIterator(constEnd); } QVERIFY(metaAssociation.canClear()); constIt = metaAssociation.constBegin(container); constEnd = metaAssociation.constEnd(container); QVERIFY(!metaAssociation.compareConstIterator(constIt, constEnd)); metaAssociation.destroyConstIterator(constIt); metaAssociation.destroyConstIterator(constEnd); metaAssociation.clear(container); constIt = metaAssociation.constBegin(container); constEnd = metaAssociation.constEnd(container); QVERIFY(metaAssociation.compareConstIterator(constIt, constEnd)); metaAssociation.destroyConstIterator(constIt); metaAssociation.destroyConstIterator(constEnd); } QTEST_MAIN(tst_QMetaContainer) #include "tst_qmetacontainer.moc"