From a07e5323910a6eaa51180928118393242713d186 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Kundr=C3=A1t?= Date: Tue, 18 Oct 2016 16:04:22 +0200 Subject: [PATCH] Support iteration up until a given top-level index Change-Id: I163db82e9e354aee85c064376bbdb1215df61a1d --- src/UiUtils/QaimDfsIterator.cpp | 8 +++++++- src/UiUtils/QaimDfsIterator.h | 4 ++++ tests/Misc/test_QaimDfsIterator.cpp | 40 ++++++++++++++++++++++++++----------- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/UiUtils/QaimDfsIterator.cpp b/src/UiUtils/QaimDfsIterator.cpp index efb0ecd2..7277db5d 100644 --- a/src/UiUtils/QaimDfsIterator.cpp +++ b/src/UiUtils/QaimDfsIterator.cpp @@ -52,7 +52,8 @@ QaimDfsIterator &QaimDfsIterator::operator++() wentUp = true; // ...and because this is a while-loop, this iterator doesn't really support // iterating until an arbitrary particular end-iterator, just until the very - // end of the model. + // end of the model, or until an arbitrary top-level item (an index whose + // parent is a null, invalid QAIM). } Q_ASSERT(!m_current.isValid()); return *this; @@ -63,6 +64,11 @@ const QModelIndex &QaimDfsIterator::operator*() const return m_current; } +const QModelIndex *QaimDfsIterator::operator->() const +{ + return &m_current; +} + bool QaimDfsIterator::operator!=(const QaimDfsIterator &other) { return m_current != other.m_current; diff --git a/src/UiUtils/QaimDfsIterator.h b/src/UiUtils/QaimDfsIterator.h index e5e61fb4..3a13b3d2 100644 --- a/src/UiUtils/QaimDfsIterator.h +++ b/src/UiUtils/QaimDfsIterator.h @@ -36,6 +36,7 @@ public: QaimDfsIterator(const QaimDfsIterator &) = default; QaimDfsIterator & operator++(); const QModelIndex &operator*() const; + const QModelIndex *operator->() const; bool operator!=(const QaimDfsIterator &other); private: QModelIndex m_current; @@ -55,4 +56,7 @@ template<> struct iterator_traits }; } +Q_DECLARE_METATYPE(UiUtils::QaimDfsIterator); + + #endif diff --git a/tests/Misc/test_QaimDfsIterator.cpp b/tests/Misc/test_QaimDfsIterator.cpp index abbd1971..b065f0d0 100644 --- a/tests/Misc/test_QaimDfsIterator.cpp +++ b/tests/Misc/test_QaimDfsIterator.cpp @@ -30,23 +30,21 @@ void TestQaimDfsIterator::testQaimDfsIterator() { QFETCH(QString, order); QFETCH(QSharedPointer, model); + QFETCH(UiUtils::QaimDfsIterator, end); QStringList buf; - std::transform(UiUtils::QaimDfsIterator(model->index(0, 0, QModelIndex())), - UiUtils::QaimDfsIterator(), - std::back_inserter(buf), + auto it = UiUtils::QaimDfsIterator(model->index(0, 0, QModelIndex())); + std::transform(it, end, std::back_inserter(buf), [](const QModelIndex &what) -> QString { return what.data().toString(); } ); QCOMPARE(buf.join(QLatin1Char(' ')), order); - auto it1 = UiUtils::QaimDfsIterator(model->index(0, 0, QModelIndex())); - auto it2 = UiUtils::QaimDfsIterator(); if (order.isEmpty()) { - QCOMPARE(std::distance(it1, it2), 0); + QCOMPARE(std::distance(it, end), 0); } else { - QCOMPARE(std::distance(it1, it2), order.count(QLatin1Char(' ')) + 1); + QCOMPARE(std::distance(it, end), order.count(QLatin1Char(' ')) + 1); } } @@ -54,20 +52,21 @@ void TestQaimDfsIterator::testQaimDfsIterator_data() { QTest::addColumn("order"); QTest::addColumn>("model"); + QTest::addColumn("end"); QSharedPointer m; m.reset(new QStandardItemModel()); - QTest::newRow("empty-model") << QString() << m; + QTest::newRow("empty-model") << QString() << m << UiUtils::QaimDfsIterator(); m.reset(new QStandardItemModel()); m->appendRow(new QStandardItem("a")); - QTest::newRow("one-item") << "a" << m; + QTest::newRow("one-item") << "a" << m << UiUtils::QaimDfsIterator(); m.reset(new QStandardItemModel()); m->appendRow(new QStandardItem("a")); m->appendRow(new QStandardItem("b")); m->appendRow(new QStandardItem("c")); - QTest::newRow("flat-list") << "a b c" << m; + QTest::newRow("flat-list") << "a b c" << m << UiUtils::QaimDfsIterator(); m.reset(new QStandardItemModel()); auto item3 = new QStandardItem("a.A.1"); @@ -77,7 +76,7 @@ void TestQaimDfsIterator::testQaimDfsIterator_data() item1->appendRow(item2); m->appendRow(item1); item1 = item2 = item3 = nullptr; - QTest::newRow("linear-hierarchy") << "a a.A a.A.1" << m; + QTest::newRow("linear-hierarchy") << "a a.A a.A.1" << m << UiUtils::QaimDfsIterator(); m.reset(new QStandardItemModel()); item3 = new QStandardItem("a.A.1"); @@ -92,7 +91,24 @@ void TestQaimDfsIterator::testQaimDfsIterator_data() m->appendRow(item1); item1 = new QStandardItem("b"); m->appendRow(item1); - QTest::newRow("backtracking") << "a a.A a.A.1 a.B a.B.1 b" << m; + QTest::newRow("backtracking") << "a a.A a.A.1 a.B a.B.1 b" << m << UiUtils::QaimDfsIterator(); + + m.reset(new QStandardItemModel()); + item3 = new QStandardItem("a.A.1"); + item2 = new QStandardItem("a.A"); + item2->appendRow(item3); + item1 = new QStandardItem("a"); + item1->appendRow(item2); + item3 = new QStandardItem("a.B.1"); + item2 = new QStandardItem("a.B"); + item2->appendRow(item3); + item1->appendRow(item2); + m->appendRow(item1); + item1 = new QStandardItem("b"); + m->appendRow(item1); + auto end = UiUtils::QaimDfsIterator(m->index(1, 0, QModelIndex())); + Q_ASSERT(end->data().toString() == "b"); + QTest::newRow("backtracking-until-top-level") << "a a.A a.A.1 a.B a.B.1" << m << end; } QTEST_GUILESS_MAIN(TestQaimDfsIterator) -- 2.11.4.GIT