/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** 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 Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include "../qtconcurrentmap/functions.h" class tst_QtConcurrentFilter : public QObject { Q_OBJECT private slots: void filter(); void filtered(); void filteredReduced(); void resultAt(); void incrementalResults(); void noDetach(); void stlContainers(); }; void tst_QtConcurrentFilter::filter() { // functor { QList list; list << 1 << 2 << 3 << 4; QtConcurrent::filter(list, KeepEvenIntegers()).waitForFinished(); QCOMPARE(list, QList() << 2 << 4); } { QList list; list << 1 << 2 << 3 << 4; QtConcurrent::blockingFilter(list, KeepEvenIntegers()); QCOMPARE(list, QList() << 2 << 4); } { QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QtConcurrent::filter(linkedList, KeepEvenIntegers()).waitForFinished(); QCOMPARE(linkedList, QLinkedList() << 2 << 4); } { QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QtConcurrent::blockingFilter(linkedList, KeepEvenIntegers()); QCOMPARE(linkedList, QLinkedList() << 2 << 4); } { QVector vector; vector << 1 << 2 << 3 << 4; QtConcurrent::filter(vector, KeepEvenIntegers()).waitForFinished(); QCOMPARE(vector, QVector() << 2 << 4); } { QVector vector; vector << 1 << 2 << 3 << 4; QtConcurrent::blockingFilter(vector, KeepEvenIntegers()); QCOMPARE(vector, QVector() << 2 << 4); } // function { QList list; list << 1 << 2 << 3 << 4; QtConcurrent::filter(list, keepEvenIntegers).waitForFinished(); QCOMPARE(list, QList() << 2 << 4); } { QList list; list << 1 << 2 << 3 << 4; QtConcurrent::blockingFilter(list, keepEvenIntegers); QCOMPARE(list, QList() << 2 << 4); } { QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QtConcurrent::filter(linkedList, keepEvenIntegers).waitForFinished(); QCOMPARE(linkedList, QLinkedList() << 2 << 4); } { QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QtConcurrent::blockingFilter(linkedList, keepEvenIntegers); QCOMPARE(linkedList, QLinkedList() << 2 << 4); } // bound function { QList list; list << 1 << 2 << 3 << 4; QtConcurrent::filter(list, keepEvenIntegers).waitForFinished(); QCOMPARE(list, QList() << 2 << 4); } { QList list; list << 1 << 2 << 3 << 4; QtConcurrent::blockingFilter(list, keepEvenIntegers); QCOMPARE(list, QList() << 2 << 4); } { QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QtConcurrent::filter(linkedList, keepEvenIntegers).waitForFinished(); QCOMPARE(linkedList, QLinkedList() << 2 << 4); } { QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QtConcurrent::blockingFilter(linkedList, keepEvenIntegers); QCOMPARE(linkedList, QLinkedList() << 2 << 4); } // member { QList list; list << 1 << 2 << 3 << 4; QtConcurrent::filter(list, &Number::isEven).waitForFinished(); QCOMPARE(list, QList() << 2 << 4); } { QList list; list << 1 << 2 << 3 << 4; QtConcurrent::blockingFilter(list, &Number::isEven); QCOMPARE(list, QList() << 2 << 4); } { QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QtConcurrent::filter(linkedList, &Number::isEven).waitForFinished(); QCOMPARE(linkedList, QLinkedList() << 2 << 4); } { QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QtConcurrent::blockingFilter(linkedList, &Number::isEven); QCOMPARE(linkedList, QLinkedList() << 2 << 4); } } void tst_QtConcurrentFilter::filtered() { QList list; list << 1 << 2 << 3 << 4; // functor { QFuture f = QtConcurrent::filtered(list, KeepEvenIntegers()); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(list.begin(), list.end(), KeepEvenIntegers()); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(list.constBegin(), list.constEnd(), KeepEvenIntegers()); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFiltered(list, KeepEvenIntegers()); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFiltered >(list.begin(), list.end(), KeepEvenIntegers()); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFiltered >(list.constBegin(), list.constEnd(), KeepEvenIntegers()); QCOMPARE(list2, QList() << 2 << 4); } { QVector vector; vector << 1 << 2 << 3 << 4; QVector vector2 = QtConcurrent::blockingFiltered(vector, KeepEvenIntegers()); QCOMPARE(vector2, QVector() << 2 << 4); } { QVector vector; vector << 1 << 2 << 3 << 4; QFuture f = QtConcurrent::filtered(vector, KeepEvenIntegers()); QCOMPARE(f.results(), QList() << 2 << 4); } { QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QLinkedList linkedList2 = QtConcurrent::blockingFiltered(linkedList, KeepEvenIntegers()); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QFuture f = QtConcurrent::filtered(linkedList, KeepEvenIntegers()); QCOMPARE(f.results(), QList() << 2 << 4); } // function { QFuture f = QtConcurrent::filtered(list, keepEvenIntegers); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(list.begin(), list.end(), keepEvenIntegers); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(list.constBegin(), list.constEnd(), keepEvenIntegers); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFiltered(list, keepEvenIntegers); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFiltered >(list.begin(), list.end(), keepEvenIntegers); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFiltered >(list.constBegin(), list.constEnd(), keepEvenIntegers); QCOMPARE(list2, QList() << 2 << 4); } // bound function { QFuture f = QtConcurrent::filtered(list, keepEvenIntegers); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(list.begin(), list.end(), keepEvenIntegers); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(list.constBegin(), list.constEnd(), keepEvenIntegers); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFiltered(list, keepEvenIntegers); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFiltered >(list.begin(), list.end(), keepEvenIntegers); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFiltered >(list.constBegin(), list.constEnd(), keepEvenIntegers); QCOMPARE(list2, QList() << 2 << 4); } // const member function { QList integers; integers << 1 << 2 << 3 << 4; QFuture f = QtConcurrent::filtered(integers, &Number::isEven); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QList integers; integers << 1 << 2 << 3 << 4; QFuture f = QtConcurrent::filtered(integers.begin(), integers.end(), &Number::isEven); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QList integers; integers << 1 << 2 << 3 << 4; QFuture f = QtConcurrent::filtered(integers.constBegin(), integers.constEnd(), &Number::isEven); QList list2 = f.results(); QCOMPARE(list2, QList() << 2 << 4); } { QList integers; integers << 1 << 2 << 3 << 4; QList list2 = QtConcurrent::blockingFiltered(integers, &Number::isEven); QCOMPARE(list2, QList() << 2 << 4); } { QList integers; integers << 1 << 2 << 3 << 4; QList list2 = QtConcurrent::blockingFiltered >(integers.begin(), integers.end(), &Number::isEven); QCOMPARE(list2, QList() << 2 << 4); } { QList integers; integers << 1 << 2 << 3 << 4; QList list2 = QtConcurrent::blockingFiltered >(integers.constBegin(), integers.constEnd(), &Number::isEven); QCOMPARE(list2, QList() << 2 << 4); } // same thing on linked lists QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; // functor { QFuture f = QtConcurrent::filtered(linkedList, KeepEvenIntegers()); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(linkedList.begin(), linkedList.end(), KeepEvenIntegers()); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(linkedList.constBegin(), linkedList.constEnd(), KeepEvenIntegers()); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFiltered(linkedList, KeepEvenIntegers()); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFiltered >(linkedList.begin(), linkedList.end(), KeepEvenIntegers()); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFiltered >(linkedList.constBegin(), linkedList.constEnd(), KeepEvenIntegers()); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } // function { QFuture f = QtConcurrent::filtered(linkedList, keepEvenIntegers); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(linkedList.begin(), linkedList.end(), keepEvenIntegers); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFiltered(linkedList, keepEvenIntegers); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFiltered >(linkedList.begin(), linkedList.end(), keepEvenIntegers); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFiltered >(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } // bound function { QFuture f = QtConcurrent::filtered(linkedList, keepEvenIntegers); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(linkedList.begin(), linkedList.end(), keepEvenIntegers); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QFuture f = QtConcurrent::filtered(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFiltered(linkedList, keepEvenIntegers); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFiltered >(linkedList.begin(), linkedList.end(), keepEvenIntegers); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFiltered >(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } // const member function { QLinkedList integers; integers << 1 << 2 << 3 << 4; QFuture f = QtConcurrent::filtered(integers, &Number::isEven); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QLinkedList integers; integers << 1 << 2 << 3 << 4; QFuture f = QtConcurrent::filtered(integers.begin(), integers.end(), &Number::isEven); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QLinkedList integers; integers << 1 << 2 << 3 << 4; QFuture f = QtConcurrent::filtered(integers.constBegin(), integers.constEnd(), &Number::isEven); QList linkedList2 = f.results(); QCOMPARE(linkedList2, QList() << 2 << 4); } { QLinkedList integers; integers << 1 << 2 << 3 << 4; QLinkedList linkedList2 = QtConcurrent::blockingFiltered(integers, &Number::isEven); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList integers; integers << 1 << 2 << 3 << 4; QLinkedList linkedList2 = QtConcurrent::blockingFiltered >(integers.begin(), integers.end(), &Number::isEven); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList integers; integers << 1 << 2 << 3 << 4; QLinkedList linkedList2 = QtConcurrent::blockingFiltered >(integers.constBegin(), integers.constEnd(), &Number::isEven); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } } void tst_QtConcurrentFilter::filteredReduced() { QList list; list << 1 << 2 << 3 << 4; QList numberList; numberList << 1 << 2 << 3 << 4; // functor-functor { int sum = QtConcurrent::filteredReduced(list, KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::filteredReduced(list, keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } { QVector vector; vector << 1 << 2 << 3 << 4; int sum = QtConcurrent::filteredReduced(vector, KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(list.begin(), list.end(), KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::filteredReduced(list.begin(), list.end(), keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::filteredReduced(list.constBegin(), list.constEnd(), KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::filteredReduced(list.constBegin(), list.constEnd(), keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list, KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::blockingFilteredReduced(list, keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list.begin(), list.end(), KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::blockingFilteredReduced(list.begin(), list.end(), keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list.constBegin(), list.constEnd(), KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::blockingFilteredReduced(list.constBegin(), list.constEnd(), keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } // function-functor { int sum = QtConcurrent::filteredReduced(list, keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(list.begin(), list.end(), keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(list.constBegin(), list.constEnd(), keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list, keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list.begin(), list.end(), keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list.constBegin(), list.constEnd(), keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } // functor-function { int sum = QtConcurrent::filteredReduced(list, KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(list.begin(), list.end(), KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(list.constBegin(), list.constEnd(), KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list, KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list.begin(), list.end(), KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list.constBegin(), list.constEnd(), KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } // function-function { int sum = QtConcurrent::filteredReduced(list, keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(list.begin(), list.end(), keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(list.constBegin(), list.constEnd(), keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list, keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list.begin(), list.end(), keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(list.constBegin(), list.constEnd(), keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } // functor-member { QList list2 = QtConcurrent::filteredReduced(list, KeepEvenIntegers(), &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::filteredReduced(list.begin(), list.end(), KeepEvenIntegers(), &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::filteredReduced(list.constBegin(), list.constEnd(), KeepEvenIntegers(), &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFilteredReduced(list, KeepEvenIntegers(), &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFilteredReduced(list.begin(), list.end(), KeepEvenIntegers(), &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFilteredReduced(list.constBegin(), list.constEnd(), KeepEvenIntegers(), &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } // member-functor { int sum = QtConcurrent::filteredReduced(numberList, &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::filteredReduced(QList(numberList), &Number::isEven, NumberSumReduce()); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::filteredReduced(numberList.begin(), numberList.end(), &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(numberList.constBegin(), numberList.constEnd(), &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberList, &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::blockingFilteredReduced(QList(numberList), &Number::isEven, NumberSumReduce()); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberList.begin(), numberList.end(), &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberList.constBegin(), numberList.constEnd(), &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); } // member-member { QList numbers; numbers << 1 << 2 << 3 << 4; QList list2 = QtConcurrent::filteredReduced(numbers, &Number::isEven, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList numbers; numbers << 1 << 2 << 3 << 4; QList list2 = QtConcurrent::filteredReduced(numbers.begin(), numbers.end(), &Number::isEven, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList numbers; numbers << 1 << 2 << 3 << 4; QList list2 = QtConcurrent::filteredReduced(numbers.constBegin(), numbers.constEnd(), &Number::isEven, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList numbers; numbers << 1 << 2 << 3 << 4; QList list2 = QtConcurrent::blockingFilteredReduced(numbers, &Number::isEven, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList numbers; numbers << 1 << 2 << 3 << 4; QList list2 = QtConcurrent::blockingFilteredReduced(numbers.begin(), numbers.end(), &Number::isEven, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList numbers; numbers << 1 << 2 << 3 << 4; QList list2 = QtConcurrent::blockingFilteredReduced(numbers.constBegin(), numbers.constEnd(), &Number::isEven, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } // function-member { QList list2 = QtConcurrent::filteredReduced(list, keepEvenIntegers, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::filteredReduced(list.begin(), list.end(), keepEvenIntegers, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::filteredReduced(list.constBegin(), list.constEnd(), keepEvenIntegers, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFilteredReduced(list, keepEvenIntegers, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFilteredReduced(list.begin(), list.end(), keepEvenIntegers, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } { QList list2 = QtConcurrent::blockingFilteredReduced(list.constBegin(), list.constEnd(), keepEvenIntegers, &QList::push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList() << 2 << 4); } // member-function { int sum = QtConcurrent::filteredReduced(numberList, &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); int sum2 = QtConcurrent::filteredReduced(QList(numberList), &Number::isEven, numberSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::filteredReduced(numberList.begin(), numberList.end(), &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(numberList.constBegin(), numberList.constEnd(), &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberList, &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); int sum2 = QtConcurrent::blockingFilteredReduced(QList(numberList), &Number::isEven, numberSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberList.begin(), numberList.end(), &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberList.constBegin(), numberList.constEnd(), &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); } // same as above on linked lists QLinkedList linkedList; linkedList << 1 << 2 << 3 << 4; QLinkedList numberLinkedList; numberLinkedList << 1 << 2 << 3 << 4; // functor-functor { int sum = QtConcurrent::filteredReduced(linkedList, KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::filteredReduced(linkedList, keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::filteredReduced(linkedList.begin(), linkedList.end(), KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::filteredReduced(linkedList.begin(), linkedList.end(), keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::filteredReduced(linkedList.constBegin(), linkedList.constEnd(), KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::filteredReduced(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList, KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::blockingFilteredReduced(linkedList, keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList.begin(), linkedList.end(), KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::blockingFilteredReduced(linkedList.begin(), linkedList.end(), keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(), linkedList.constEnd(), KeepEvenIntegers(), IntSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers, intSumReduce); QCOMPARE(sum2, 6); } // function-functor { int sum = QtConcurrent::filteredReduced(linkedList, keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(linkedList.begin(), linkedList.end(), keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList, keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList.begin(), linkedList.end(), keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers, IntSumReduce()); QCOMPARE(sum, 6); } // functor-function { int sum = QtConcurrent::filteredReduced(linkedList, KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(linkedList.begin(), linkedList.end(), KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(linkedList.constBegin(), linkedList.constEnd(), KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList, KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList.begin(), linkedList.end(), KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(), linkedList.constEnd(), KeepEvenIntegers(), intSumReduce); QCOMPARE(sum, 6); } // function-function { int sum = QtConcurrent::filteredReduced(linkedList, keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(linkedList.begin(), linkedList.end(), keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList, keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList.begin(), linkedList.end(), keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers, intSumReduce); QCOMPARE(sum, 6); } // functor-member { QLinkedList linkedList2 = QtConcurrent::filteredReduced(linkedList, KeepEvenIntegers(), &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::filteredReduced(linkedList.begin(), linkedList.end(), KeepEvenIntegers(), &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::filteredReduced(linkedList.constBegin(), linkedList.constEnd(), KeepEvenIntegers(), &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList, KeepEvenIntegers(), &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList.begin(), linkedList.end(), KeepEvenIntegers(), &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(), linkedList.constEnd(), KeepEvenIntegers(), &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } // member-functor { int sum = QtConcurrent::filteredReduced(numberLinkedList, &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::filteredReduced(QLinkedList(numberLinkedList), &Number::isEven, NumberSumReduce()); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::filteredReduced(numberLinkedList.begin(), numberLinkedList.end(), &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(numberLinkedList.constBegin(), numberLinkedList.constEnd(), &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberLinkedList, &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); int sum2 = QtConcurrent::blockingFilteredReduced(QLinkedList(numberLinkedList), &Number::isEven, NumberSumReduce()); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberLinkedList.begin(), numberLinkedList.end(), &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberLinkedList.constBegin(), numberLinkedList.constEnd(), &Number::isEven, NumberSumReduce()); QCOMPARE(sum, 6); } // member-member { QLinkedList numbers; numbers << 1 << 2 << 3 << 4; QLinkedList linkedList2 = QtConcurrent::filteredReduced(numbers, &Number::isEven, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList numbers; numbers << 1 << 2 << 3 << 4; QLinkedList linkedList2 = QtConcurrent::filteredReduced(numbers.begin(), numbers.end(), &Number::isEven, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList numbers; numbers << 1 << 2 << 3 << 4; QLinkedList linkedList2 = QtConcurrent::filteredReduced(numbers.constBegin(), numbers.constEnd(), &Number::isEven, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList numbers; numbers << 1 << 2 << 3 << 4; QLinkedList linkedList2 = QtConcurrent::blockingFilteredReduced(numbers, &Number::isEven, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList numbers; numbers << 1 << 2 << 3 << 4; QLinkedList linkedList2 = QtConcurrent::blockingFilteredReduced(numbers.begin(), numbers.end(), &Number::isEven, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList numbers; numbers << 1 << 2 << 3 << 4; QLinkedList linkedList2 = QtConcurrent::blockingFilteredReduced(numbers.constBegin(), numbers.constEnd(), &Number::isEven, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } // function-member { QLinkedList linkedList2 = QtConcurrent::filteredReduced(linkedList, keepEvenIntegers, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::filteredReduced(linkedList.begin(), linkedList.end(), keepEvenIntegers, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::filteredReduced(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList, keepEvenIntegers, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList.begin(), linkedList.end(), keepEvenIntegers, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } { QLinkedList linkedList2 = QtConcurrent::blockingFilteredReduced(linkedList.constBegin(), linkedList.constEnd(), keepEvenIntegers, &QLinkedList::append, QtConcurrent::OrderedReduce); QCOMPARE(linkedList2, QLinkedList() << 2 << 4); } // member-function { int sum = QtConcurrent::filteredReduced(numberLinkedList, &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); int sum2 = QtConcurrent::filteredReduced(QLinkedList(numberLinkedList), &Number::isEven, numberSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::filteredReduced(numberLinkedList.begin(), numberLinkedList.end(), &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::filteredReduced(numberLinkedList.constBegin(), numberLinkedList.constEnd(), &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberLinkedList, &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); int sum2 = QtConcurrent::blockingFilteredReduced(QLinkedList(numberLinkedList), &Number::isEven, numberSumReduce); QCOMPARE(sum2, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberLinkedList.begin(), numberLinkedList.end(), &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); } { int sum = QtConcurrent::blockingFilteredReduced(numberLinkedList.constBegin(), numberLinkedList.constEnd(), &Number::isEven, numberSumReduce); QCOMPARE(sum, 6); } // ### the same as above, with an initial result value } bool filterfn(int i) { return (i % 2); } void tst_QtConcurrentFilter::resultAt() { QList ints; for (int i=0; i < 1000; ++i) ints << i; QFuture future = QtConcurrent::filtered(ints, filterfn); future.waitForFinished(); for (int i = 0; i < future.resultCount(); ++i) { QCOMPARE(future.resultAt(i), ints.at(i * 2 + 1)); } } bool waitFilterfn(const int &i) { QTest::qWait(1); return (i % 2); } void tst_QtConcurrentFilter::incrementalResults() { const int count = 200; QList ints; for (int i=0; i < count; ++i) ints << i; QFuture future = QtConcurrent::filtered(ints, waitFilterfn); QList results; while (future.isFinished() == false) { for (int i = 0; i < future.resultCount(); ++i) { results += future.resultAt(i); } QTest::qWait(1); } QCOMPARE(future.isFinished(), true); QCOMPARE(future.resultCount(), count / 2); QCOMPARE(future.results().count(), count / 2); } void tst_QtConcurrentFilter::noDetach() { { QList l = QList() << 1; QVERIFY(l.isDetached()); QList ll = l; QVERIFY(l.isDetached() == false); QtConcurrent::filtered(l, waitFilterfn).waitForFinished(); QVERIFY(l.isDetached() == false); QVERIFY(ll.isDetached() == false); QtConcurrent::blockingFiltered(l, waitFilterfn); QVERIFY(l.isDetached() == false); QVERIFY(ll.isDetached() == false); QtConcurrent::filteredReduced(l, waitFilterfn, intSumReduce).waitForFinished(); QVERIFY(l.isDetached() == false); QVERIFY(ll.isDetached() == false); QtConcurrent::filter(l, waitFilterfn).waitForFinished(); if (!l.isDetached()) QEXPECT_FAIL("", "QTBUG-20688: Known unstable failure", Abort); QVERIFY(l.isDetached() == true); QVERIFY(ll.isDetached() == true); } { const QList l = QList() << 1; QVERIFY(l.isDetached()); const QList ll = l; QVERIFY(l.isDetached() == false); QtConcurrent::filtered(l, waitFilterfn).waitForFinished(); QVERIFY(l.isDetached() == false); QVERIFY(ll.isDetached() == false); QtConcurrent::filteredReduced(l, waitFilterfn, intSumReduce).waitForFinished(); QVERIFY(l.isDetached() == false); QVERIFY(ll.isDetached() == false); } } void tst_QtConcurrentFilter::stlContainers() { std::vector vector; vector.push_back(1); vector.push_back(2); std::vector vector2 = QtConcurrent::blockingFiltered(vector, waitFilterfn); QCOMPARE(vector2.size(), (std::vector::size_type)(1)); QCOMPARE(vector2[0], 1); std::list list; list.push_back(1); list.push_back(2); std::list list2 = QtConcurrent::blockingFiltered(list, waitFilterfn); QCOMPARE(list2.size(), (std::list::size_type)(1)); QCOMPARE(*list2.begin(), 1); QtConcurrent::filtered(list, waitFilterfn).waitForFinished(); QtConcurrent::filtered(vector, waitFilterfn).waitForFinished(); QtConcurrent::filtered(vector.begin(), vector.end(), waitFilterfn).waitForFinished(); QtConcurrent::blockingFilter(list, waitFilterfn); QCOMPARE(list2.size(), (std::list::size_type)(1)); QCOMPARE(*list2.begin(), 1); } QTEST_MAIN(tst_QtConcurrentFilter) #include "tst_qtconcurrentfilter.moc"