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.h747
1 files changed, 621 insertions, 126 deletions
diff --git a/src/concurrent/qtconcurrentfilter.h b/src/concurrent/qtconcurrentfilter.h
index d01b351ad0..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>
@@ -53,166 +21,693 @@ namespace QtConcurrent {
//! [QtConcurrent-1]
template <typename Sequence, typename KeepFunctor, typename ReduceFunctor>
-ThreadEngineStarter<void> filterInternal(Sequence &sequence, KeepFunctor keep, ReduceFunctor reduce)
+ThreadEngineStarter<void> filterInternal(QThreadPool *pool, Sequence &sequence,
+ KeepFunctor &&keep, ReduceFunctor &&reduce)
{
- typedef FilterKernel<Sequence, KeepFunctor, ReduceFunctor> KernelType;
- return startThreadEngine(new KernelType(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(Sequence &sequence, KeepFunctor keep)
+QFuture<void> filter(QThreadPool *pool, Sequence &sequence, KeepFunctor &&keep)
{
- return filterInternal(sequence, QtPrivate::createFunctionWrapper(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)
+{
+ return filterInternal(QThreadPool::globalInstance(),
+ sequence, std::forward<KeepFunctor>(keep), QtPrivate::PushBackWrapper());
}
// filteredReduced() on sequences
template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor>
-QFuture<ResultType> filteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
- ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
+QFuture<ResultType> filteredReduced(QThreadPool *pool,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
{
- return startFilteredReduced<ResultType>(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::createFunctionWrapper(reduce), options);
+ return startFilteredReduced<ResultType>(pool, std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
}
-#ifndef Q_CLANG_QDOC
-template <typename Sequence, typename KeepFunctor, typename ReduceFunctor>
-QFuture<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> filteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
- ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
+template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor>
+QFuture<ResultType> filteredReduced(Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
{
- return startFilteredReduced<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
- (sequence,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::createFunctionWrapper(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<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
+QFuture<ResultType> filteredReduced(QThreadPool *pool,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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<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(), std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+}
+
+#ifndef Q_QDOC
+template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ std::enable_if_t<QtPrivate::isInvocable<KeepFunctor, Sequence>::value, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
+QFuture<ResultType> filteredReduced(QThreadPool *pool,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startFilteredReduced<ResultType>(pool, std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+}
+
+template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ 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(), std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce), options);
+}
+
+template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ typename InitialValueType,
+ 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,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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 InitialValueType,
+ 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(), std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep), std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
}
#endif
// filteredReduced() on iterators
template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor>
+QFuture<ResultType> filteredReduced(QThreadPool *pool,
+ Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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,
- ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
{
- return startFilteredReduced<ResultType>(begin, end, QtPrivate::createFunctionWrapper(keep), QtPrivate::createFunctionWrapper(reduce), options);
+ return startFilteredReduced<ResultType>(QThreadPool::globalInstance(), begin, end,
+ std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
}
-#ifndef Q_CLANG_QDOC
-template <typename Iterator, typename KeepFunctor, typename ReduceFunctor>
-QFuture<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> filteredReduced(Iterator begin,
+#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<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
+QFuture<ResultType> filteredReduced(QThreadPool *pool,
+ Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
+QFuture<ResultType> filteredReduced(Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ return startFilteredReduced<ResultType>(
+ QThreadPool::globalInstance(), begin, end, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+}
+
+#ifndef Q_QDOC
+template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
+QFuture<ResultType> filteredReduced(QThreadPool *pool,
+ Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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::ReduceResultTypeHelper<ReduceFunctor>::type>
+QFuture<ResultType> filteredReduced(Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
- ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
{
- return startFilteredReduced<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
- (begin, end,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::createFunctionWrapper(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::ReduceResultTypeHelper<ReduceFunctor>::type,
+ typename InitialValueType,
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+QFuture<ResultType> filteredReduced(QThreadPool *pool,
+ Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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,
+ std::enable_if_t<QtPrivate::isIterator_v<Iterator>, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type,
+ typename InitialValueType,
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+QFuture<ResultType> filteredReduced(Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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(const Sequence &sequence, KeepFunctor keep)
+QFuture<typename std::decay_t<Sequence>::value_type> filtered(QThreadPool *pool,Sequence &&sequence,
+ KeepFunctor &&keep)
+{
+ return startFiltered(pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep));
+}
+
+template <typename Sequence, typename KeepFunctor>
+QFuture<typename std::decay_t<Sequence>::value_type> filtered(Sequence &&sequence,
+ KeepFunctor &&keep)
{
- return startFiltered(sequence, QtPrivate::createFunctionWrapper(keep));
+ return startFiltered(QThreadPool::globalInstance(), std::forward<Sequence>(sequence),
+ std::forward<KeepFunctor>(keep));
}
// filtered() on iterators
template <typename Iterator, typename KeepFunctor>
-QFuture<typename qValueType<Iterator>::value_type> filtered(Iterator begin, Iterator end, KeepFunctor keep)
+QFuture<typename qValueType<Iterator>::value_type> filtered(QThreadPool *pool,
+ Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep)
{
- return startFiltered(begin, end, QtPrivate::createFunctionWrapper(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)
+{
+ return startFiltered(QThreadPool::globalInstance(), begin, end,
+ std::forward<KeepFunctor>(keep));
}
// blocking filter() on sequences
template <typename Sequence, typename KeepFunctor>
-void blockingFilter(Sequence &sequence, KeepFunctor keep)
+void blockingFilter(QThreadPool *pool, Sequence &sequence, KeepFunctor &&keep)
+{
+ QFuture<void> future = filter(pool, sequence, std::forward<KeepFunctor>(keep));
+ future.waitForFinished();
+}
+
+template <typename Sequence, typename KeepFunctor>
+void blockingFilter(Sequence &sequence, KeepFunctor &&keep)
{
- filterInternal(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::PushBackWrapper()).startBlocking();
+ 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(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
- ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
+ResultType blockingFilteredReduced(QThreadPool *pool,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
{
- return startFilteredReduced<ResultType>(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::createFunctionWrapper(reduce), options)
- .startBlocking();
+ QFuture<ResultType> future = filteredReduced<ResultType>(
+ pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+ return future.takeResult();
}
-#ifndef Q_CLANG_QDOC
-template <typename Sequence, typename KeepFunctor, typename ReduceFunctor>
-typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingFilteredReduced(const Sequence &sequence,
- KeepFunctor keep,
- ReduceFunctor reduce,
- ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
+template <typename ResultType, typename Sequence, typename KeepFunctor, typename ReduceFunctor>
+ResultType blockingFilteredReduced(Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
+ResultType blockingFilteredReduced(QThreadPool *pool,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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<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 = 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_QDOC
+template <typename Sequence, typename KeepFunctor, typename ReduceFunctor,
+ std::enable_if_t<QtPrivate::isInvocable<KeepFunctor, Sequence>::value, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
+ResultType blockingFilteredReduced(QThreadPool *pool,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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,
+ 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 = 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 InitialValueType,
+ 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,
+ Sequence &&sequence,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
{
- return blockingFilteredReduced<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
- (sequence,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::createFunctionWrapper(reduce),
- options);
+ 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 InitialValueType,
+ 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 = filteredReduced<ResultType>(
+ std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce),
+ ResultType(std::forward<InitialValueType>(initialValue)), options);
+ return future.takeResult();
}
#endif
// blocking filteredReduced() on iterators
template <typename ResultType, typename Iterator, typename KeepFunctor, typename ReduceFunctor>
+ResultType blockingFilteredReduced(QThreadPool *pool,
+ Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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,
- ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
{
- return startFilteredReduced<ResultType>
- (begin, end,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::createFunctionWrapper(reduce),
- options)
- .startBlocking();
+ QFuture<ResultType> future =
+ filteredReduced<ResultType>(begin, end, std::forward<KeepFunctor>(keep),
+ std::forward<ReduceFunctor>(reduce), options);
+ return future.takeResult();
}
-#ifndef Q_CLANG_QDOC
-template <typename Iterator, typename KeepFunctor, typename ReduceFunctor>
-typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType blockingFilteredReduced(Iterator begin,
+#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<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
+ResultType blockingFilteredReduced(QThreadPool *pool,
+ Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+#endif
+ResultType blockingFilteredReduced(Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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_QDOC
+template <typename Iterator, typename KeepFunctor, typename ReduceFunctor,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type>
+ResultType blockingFilteredReduced(QThreadPool *pool,
+ Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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::ReduceResultTypeHelper<ReduceFunctor>::type>
+ResultType blockingFilteredReduced(Iterator begin,
Iterator end,
- KeepFunctor keep,
- ReduceFunctor reduce,
- ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce))
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
{
- return startFilteredReduced<typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType>
- (begin, end,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::createFunctionWrapper(reduce),
- options)
- .startBlocking();
+ 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::ReduceResultTypeHelper<ReduceFunctor>::type,
+ typename InitialValueType,
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+ResultType blockingFilteredReduced(QThreadPool *pool,
+ Iterator begin,
+ Iterator end, KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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,
+ std::enable_if_t<QtPrivate::isIterator_v<Iterator>, int> = 0,
+ typename ResultType = typename QtPrivate::ReduceResultTypeHelper<ReduceFunctor>::type,
+ typename InitialValueType,
+ std::enable_if_t<QtPrivate::isInitialValueCompatible_v<InitialValueType, ResultType>,
+ int> = 0>
+ResultType blockingFilteredReduced(Iterator begin,
+ Iterator end,
+ KeepFunctor &&keep,
+ ReduceFunctor &&reduce,
+ InitialValueType &&initialValue,
+ ReduceOptions options = ReduceOptions(UnorderedReduce
+ | SequentialReduce))
+{
+ 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(const Sequence &sequence, KeepFunctor keep)
+std::decay_t<Sequence> blockingFiltered(QThreadPool *pool, Sequence &&sequence, KeepFunctor &&keep)
{
- return startFilteredReduced<Sequence>(sequence, QtPrivate::createFunctionWrapper(keep), QtPrivate::PushBackWrapper(), OrderedReduce).startBlocking();
+ return blockingFilteredReduced<std::decay_t<Sequence>>(
+ pool, std::forward<Sequence>(sequence), std::forward<KeepFunctor>(keep),
+ QtPrivate::PushBackWrapper(), OrderedReduce);
+}
+
+template <typename Sequence, typename KeepFunctor>
+std::decay_t<Sequence> blockingFiltered(Sequence &&sequence, KeepFunctor &&keep)
+{
+ 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(Iterator begin, Iterator end, KeepFunctor keep)
+OutputSequence blockingFiltered(QThreadPool *pool, Iterator begin, Iterator end, KeepFunctor &&keep)
+{
+ 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)
{
- return startFilteredReduced<OutputSequence>(begin, end,
- QtPrivate::createFunctionWrapper(keep),
- QtPrivate::PushBackWrapper(),
- OrderedReduce).startBlocking();
+ return blockingFilteredReduced<OutputSequence>(QThreadPool::globalInstance(), begin, end,
+ std::forward<KeepFunctor>(keep),
+ QtPrivate::PushBackWrapper(), OrderedReduce);
}
} // namespace QtConcurrent