4#ifndef QTCONCURRENT_FILTERKERNEL_H
5#define QTCONCURRENT_FILTERKERNEL_H
7#include <QtConcurrent/qtconcurrent_global.h>
9#if !defined(QT_NO_CONCURRENT) || defined (Q_QDOC)
11#include <QtConcurrent/qtconcurrentiteratekernel.h>
12#include <QtConcurrent/qtconcurrentmapkernel.h>
13#include <QtConcurrent/qtconcurrentreducekernel.h>
40template <
typename Sequence,
typename KeepFunctor,
typename ReduceFunctor>
43 typedef ReduceKernel<ReduceFunctor, Sequence,
typename Sequence::value_type> Reducer;
44 typedef IterateKernel<
typename Sequence::const_iterator,
void> IterateKernelType;
47 Sequence reducedResult;
54 template <
typename Keep = KeepFunctor,
typename Reduce = ReduceFunctor>
55 FilterKernel(QThreadPool *pool, Sequence &_sequence, Keep &&_keep, Reduce &&_reduce)
64 bool runIteration(
typename Sequence::const_iterator it,
int index, T *)
override
66 IntermediateResults<
typename Sequence::value_type> results;
67 results.begin = index;
68 results.end = index + 1;
70 if (std::invoke(keep, *it))
71 results.vector.append(*it);
73 reducer.runReduce(reduce, reducedResult, results);
77 bool runIterations(
typename Sequence::const_iterator sequenceBeginIterator,
int begin,
int end, T *)
override
79 IntermediateResults<
typename Sequence::value_type> results;
80 results.begin = begin;
82 results.vector.reserve(end - begin);
85 typename Sequence::const_iterator it = sequenceBeginIterator;
86 std::advance(it, begin);
87 for (
int i = begin; i < end; ++i) {
88 if (std::invoke(keep, *it))
89 results.vector.append(*it);
93 reducer.runReduce(reduce, reducedResult, results);
99 reducer.finish(reduce, reducedResult);
100 sequence = std::move(reducedResult);
105 return IterateKernelType::shouldThrottleThread() || reducer.shouldThrottle();
110 return IterateKernelType::shouldStartThread() && reducer.shouldStartThread();
118template <
typename ReducedResultType,
120 typename KeepFunctor,
121 typename ReduceFunctor,
127 ReducedResultType &reducedResult;
129 ReduceFunctor reduce;
131 typedef IterateKernel<Iterator, ReducedResultType> IterateKernelType;
134 template<
typename Keep = KeepFunctor,
typename Reduce = ReduceFunctor>
136 Reduce &&_reduce, ReduceOptions reduceOption)
138 reducedResult(
this->defaultValue.value),
141 reducer(pool, reduceOption)
144 template <
typename Keep = KeepFunctor,
typename Reduce = ReduceFunctor>
146 Reduce &&_reduce, ReducedResultType &&initialValue,
147 ReduceOptions reduceOption)
149 reducedResult(
this->defaultValue.value),
152 reducer(pool, reduceOption)
156 bool runIteration(Iterator it,
int index, ReducedResultType *)
override
158 IntermediateResults<
typename qValueType<Iterator>::value_type> results;
159 results.begin = index;
160 results.end = index + 1;
162 if (std::invoke(keep, *it))
163 results.vector.append(*it);
165 reducer.runReduce(reduce, reducedResult, results);
169 bool runIterations(Iterator sequenceBeginIterator,
int begin,
int end, ReducedResultType *)
override
171 IntermediateResults<
typename qValueType<Iterator>::value_type> results;
172 results.begin = begin;
174 results.vector.reserve(end - begin);
176 Iterator it = sequenceBeginIterator;
177 std::advance(it, begin);
178 for (
int i = begin; i < end; ++i) {
179 if (std::invoke(keep, *it))
180 results.vector.append(*it);
184 reducer.runReduce(reduce, reducedResult, results);
190 reducer.finish(reduce, reducedResult);
195 return IterateKernelType::shouldThrottleThread() || reducer.shouldThrottle();
200 return IterateKernelType::shouldStartThread() && reducer.shouldStartThread();
207 return &reducedResult;
212template <
typename Iterator,
typename KeepFunctor>
215 typedef typename qValueType<Iterator>::value_type T;
216 typedef IterateKernel<Iterator, T> IterateKernelType;
224 template <
typename Keep = KeepFunctor>
231 if (
this->futureInterface)
232 this->futureInterface->setFilterMode(
true);
233 IterateKernelType::start();
238 if (std::invoke(keep, *it))
239 this->reportResult(&(*it), index);
241 this->reportResult(
nullptr, index);
245 bool runIterations(Iterator sequenceBeginIterator,
int begin,
int end, T *)
override
247 const int count = end - begin;
248 IntermediateResults<
typename qValueType<Iterator>::value_type> results;
249 results.begin = begin;
251 results.vector.reserve(count);
253 Iterator it = sequenceBeginIterator;
254 std::advance(it, begin);
255 for (
int i = begin; i < end; ++i) {
256 if (std::invoke(keep, *it))
257 results.vector.append(*it);
261 this->reportResults(results.vector, begin, count);
267template <
typename Iterator,
typename KeepFunctor>
270startFiltered(QThreadPool *pool, Iterator begin, Iterator end, KeepFunctor &&functor)
272 return startThreadEngine(
new FilteredEachKernel<Iterator, std::decay_t<KeepFunctor>>
273 (pool, begin, end, std::forward<KeepFunctor>(functor)));
277template <
typename Sequence,
typename KeepFunctor>
278inline decltype(
auto)
startFiltered(QThreadPool *pool, Sequence &&sequence, KeepFunctor &&functor)
280 using DecayedSequence = std::decay_t<Sequence>;
281 using DecayedFunctor = std::decay_t<KeepFunctor>;
282 using SequenceHolderType = SequenceHolder1<DecayedSequence,
283 FilteredEachKernel<
typename DecayedSequence::const_iterator, DecayedFunctor>,
285 return startThreadEngine(
new SequenceHolderType(pool, std::forward<Sequence>(sequence),
286 std::forward<KeepFunctor>(functor)));
290template <
typename ResultType,
typename Sequence,
typename MapFunctor,
typename ReduceFunctor>
293 MapFunctor &&mapFunctor,
294 ReduceFunctor &&reduceFunctor,
295 ReduceOptions options)
297 using DecayedSequence = std::decay_t<Sequence>;
298 using DecayedMapFunctor = std::decay_t<MapFunctor>;
299 using DecayedReduceFunctor = std::decay_t<ReduceFunctor>;
300 using Iterator =
typename DecayedSequence::const_iterator;
301 using Reducer = ReduceKernel<DecayedReduceFunctor, ResultType,
302 typename qValueType<Iterator>::value_type>;
303 using FilteredReduceType = FilteredReducedKernel<ResultType, Iterator, DecayedMapFunctor,
304 DecayedReduceFunctor, Reducer>;
305 using SequenceHolderType = SequenceHolder2<DecayedSequence, FilteredReduceType,
306 DecayedMapFunctor, DecayedReduceFunctor>;
307 return startThreadEngine(
new SequenceHolderType(pool, std::forward<Sequence>(sequence),
308 std::forward<MapFunctor>(mapFunctor),
309 std::forward<ReduceFunctor>(reduceFunctor),
315template <
typename ResultType,
typename Iterator,
typename MapFunctor,
typename ReduceFunctor>
319 MapFunctor &&mapFunctor,
320 ReduceFunctor &&reduceFunctor,
321 ReduceOptions options)
323 using Reducer = ReduceKernel<std::decay_t<ReduceFunctor>, ResultType,
324 typename qValueType<Iterator>::value_type>;
325 using FilteredReduceType = FilteredReducedKernel<ResultType, Iterator, std::decay_t<MapFunctor>,
326 std::decay_t<ReduceFunctor>, Reducer>;
327 return startThreadEngine(
328 new FilteredReduceType(pool, begin, end, std::forward<MapFunctor>(mapFunctor),
329 std::forward<ReduceFunctor>(reduceFunctor), options));
334template <
typename ResultType,
typename Sequence,
typename MapFunctor,
typename ReduceFunctor>
337 MapFunctor &&mapFunctor,
338 ReduceFunctor &&reduceFunctor,
339 ResultType &&initialValue,
340 ReduceOptions options)
342 using DecayedSequence = std::decay_t<Sequence>;
343 using DecayedMapFunctor = std::decay_t<MapFunctor>;
344 using DecayedReduceFunctor = std::decay_t<ReduceFunctor>;
345 using Iterator =
typename DecayedSequence::const_iterator;
346 using Reducer = ReduceKernel<DecayedReduceFunctor, ResultType,
347 typename qValueType<Iterator>::value_type>;
348 using FilteredReduceType = FilteredReducedKernel<ResultType, Iterator, DecayedMapFunctor,
349 DecayedReduceFunctor, Reducer>;
350 using SequenceHolderType = SequenceHolder2<DecayedSequence, FilteredReduceType,
351 DecayedMapFunctor, DecayedReduceFunctor>;
352 return startThreadEngine(
new SequenceHolderType(
353 pool, std::forward<Sequence>(sequence), std::forward<MapFunctor>(mapFunctor),
354 std::forward<ReduceFunctor>(reduceFunctor), std::forward<ResultType>(initialValue),
359template <
typename ResultType,
typename Iterator,
typename MapFunctor,
typename ReduceFunctor>
363 MapFunctor &&mapFunctor,
364 ReduceFunctor &&reduceFunctor,
365 ResultType &&initialValue,
366 ReduceOptions options)
368 using Reducer = ReduceKernel<std::decay_t<ReduceFunctor>, ResultType,
369 typename qValueType<Iterator>::value_type>;
370 using FilteredReduceType = FilteredReducedKernel<ResultType, Iterator, std::decay_t<MapFunctor>,
371 std::decay_t<ReduceFunctor>, Reducer>;
372 return startThreadEngine(
373 new FilteredReduceType(pool, begin, end, std::forward<MapFunctor>(mapFunctor),
374 std::forward<ReduceFunctor>(reduceFunctor),
375 std::forward<ResultType>(initialValue), options));
bool shouldThrottleThread() override
FilterKernel(QThreadPool *pool, Sequence &_sequence, Keep &&_keep, Reduce &&_reduce)
bool shouldStartThread() override
bool runIteration(typename Sequence::const_iterator it, int index, T *) override
bool runIterations(typename Sequence::const_iterator sequenceBeginIterator, int begin, int end, T *) override
bool runIteration(Iterator it, int index, T *) override
FilteredEachKernel(QThreadPool *pool, Iterator begin, Iterator end, Keep &&_keep)
bool runIterations(Iterator sequenceBeginIterator, int begin, int end, T *) override
ReducedResultType ResultType
bool shouldStartThread() override
FilteredReducedKernel(QThreadPool *pool, Iterator begin, Iterator end, Keep &&_keep, Reduce &&_reduce, ReduceOptions reduceOption)
bool shouldThrottleThread() override
bool runIterations(Iterator sequenceBeginIterator, int begin, int end, ReducedResultType *) override
ReducedResultType ReturnType
bool runIteration(Iterator it, int index, ReducedResultType *) override
FilteredReducedKernel(QThreadPool *pool, Iterator begin, Iterator end, Keep &&_keep, Reduce &&_reduce, ReducedResultType &&initialValue, ReduceOptions reduceOption)
ReducedResultType * result() override
ThreadEngineStarter< ResultType > startFilteredReduced(QThreadPool *pool, Sequence &&sequence, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ResultType &&initialValue, ReduceOptions options)
[QtConcurrent-6]
ThreadEngineStarter< ResultType > startFilteredReduced(QThreadPool *pool, Sequence &&sequence, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ReduceOptions options)
[QtConcurrent-4]
decltype(auto) startFiltered(QThreadPool *pool, Sequence &&sequence, KeepFunctor &&functor)
[QtConcurrent-3]
ThreadEngineStarter< ResultType > startFilteredReduced(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ReduceOptions options)
[QtConcurrent-5]
ThreadEngineStarter< typename qValueType< Iterator >::value_type > startFiltered(QThreadPool *pool, Iterator begin, Iterator end, KeepFunctor &&functor)
[QtConcurrent-2]
ThreadEngineStarter< ResultType > startFilteredReduced(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ResultType &&initialValue, ReduceOptions options)
[QtConcurrent-7]