diff options
Diffstat (limited to 'src/concurrent/qtconcurrentmapkernel.h')
-rw-r--r-- | src/concurrent/qtconcurrentmapkernel.h | 204 |
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)); } |