summaryrefslogtreecommitdiffstats
path: root/src/concurrent/qtconcurrentfilter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/concurrent/qtconcurrentfilter.h')
-rw-r--r--src/concurrent/qtconcurrentfilter.h616
1 files changed, 351 insertions, 265 deletions
diff --git a/src/concurrent/qtconcurrentfilter.h b/src/concurrent/qtconcurrentfilter.h
index e383118874..d9fbc1b019 100644
--- a/src/concurrent/qtconcurrentfilter.h
+++ b/src/concurrent/qtconcurrentfilter.h
@@ -1,48 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtConcurrent module 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 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 Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** 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-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTCONCURRENT_FILTER_H
#define QTCONCURRENT_FILTER_H
+#if 0
+#pragma qt_class(QtConcurrentFilter)
+#endif
+
#include <QtConcurrent/qtconcurrent_global.h>
-#if !defined(QT_NO_CONCURRENT) || defined(Q_CLANG_QDOC)
+#if !defined(QT_NO_CONCURRENT) || defined(Q_QDOC)
#include <QtConcurrent/qtconcurrentfilterkernel.h>
#include <QtConcurrent/qtconcurrentfunctionwrappers.h>
@@ -54,132 +22,167 @@ namespace QtConcurrent {
//! [QtConcurrent-1]
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor>
ThreadEngineStarter<void> filterInternal(QThreadPool *pool, Sequence &sequence,
- KeepFunctor keep, ReduceFunctor reduce)
+ KeepFunctor &&keep, ReduceFunctor &&reduce)
{
- typedef FilterKernel<Sequence, KeepFunctor, ReduceFunctor> KernelType;
- return startThreadEngine(new KernelType(pool, sequence, keep, reduce));
+ typedef FilterKernel<Sequence, std::decay_t<KeepFunctor>, std::decay_t<ReduceFunctor>>
+ KernelType;
+ return startThreadEngine(new KernelType(pool, sequence, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce)));
}
// filter() on sequences
template <typename Sequence, typename KeepFunctor>
-QFuture<void> filter(QThreadPool *pool, Sequence &sequence, KeepFunctor keep)
+QFuture<void> filter(QThreadPool *pool, Sequence &sequence, KeepFunctor &&keep)
{
- return filterInternal(pool, sequence, keep, QtPrivate::PushBackWrapper());
+ return filterInternal(pool, sequence, std::forward<KeepFunctor>(keep),
+ QtPrivate::PushBackWrapper());
}
template <typename Sequence, typename KeepFunctor>
-QFuture<void> filter(Sequence &sequence, KeepFunctor keep)
+QFuture<void> filter(Sequence &sequence, KeepFunctor &&keep)
{
return filterInternal(QThreadPool::globalInstance(),
- sequence, keep, QtPrivate::PushBackWrapper());
+ sequence, std::forward<KeepFunctor>(keep), QtPrivate::PushBackWrapper());
}
// filteredReduced() on sequences
template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor>
QFuture<ResultType> filteredReduced(QThreadPool *pool,
- const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(pool, sequence, keep, reduce, options);
+ return startFilteredReduced<ResultType>(pool, std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
}
template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor>
-QFuture<ResultType> filteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+QFuture<ResultType> filteredReduced(Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- sequence, keep, reduce, options);
+ return startFilteredReduced<ResultType>(
+ QThreadPool::globalInstance(), std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce), options);
}
+#ifdef Q_QDOC
+template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType>
+#else
template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
QFuture<ResultType> filteredReduced(QThreadPool *pool,
- const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(pool, sequence, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return startFilteredReduced<ResultType>(
+ pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
+#ifdef Q_QDOC
+template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType>
+#else
template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
-QFuture<ResultType> filteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
+QFuture<ResultType> filteredReduced(Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(QThreadPool::globalInstance(), sequence, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return startFilteredReduced<ResultType>(
+ QThreadPool::globalInstance(), std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ std::enable_if_t<QtPrivate::isInvocable<KeepFunctor, Sequence>::value, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
QFuture<ResultType> filteredReduced(QThreadPool *pool,
- const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(pool, sequence, keep, reduce, options);
+ return startFilteredReduced<ResultType>(pool, std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
}
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
-QFuture<ResultType> filteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ std::enable_if_t<QtPrivate::isInvocable<KeepFunctor, Sequence>::value, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
+QFuture<ResultType> filteredReduced(Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- sequence, keep, reduce, options);
+ return startFilteredReduced<ResultType>(
+ QThreadPool::globalInstance(), std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce), options);
}
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInvocable<KeepFunctor, Sequence>::value, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type,
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
QFuture<ResultType> filteredReduced(QThreadPool *pool,
- const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(pool, sequence, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return startFilteredReduced<ResultType>(
+ pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
-QFuture<ResultType> filteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ std::enable_if_t<QtPrivate::isInvocable<KeepFunctor, Sequence>::value, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type,
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+QFuture<ResultType> filteredReduced(Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(QThreadPool::globalInstance(), sequence, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return startFilteredReduced<ResultType>(
+ QThreadPool::globalInstance(), std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
#endif
@@ -188,131 +191,157 @@ template <typename ResultType, typename Iterator, typename KeepFunctor, typename
QFuture<ResultType> filteredReduced(QThreadPool *pool,
Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(pool, begin, end, keep, reduce, options);
+ return startFilteredReduced<ResultType>(pool, begin, end, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
}
template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor>
QFuture<ResultType> filteredReduced(Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(QThreadPool::globalInstance(), begin, end, keep, reduce,
- options);
+ return startFilteredReduced<ResultType>(QThreadPool::globalInstance(), begin, end,
+ std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
}
+#ifdef Q_QDOC
+template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType>
+#else
template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
QFuture<ResultType> filteredReduced(QThreadPool *pool,
Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(pool, begin, end, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return startFilteredReduced<ResultType>(
+ pool, begin, end, std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
+#ifdef Q_QDOC
+template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType>
+#else
template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
QFuture<ResultType> filteredReduced(Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(QThreadPool::globalInstance(), begin, end, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return startFilteredReduced<ResultType>(
+ QThreadPool::globalInstance(), begin, end, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
QFuture<ResultType> filteredReduced(QThreadPool *pool,
Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(pool, begin, end, keep, reduce, options);
+ return startFilteredReduced<ResultType>(pool, begin, end, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
}
template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
QFuture<ResultType> filteredReduced(Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- begin, end, keep, reduce, options);
+ return startFilteredReduced<ResultType>(QThreadPool::globalInstance(), begin, end,
+ std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
}
template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
QFuture<ResultType> filteredReduced(QThreadPool *pool,
Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(pool, begin, end, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return startFilteredReduced<ResultType>(
+ pool, begin, end, std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ std::enable_if_t<QtPrivate::isIterator_v<Iterator>, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
QFuture<ResultType> filteredReduced(Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- return startFilteredReduced<ResultType>(QThreadPool::globalInstance(), begin, end, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return startFilteredReduced<ResultType>(
+ QThreadPool::globalInstance(), begin, end, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
#endif
// filtered() on sequences
template <typename Sequence, typename KeepFunctor>
-QFuture<typename Sequence::value_type> filtered(QThreadPool *pool,
- const Sequence &sequence,
- KeepFunctor keep)
+QFuture<typename std::decay_t<Sequence>::value_type> filtered(QThreadPool *pool,Sequence &&sequence,
+ KeepFunctor &&keep)
{
- return startFiltered(pool, sequence, keep);
+ return startFiltered(pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep));
}
template <typename Sequence, typename KeepFunctor>
-QFuture<typename Sequence::value_type> filtered(const Sequence &sequence, KeepFunctor keep)
+QFuture<typename std::decay_t<Sequence>::value_type> filtered(Sequence &&sequence,
+ KeepFunctor &&keep)
{
- return startFiltered(QThreadPool::globalInstance(), sequence, keep);
+ return startFiltered(QThreadPool::globalInstance(), std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep));
}
// filtered() on iterators
@@ -320,151 +349,181 @@ template <typename Iterator, typename KeepFunctor>
QFuture<typename qValueType<Iterator>::value_type> filtered(QThreadPool *pool,
Iterator begin,
Iterator end,
- KeepFunctor keep)
+ KeepFunctor &&keep)
{
- return startFiltered(pool, begin, end, keep);
+ return startFiltered(pool, begin, end, std::forward<KeepFunctor>(keep));
}
template <typename Iterator, typename KeepFunctor>
QFuture<typename qValueType<Iterator>::value_type> filtered(Iterator begin,
Iterator end,
- KeepFunctor keep)
+ KeepFunctor &&keep)
{
- return startFiltered(QThreadPool::globalInstance(), begin, end, keep);
+ return startFiltered(QThreadPool::globalInstance(), begin, end,
+ std::forward<KeepFunctor>(keep));
}
// blocking filter() on sequences
template <typename Sequence, typename KeepFunctor>
-void blockingFilter(QThreadPool *pool, Sequence &sequence, KeepFunctor keep)
+void blockingFilter(QThreadPool *pool, Sequence &sequence, KeepFunctor &&keep)
{
- QFuture<void> future = filterInternal(pool, sequence, keep, QtPrivate::PushBackWrapper());
+ QFuture<void> future = filter(pool, sequence, std::forward<KeepFunctor>(keep));
future.waitForFinished();
}
template <typename Sequence, typename KeepFunctor>
-void blockingFilter(Sequence &sequence, KeepFunctor keep)
+void blockingFilter(Sequence &sequence, KeepFunctor &&keep)
{
- QFuture<void> future = filterInternal(QThreadPool::globalInstance(), sequence, keep,
- QtPrivate::PushBackWrapper());
+ QFuture<void> future = filter(sequence, std::forward<KeepFunctor>(keep));
future.waitForFinished();
}
// blocking filteredReduced() on sequences
template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor>
ResultType blockingFilteredReduced(QThreadPool *pool,
- const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(pool, sequence, keep,
- reduce, options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+ return future.takeResult();
}
template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor>
-ResultType blockingFilteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ResultType blockingFilteredReduced(Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- sequence, keep, reduce, options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+ return future.takeResult();
}
+#ifdef Q_QDOC
+template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType>
+#else
template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
ResultType blockingFilteredReduced(QThreadPool *pool,
- const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(pool, sequence, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return future.takeResult();
}
+#ifdef Q_QDOC
+template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType>
+#else
template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
-ResultType blockingFilteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
+ResultType blockingFilteredReduced(Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- sequence, keep, reduce, ResultType(std::forward<InitialValueType>(initialValue)), options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return future.takeResult();
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ std::enable_if_t<QtPrivate::isInvocable<KeepFunctor, Sequence>::value, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
ResultType blockingFilteredReduced(QThreadPool *pool,
- const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(pool, sequence, keep,
- reduce, options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+ return future.takeResult();
}
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
-ResultType blockingFilteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ std::enable_if_t<QtPrivate::isInvocable<KeepFunctor, Sequence>::value, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
+ResultType blockingFilteredReduced(Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- sequence, keep, reduce, options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+ return future.takeResult();
}
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInvocable<KeepFunctor, Sequence>::value, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type,
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
ResultType blockingFilteredReduced(QThreadPool *pool,
- const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(pool, sequence, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return future.takeResult();
}
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
-ResultType blockingFilteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ std::enable_if_t<QtPrivate::isInvocable<KeepFunctor, Sequence>::value, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type,
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+ResultType blockingFilteredReduced(Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- sequence, keep, reduce, ResultType(std::forward<InitialValueType>(initialValue)), options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return future.takeResult();
}
#endif
@@ -473,155 +532,182 @@ template <typename ResultType, typename Iterator, typename KeepFunctor, typename
ResultType blockingFilteredReduced(QThreadPool *pool,
Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(pool, begin, end, keep,
- reduce, options);
- return future.result();
+ QFuture<ResultType> future =
+ filteredReduced<ResultType>(pool, begin, end, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+ return future.takeResult();
}
template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor>
ResultType blockingFilteredReduced(Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- begin, end, keep, reduce, options);
- return future.result();
+ QFuture<ResultType> future =
+ filteredReduced<ResultType>(begin, end, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+ return future.takeResult();
}
+#ifdef Q_QDOC
+template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType>
+#else
template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
ResultType blockingFilteredReduced(QThreadPool *pool,
Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(pool, begin, end, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ pool, begin, end, std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return future.takeResult();
}
+#ifdef Q_QDOC
+template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType>
+#else
template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
ResultType blockingFilteredReduced(Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- begin, end, keep, reduce, ResultType(std::forward<InitialValueType>(initialValue)), options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ begin, end, std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return future.takeResult();
}
-#ifndef Q_CLANG_QDOC
+#ifndef Q_QDOC
template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
ResultType blockingFilteredReduced(QThreadPool *pool,
Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(pool, begin, end, keep,
- reduce, options);
- return future.result();
+ QFuture<ResultType> future =
+ filteredReduced<ResultType>(pool, begin, end, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+ return future.takeResult();
}
template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
ResultType blockingFilteredReduced(Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- begin, end, keep, reduce, options);
- return future.result();
+ QFuture<ResultType> future =
+ filteredReduced<ResultType>(begin, end, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+ return future.takeResult();
}
template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
ResultType blockingFilteredReduced(QThreadPool *pool,
Iterator begin,
- Iterator end, KeepFunctor keep,
- ReduceFunctor reduce,
+ Iterator end, KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(pool, begin, end, keep, reduce,
- ResultType(std::forward<InitialValueType>(initialValue)), options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ pool, begin, end, std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return future.takeResult();
}
template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
- typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType,
+ std::enable_if_t<QtPrivate::isIterator_v<Iterator>, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type,
typename InitialValueType,
- std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0>
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
ResultType blockingFilteredReduced(Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
InitialValueType &&initialValue,
ReduceOptions options = ReduceOptions(UnorderedReduce
| SequentialReduce))
{
- QFuture<ResultType> future = startFilteredReduced<ResultType>(QThreadPool::globalInstance(),
- begin, end, keep, reduce, ResultType(std::forward<InitialValueType>(initialValue)), options);
- return future.result();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ begin, end, std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return future.takeResult();
}
#endif
// blocking filtered() on sequences
template <typename Sequence, typename KeepFunctor>
-Sequence blockingFiltered(QThreadPool *pool, const Sequence &sequence, KeepFunctor keep)
+std::decay_t<Sequence> blockingFiltered(QThreadPool *pool, Sequence &&sequence, KeepFunctor &&keep)
{
- return blockingFilteredReduced<Sequence>(pool, sequence, keep, QtPrivate::PushBackWrapper(),
- OrderedReduce);
+ return blockingFilteredReduced<std::decay_t<Sequence>>(
+ pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ QtPrivate::PushBackWrapper(), OrderedReduce);
}
template <typename Sequence, typename KeepFunctor>
-Sequence blockingFiltered(const Sequence &sequence, KeepFunctor keep)
+std::decay_t<Sequence> blockingFiltered(Sequence &&sequence, KeepFunctor &&keep)
{
- return blockingFilteredReduced<Sequence>(QThreadPool::globalInstance(), sequence, keep,
- QtPrivate::PushBackWrapper(), OrderedReduce);
+ return blockingFilteredReduced<std::decay_t<Sequence>>(
+ QThreadPool::globalInstance(), std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep), QtPrivate::PushBackWrapper(), OrderedReduce);
}
// blocking filtered() on iterators
template <typename OutputSequence, typename Iterator, typename KeepFunctor>
-OutputSequence blockingFiltered(QThreadPool *pool, Iterator begin, Iterator end, KeepFunctor keep)
+OutputSequence blockingFiltered(QThreadPool *pool, Iterator begin, Iterator end, KeepFunctor &&keep)
{
- return blockingFilteredReduced<OutputSequence>(pool, begin, end, keep,
- QtPrivate::PushBackWrapper(), OrderedReduce);
+ return blockingFilteredReduced<OutputSequence>(pool, begin, end,
+ std::forward<KeepFunctor>(keep),
+ QtPrivate::PushBackWrapper(), OrderedReduce);
}
template <typename OutputSequence, typename Iterator, typename KeepFunctor>
-OutputSequence blockingFiltered(Iterator begin, Iterator end, KeepFunctor keep)
+OutputSequence blockingFiltered(Iterator begin, Iterator end, KeepFunctor &&keep)
{
- return blockingFilteredReduced<OutputSequence>(QThreadPool::globalInstance(), begin, end, keep,
- QtPrivate::PushBackWrapper(), OrderedReduce);
+ return blockingFilteredReduced<OutputSequence>(QThreadPool::globalInstance(), begin, end,
+ std::forward<KeepFunctor>(keep),
+ QtPrivate::PushBackWrapper(), OrderedReduce);
}
} // namespace QtConcurrent