5#ifndef QTCONCURRENT_MAPKERNEL_H
6#define QTCONCURRENT_MAPKERNEL_H
8#include <QtConcurrent/qtconcurrent_global.h>
10#if !defined(QT_NO_CONCURRENT) || defined (Q_QDOC)
12#include <QtConcurrent/qtconcurrentiteratekernel.h>
13#include <QtConcurrent/qtconcurrentreducekernel.h>
14#include <QtConcurrent/qtconcurrentfunctionwrappers.h>
22template <
typename Iterator,
typename MapFunctor>
28 template <
typename F = MapFunctor>
29 MapKernel(QThreadPool *pool, Iterator begin, Iterator end, F &&_map)
35 std::invoke(map, *it);
39 bool runIterations(Iterator sequenceBeginIterator,
int beginIndex,
int endIndex,
void *)
override
41 Iterator it = sequenceBeginIterator;
42 std::advance(it, beginIndex);
43 for (
int i = beginIndex; i < endIndex; ++i) {
143template <
typename Iterator,
typename MapFunctor>
150 template <
typename F = MapFunctor>
157 *result = std::invoke(map, *it);
161 bool runIterations(Iterator sequenceBeginIterator,
int beginIndex,
int endIndex, T *results)
override
164 Iterator it = sequenceBeginIterator;
165 std::advance(it, beginIndex);
166 for (
int i = beginIndex; i < endIndex; ++i) {
167 runIteration(it, i, results + (i - beginIndex));
176template <
typename Iterator,
typename Functor>
178 Iterator end, Functor &&functor)
180 return startThreadEngine(
new MapKernel<Iterator, std::decay_t<Functor>>(
181 pool, begin, end, std::forward<Functor>(functor)));
185template <
typename T,
typename Iterator,
typename Functor>
187 Iterator end, Functor &&functor)
189 return startThreadEngine(
new MappedEachKernel<Iterator, std::decay_t<Functor>>(
190 pool, begin, end, std::forward<Functor>(functor)));
194
195
196
197template <
typename Sequence,
typename Base,
typename Functor>
200 template<
typename S = Sequence,
typename F = Functor>
211 this->sequence = Sequence();
216template <
typename T,
typename Sequence,
typename Functor>
220 using DecayedSequence = std::decay_t<Sequence>;
221 using DecayedFunctor = std::decay_t<Functor>;
222 using SequenceHolderType = SequenceHolder1<
224 MappedEachKernel<
typename DecayedSequence::const_iterator, DecayedFunctor>,
227 return startThreadEngine(
new SequenceHolderType(pool, std::forward<Sequence>(sequence),
228 std::forward<Functor>(functor)));
232template <
typename IntermediateType,
typename ResultType,
typename Sequence,
typename MapFunctor,
233 typename ReduceFunctor>
236 MapFunctor &&mapFunctor,
237 ReduceFunctor &&reduceFunctor,
238 ReduceOptions options)
240 using DecayedSequence = std::decay_t<Sequence>;
241 using DecayedMapFunctor = std::decay_t<MapFunctor>;
242 using DecayedReduceFunctor = std::decay_t<ReduceFunctor>;
243 using Iterator =
typename DecayedSequence::const_iterator;
244 using Reducer = ReduceKernel<DecayedReduceFunctor, ResultType, IntermediateType>;
245 using MappedReduceType = MappedReducedKernel<ResultType, Iterator, DecayedMapFunctor,
246 DecayedReduceFunctor, Reducer>;
247 using SequenceHolderType = SequenceHolder2<DecayedSequence, MappedReduceType, DecayedMapFunctor,
248 DecayedReduceFunctor>;
249 return startThreadEngine(
new SequenceHolderType(pool, std::forward<Sequence>(sequence),
250 std::forward<MapFunctor>(mapFunctor),
251 std::forward<ReduceFunctor>(reduceFunctor),
256template <
typename IntermediateType,
typename ResultType,
typename Iterator,
typename MapFunctor,
257 typename ReduceFunctor>
261 MapFunctor &&mapFunctor,
262 ReduceFunctor &&reduceFunctor,
263 ReduceOptions options)
266 ReduceKernel<std::decay_t<ReduceFunctor>, std::decay_t<ResultType>, IntermediateType>;
267 using MappedReduceType = MappedReducedKernel<ResultType, Iterator, std::decay_t<MapFunctor>,
268 std::decay_t<ReduceFunctor>, Reducer>;
269 return startThreadEngine(
new MappedReduceType(pool, begin, end,
270 std::forward<MapFunctor>(mapFunctor),
271 std::forward<ReduceFunctor>(reduceFunctor),
276template <
typename IntermediateType,
typename ResultType,
typename Sequence,
typename MapFunctor,
277 typename ReduceFunctor>
280 MapFunctor &&mapFunctor,
281 ReduceFunctor &&reduceFunctor,
282 ResultType &&initialValue,
283 ReduceOptions options)
285 using DecayedSequence = std::decay_t<Sequence>;
286 using DecayedMapFunctor = std::decay_t<MapFunctor>;
287 using DecayedReduceFunctor = std::decay_t<ReduceFunctor>;
288 using Iterator =
typename DecayedSequence::const_iterator;
289 using Reducer = ReduceKernel<DecayedReduceFunctor, ResultType, IntermediateType>;
290 using MappedReduceType = MappedReducedKernel<ResultType, Iterator, DecayedMapFunctor,
291 DecayedReduceFunctor, Reducer>;
292 using SequenceHolderType = SequenceHolder2<DecayedSequence, MappedReduceType, DecayedMapFunctor,
293 DecayedReduceFunctor>;
294 return startThreadEngine(
295 new SequenceHolderType(pool, std::forward<Sequence>(sequence),
296 std::forward<MapFunctor>(mapFunctor),
297 std::forward<ReduceFunctor>(reduceFunctor),
298 std::forward<ResultType>(initialValue), options));
302template <
typename IntermediateType,
typename ResultType,
typename Iterator,
typename MapFunctor,
303 typename ReduceFunctor>
307 MapFunctor &&mapFunctor,
308 ReduceFunctor &&reduceFunctor,
309 ResultType &&initialValue,
310 ReduceOptions options)
312 using Reducer = ReduceKernel<std::decay_t<ReduceFunctor>, ResultType, IntermediateType>;
313 using MappedReduceType = MappedReducedKernel<ResultType, Iterator, std::decay_t<MapFunctor>,
314 std::decay_t<ReduceFunctor>, Reducer>;
315 return startThreadEngine(
new MappedReduceType(pool, begin, end,
316 std::forward<MapFunctor>(mapFunctor),
317 std::forward<ReduceFunctor>(reduceFunctor),
318 std::forward<ResultType>(initialValue), options));
bool runIteration(Iterator it, int, void *) override
MapKernel(QThreadPool *pool, Iterator begin, Iterator end, F &&_map)
bool runIterations(Iterator sequenceBeginIterator, int beginIndex, int endIndex, void *) override
MappedEachKernel(QThreadPool *pool, Iterator begin, Iterator end, F &&_map)
bool runIteration(Iterator it, int, T *result) override
bool runIterations(Iterator sequenceBeginIterator, int beginIndex, int endIndex, T *results) override
ThreadEngineStarter< T > startMapped(QThreadPool *pool, Iterator begin, Iterator end, Functor &&functor)
[qtconcurrentmapkernel-2]
ThreadEngineStarter< ResultType > startMappedReduced(QThreadPool *pool, Sequence &&sequence, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ReduceOptions options)
[qtconcurrentmapkernel-4]
ThreadEngineStarter< T > startMapped(QThreadPool *pool, Sequence &&sequence, Functor &&functor)
[qtconcurrentmapkernel-3]
ThreadEngineStarter< ResultType > startMappedReduced(QThreadPool *pool, Sequence &&sequence, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ResultType &&initialValue, ReduceOptions options)
[qtconcurrentmapkernel-6]
ThreadEngineStarter< ResultType > startMappedReduced(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ReduceOptions options)
[qtconcurrentmapkernel-5]
ThreadEngineStarter< ResultType > startMappedReduced(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ResultType &&initialValue, ReduceOptions options)
[qtconcurrentmapkernel-7]
ThreadEngineStarter< void > startMap(QThreadPool *pool, Iterator begin, Iterator end, Functor &&functor)
[qtconcurrentmapkernel-1]
SequenceHolder1(QThreadPool *pool, S &&_sequence, F &&functor)