summaryrefslogtreecommitdiffstats
path: root/src/concurrent/qtconcurrentmapkernel.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/concurrent/qtconcurrentmapkernel.h')
-rw-r--r--src/concurrent/qtconcurrentmapkernel.h204
1 files changed, 99 insertions, 105 deletions
diff --git a/src/concurrent/qtconcurrentmapkernel.h b/src/concurrent/qtconcurrentmapkernel.h
index 11be262628..61b18e5438 100644
--- a/src/concurrent/qtconcurrentmapkernel.h
+++ b/src/concurrent/qtconcurrentmapkernel.h
@@ -1,48 +1,12 @@
-/****************************************************************************
-**
-** 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_MAPKERNEL_H
#define QTCONCURRENT_MAPKERNEL_H
#include <QtConcurrent/qtconcurrent_global.h>
-#if !defined(QT_NO_CONCURRENT) || defined (Q_CLANG_QDOC)
+#if !defined(QT_NO_CONCURRENT) || defined (Q_QDOC)
#include <QtConcurrent/qtconcurrentiteratekernel.h>
#include <QtConcurrent/qtconcurrentreducekernel.h>
@@ -60,8 +24,9 @@ class MapKernel : public IterateKernel<Iterator, void>
MapFunctor map;
public:
typedef void ReturnType;
- MapKernel(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor _map)
- : IterateKernel<Iterator, void>(pool, begin, end), map(_map)
+ template <typename F = MapFunctor>
+ MapKernel(QThreadPool *pool, Iterator begin, Iterator end, F &&_map)
+ : IterateKernel<Iterator, void>(pool, begin, end), map(std::forward<F>(_map))
{ }
bool runIteration(Iterator it, int, void *) override
@@ -92,7 +57,7 @@ template <typename ReducedResultType,
QtPrivate::MapResultType<Iterator, MapFunctor>>>
class MappedReducedKernel : public IterateKernel<Iterator, ReducedResultType>
{
- ReducedResultType reducedResult;
+ ReducedResultType &reducedResult;
MapFunctor map;
ReduceFunctor reduce;
Reducer reducer;
@@ -100,19 +65,25 @@ class MappedReducedKernel : public IterateKernel<Iterator, ReducedResultType>
public:
typedef ReducedResultType ReturnType;
- MappedReducedKernel(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor _map,
- ReduceFunctor _reduce, ReduceOptions reduceOptions)
- : IterateKernel<Iterator, ReducedResultType>(pool, begin, end), reducedResult(),
- map(_map), reduce(_reduce), reducer(pool, reduceOptions)
- { }
- MappedReducedKernel(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor _map,
- ReduceFunctor _reduce, ReducedResultType &&initialValue,
+ template<typename F1 = MapFunctor, typename F2 = ReduceFunctor>
+ MappedReducedKernel(QThreadPool *pool, Iterator begin, Iterator end, F1 &&_map, F2 &&_reduce,
ReduceOptions reduceOptions)
: IterateKernel<Iterator, ReducedResultType>(pool, begin, end),
- reducedResult(std::forward<ReducedResultType>(initialValue)),
- map(_map),
- reduce(_reduce),
+ reducedResult(this->defaultValue.value),
+ map(std::forward<F1>(_map)),
+ reduce(std::forward<F2>(_reduce)),
+ reducer(pool, reduceOptions)
+ { }
+
+ template<typename F1 = MapFunctor, typename F2 = ReduceFunctor>
+ MappedReducedKernel(QThreadPool *pool, Iterator begin, Iterator end, F1 &&_map, F2 &&_reduce,
+ ReducedResultType &&initialValue, ReduceOptions reduceOptions)
+ : IterateKernel<Iterator, ReducedResultType>(pool, begin, end,
+ std::forward<ReducedResultType>(initialValue)),
+ reducedResult(this->defaultValue.value),
+ map(std::forward<F1>(_map)),
+ reduce(std::forward<F2>(_reduce)),
reducer(pool, reduceOptions)
{
}
@@ -175,8 +146,10 @@ class MappedEachKernel : public IterateKernel<Iterator, QtPrivate::MapResultType
using T = QtPrivate::MapResultType<Iterator, MapFunctor>;
public:
- MappedEachKernel(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor _map)
- : IterateKernel<Iterator, T>(pool, begin, end), map(_map) { }
+ template <typename F = MapFunctor>
+ MappedEachKernel(QThreadPool *pool, Iterator begin, Iterator end, F &&_map)
+ : IterateKernel<Iterator, T>(pool, begin, end), map(std::forward<F>(_map))
+ { }
bool runIteration(Iterator it, int, T *result) override
{
@@ -201,17 +174,19 @@ public:
//! [qtconcurrentmapkernel-1]
template <typename Iterator, typename Functor>
inline ThreadEngineStarter<void> startMap(QThreadPool *pool, Iterator begin,
- Iterator end, Functor functor)
+ Iterator end, Functor &&functor)
{
- return startThreadEngine(new MapKernel<Iterator, Functor>(pool, begin, end, functor));
+ return startThreadEngine(new MapKernel<Iterator, std::decay_t<Functor>>(
+ pool, begin, end, std::forward<Functor>(functor)));
}
//! [qtconcurrentmapkernel-2]
template <typename T, typename Iterator, typename Functor>
inline ThreadEngineStarter<T> startMapped(QThreadPool *pool, Iterator begin,
- Iterator end, Functor functor)
+ Iterator end, Functor &&functor)
{
- return startThreadEngine(new MappedEachKernel<Iterator, Functor>(pool, begin, end, functor));
+ return startThreadEngine(new MappedEachKernel<Iterator, std::decay_t<Functor>>(
+ pool, begin, end, std::forward<Functor>(functor)));
}
/*
@@ -219,51 +194,60 @@ inline ThreadEngineStarter<T> startMapped(QThreadPool *pool, Iterator begin,
sequence we are working on.
*/
template <typename Sequence, typename Base, typename Functor>
-struct SequenceHolder1 : public Base
+struct SequenceHolder1 : private QtPrivate::SequenceHolder<Sequence>, public Base
{
- SequenceHolder1(QThreadPool *pool, const Sequence &_sequence, Functor functor)
- : Base(pool, _sequence.begin(), _sequence.end(), functor), sequence(_sequence)
+ template<typename S = Sequence, typename F = Functor>
+ SequenceHolder1(QThreadPool *pool, S &&_sequence, F &&functor)
+ : QtPrivate::SequenceHolder<Sequence>(std::forward<S>(_sequence)),
+ Base(pool, this->sequence.cbegin(), this->sequence.cend(), std::forward<F>(functor))
{ }
- Sequence sequence;
-
void finish() override
{
Base::finish();
// Clear the sequence to make sure all temporaries are destroyed
// before finished is signaled.
- sequence = Sequence();
+ this->sequence = Sequence();
}
};
//! [qtconcurrentmapkernel-3]
template <typename T, typename Sequence, typename Functor>
-inline ThreadEngineStarter<T> startMapped(QThreadPool *pool, const Sequence &sequence,
- Functor functor)
+inline ThreadEngineStarter<T> startMapped(QThreadPool *pool, Sequence &&sequence,
+ Functor &&functor)
{
- typedef SequenceHolder1<Sequence,
- MappedEachKernel<typename Sequence::const_iterator , Functor>, Functor>
- SequenceHolderType;
-
- return startThreadEngine(new SequenceHolderType(pool, sequence, functor));
+ using DecayedSequence = std::decay_t<Sequence>;
+ using DecayedFunctor = std::decay_t<Functor>;
+ using SequenceHolderType = SequenceHolder1<
+ DecayedSequence,
+ MappedEachKernel<typename DecayedSequence::const_iterator, DecayedFunctor>,
+ DecayedFunctor>;
+
+ return startThreadEngine(new SequenceHolderType(pool, std::forward<Sequence>(sequence),
+ std::forward<Functor>(functor)));
}
//! [qtconcurrentmapkernel-4]
template <typename IntermediateType, typename ResultType, typename Sequence, typename MapFunctor,
typename ReduceFunctor>
inline ThreadEngineStarter<ResultType> startMappedReduced(QThreadPool *pool,
- const Sequence & sequence,
- MapFunctor mapFunctor,
- ReduceFunctor reduceFunctor,
+ Sequence &&sequence,
+ MapFunctor &&mapFunctor,
+ ReduceFunctor &&reduceFunctor,
ReduceOptions options)
{
- typedef typename Sequence::const_iterator Iterator;
- typedef ReduceKernel<ReduceFunctor, ResultType, IntermediateType> Reducer;
- typedef MappedReducedKernel<ResultType, Iterator, MapFunctor, ReduceFunctor, Reducer>
- MappedReduceType;
- typedef SequenceHolder2<Sequence, MappedReduceType, MapFunctor, ReduceFunctor>
- SequenceHolderType;
- return startThreadEngine(new SequenceHolderType(pool, sequence, mapFunctor, reduceFunctor,
+ using DecayedSequence = std::decay_t<Sequence>;
+ using DecayedMapFunctor = std::decay_t<MapFunctor>;
+ using DecayedReduceFunctor = std::decay_t<ReduceFunctor>;
+ using Iterator = typename DecayedSequence::const_iterator;
+ using Reducer = ReduceKernel<DecayedReduceFunctor, ResultType, IntermediateType>;
+ using MappedReduceType = MappedReducedKernel<ResultType, Iterator, DecayedMapFunctor,
+ DecayedReduceFunctor, Reducer>;
+ using SequenceHolderType = SequenceHolder2<DecayedSequence, MappedReduceType, DecayedMapFunctor,
+ DecayedReduceFunctor>;
+ return startThreadEngine(new SequenceHolderType(pool, std::forward<Sequence>(sequence),
+ std::forward<MapFunctor>(mapFunctor),
+ std::forward<ReduceFunctor>(reduceFunctor),
options));
}
@@ -273,14 +257,17 @@ template <typename IntermediateType, typename ResultType, typename Iterator, typ
inline ThreadEngineStarter<ResultType> startMappedReduced(QThreadPool *pool,
Iterator begin,
Iterator end,
- MapFunctor mapFunctor,
- ReduceFunctor reduceFunctor,
+ MapFunctor &&mapFunctor,
+ ReduceFunctor &&reduceFunctor,
ReduceOptions options)
{
- typedef ReduceKernel<ReduceFunctor, ResultType, IntermediateType> Reducer;
- typedef MappedReducedKernel<ResultType, Iterator, MapFunctor, ReduceFunctor, Reducer>
- MappedReduceType;
- return startThreadEngine(new MappedReduceType(pool, begin, end, mapFunctor, reduceFunctor,
+ using Reducer =
+ ReduceKernel<std::decay_t<ReduceFunctor>, std::decay_t<ResultType>, IntermediateType>;
+ using MappedReduceType = MappedReducedKernel<ResultType, Iterator, std::decay_t<MapFunctor>,
+ std::decay_t<ReduceFunctor>, Reducer>;
+ return startThreadEngine(new MappedReduceType(pool, begin, end,
+ std::forward<MapFunctor>(mapFunctor),
+ std::forward<ReduceFunctor>(reduceFunctor),
options));
}
@@ -288,21 +275,26 @@ inline ThreadEngineStarter<ResultType> startMappedReduced(QThreadPool *pool,
template <typename IntermediateType, typename ResultType, typename Sequence, typename MapFunctor,
typename ReduceFunctor>
inline ThreadEngineStarter<ResultType> startMappedReduced(QThreadPool *pool,
- const Sequence &sequence,
- MapFunctor mapFunctor,
- ReduceFunctor reduceFunctor,
+ Sequence &&sequence,
+ MapFunctor &&mapFunctor,
+ ReduceFunctor &&reduceFunctor,
ResultType &&initialValue,
ReduceOptions options)
{
- typedef typename Sequence::const_iterator Iterator;
- typedef ReduceKernel<ReduceFunctor, ResultType, IntermediateType> Reducer;
- typedef MappedReducedKernel<ResultType, Iterator, MapFunctor, ReduceFunctor, Reducer>
- MappedReduceType;
- typedef SequenceHolder2<Sequence, MappedReduceType, MapFunctor, ReduceFunctor>
- SequenceHolderType;
- return startThreadEngine(new SequenceHolderType(
- pool, sequence, mapFunctor, reduceFunctor, std::forward<ResultType>(initialValue),
- options));
+ using DecayedSequence = std::decay_t<Sequence>;
+ using DecayedMapFunctor = std::decay_t<MapFunctor>;
+ using DecayedReduceFunctor = std::decay_t<ReduceFunctor>;
+ using Iterator = typename DecayedSequence::const_iterator;
+ using Reducer = ReduceKernel<DecayedReduceFunctor, ResultType, IntermediateType>;
+ using MappedReduceType = MappedReducedKernel<ResultType, Iterator, DecayedMapFunctor,
+ DecayedReduceFunctor, Reducer>;
+ using SequenceHolderType = SequenceHolder2<DecayedSequence, MappedReduceType, DecayedMapFunctor,
+ DecayedReduceFunctor>;
+ return startThreadEngine(
+ new SequenceHolderType(pool, std::forward<Sequence>(sequence),
+ std::forward<MapFunctor>(mapFunctor),
+ std::forward<ReduceFunctor>(reduceFunctor),
+ std::forward<ResultType>(initialValue), options));
}
//! [qtconcurrentmapkernel-7]
@@ -311,15 +303,17 @@ template <typename IntermediateType, typename ResultType, typename Iterator, typ
inline ThreadEngineStarter<ResultType> startMappedReduced(QThreadPool *pool,
Iterator begin,
Iterator end,
- MapFunctor mapFunctor,
- ReduceFunctor reduceFunctor,
+ MapFunctor &&mapFunctor,
+ ReduceFunctor &&reduceFunctor,
ResultType &&initialValue,
ReduceOptions options)
{
- typedef ReduceKernel<ReduceFunctor, ResultType, IntermediateType> Reducer;
- typedef MappedReducedKernel<ResultType, Iterator, MapFunctor, ReduceFunctor, Reducer>
- MappedReduceType;
- return startThreadEngine(new MappedReduceType(pool, begin, end, mapFunctor, reduceFunctor,
+ using Reducer = ReduceKernel<std::decay_t<ReduceFunctor>, ResultType, IntermediateType>;
+ using MappedReduceType = MappedReducedKernel<ResultType, Iterator, std::decay_t<MapFunctor>,
+ std::decay_t<ReduceFunctor>, Reducer>;
+ return startThreadEngine(new MappedReduceType(pool, begin, end,
+ std::forward<MapFunctor>(mapFunctor),
+ std::forward<ReduceFunctor>(reduceFunctor),
std::forward<ResultType>(initialValue), options));
}