5#ifndef QTCONCURRENT_FILTERKERNEL_H
6#define QTCONCURRENT_FILTERKERNEL_H
8#include <QtConcurrent/qtconcurrent_global.h>
10#if !defined(QT_NO_CONCURRENT) || defined (Q_QDOC)
12#include <QtConcurrent/qtconcurrentiteratekernel.h>
13#include <QtConcurrent/qtconcurrentmapkernel.h>
14#include <QtConcurrent/qtconcurrentreducekernel.h>
41template <
typename Sequence,
typename KeepFunctor,
typename ReduceFunctor>
44 typedef ReduceKernel<ReduceFunctor, Sequence,
typename Sequence::value_type> Reducer;
45 typedef IterateKernel<
typename Sequence::const_iterator,
void> IterateKernelType;
48 Sequence reducedResult;
55 template <
typename Keep = KeepFunctor,
typename Reduce = ReduceFunctor>
56 FilterKernel(QThreadPool *pool, Sequence &_sequence, Keep &&_keep, Reduce &&_reduce)
65 bool runIteration(
typename Sequence::const_iterator it,
int index, T *)
override
67 IntermediateResults<
typename Sequence::value_type> results;
68 results.begin = index;
69 results.end = index + 1;
71 if (std::invoke(keep, *it))
72 results.vector.append(*it);
74 reducer.runReduce(reduce, reducedResult, results);
78 bool runIterations(
typename Sequence::const_iterator sequenceBeginIterator,
int begin,
int end, T *)
override
80 IntermediateResults<
typename Sequence::value_type> results;
81 results.begin = begin;
83 results.vector.reserve(end - begin);
86 typename Sequence::const_iterator it = sequenceBeginIterator;
87 std::advance(it, begin);
88 for (
int i = begin; i < end; ++i) {
89 if (std::invoke(keep, *it))
90 results.vector.append(*it);
94 reducer.runReduce(reduce, reducedResult, results);
100 reducer.finish(reduce, reducedResult);
101 sequence = std::move(reducedResult);
106 return IterateKernelType::shouldThrottleThread() || reducer.shouldThrottle();
111 return IterateKernelType::shouldStartThread() && reducer.shouldStartThread();
119template <
typename ReducedResultType,
121 typename KeepFunctor,
122 typename ReduceFunctor,
128 ReducedResultType &reducedResult;
130 ReduceFunctor reduce;
132 typedef IterateKernel<Iterator, ReducedResultType> IterateKernelType;
135 template<
typename Keep = KeepFunctor,
typename Reduce = ReduceFunctor>
137 Reduce &&_reduce, ReduceOptions reduceOption)
139 reducedResult(
this->defaultValue.value),
142 reducer(pool, reduceOption)
145 template <
typename Keep = KeepFunctor,
typename Reduce = ReduceFunctor>
147 Reduce &&_reduce, ReducedResultType &&initialValue,
148 ReduceOptions reduceOption)
150 reducedResult(
this->defaultValue.value),
153 reducer(pool, reduceOption)
157 bool runIteration(Iterator it,
int index, ReducedResultType *)
override
159 IntermediateResults<
typename qValueType<Iterator>::value_type> results;
160 results.begin = index;
161 results.end = index + 1;
163 if (std::invoke(keep, *it))
164 results.vector.append(*it);
166 reducer.runReduce(reduce, reducedResult, results);
170 bool runIterations(Iterator sequenceBeginIterator,
int begin,
int end, ReducedResultType *)
override
172 IntermediateResults<
typename qValueType<Iterator>::value_type> results;
173 results.begin = begin;
175 results.vector.reserve(end - begin);
177 Iterator it = sequenceBeginIterator;
178 std::advance(it, begin);
179 for (
int i = begin; i < end; ++i) {
180 if (std::invoke(keep, *it))
181 results.vector.append(*it);
185 reducer.runReduce(reduce, reducedResult, results);
191 reducer.finish(reduce, reducedResult);
196 return IterateKernelType::shouldThrottleThread() || reducer.shouldThrottle();
201 return IterateKernelType::shouldStartThread() && reducer.shouldStartThread();
208 return &reducedResult;
213template <
typename Iterator,
typename KeepFunctor>
216 typedef typename qValueType<Iterator>::value_type T;
217 typedef IterateKernel<Iterator, T> IterateKernelType;
225 template <
typename Keep = KeepFunctor>
232 if (
this->futureInterface)
233 this->futureInterface->setFilterMode(
true);
234 IterateKernelType::start();
239 if (std::invoke(keep, *it))
240 this->reportResult(&(*it), index);
242 this->reportResult(
nullptr, index);
246 bool runIterations(Iterator sequenceBeginIterator,
int begin,
int end, T *)
override
248 const int count = end - begin;
249 IntermediateResults<
typename qValueType<Iterator>::value_type> results;
250 results.begin = begin;
252 results.vector.reserve(count);
254 Iterator it = sequenceBeginIterator;
255 std::advance(it, begin);
256 for (
int i = begin; i < end; ++i) {
257 if (std::invoke(keep, *it))
258 results.vector.append(*it);
262 this->reportResults(results.vector, begin, count);
268template <
typename Iterator,
typename KeepFunctor>
271startFiltered(QThreadPool *pool, Iterator begin, Iterator end, KeepFunctor &&functor)
273 return startThreadEngine(
new FilteredEachKernel<Iterator, std::decay_t<KeepFunctor>>
274 (pool, begin, end, std::forward<KeepFunctor>(functor)));
278template <
typename Sequence,
typename KeepFunctor>
279inline decltype(
auto)
startFiltered(QThreadPool *pool, Sequence &&sequence, KeepFunctor &&functor)
281 using DecayedSequence = std::decay_t<Sequence>;
282 using DecayedFunctor = std::decay_t<KeepFunctor>;
283 using SequenceHolderType = SequenceHolder1<DecayedSequence,
284 FilteredEachKernel<
typename DecayedSequence::const_iterator, DecayedFunctor>,
286 return startThreadEngine(
new SequenceHolderType(pool, std::forward<Sequence>(sequence),
287 std::forward<KeepFunctor>(functor)));
291template <
typename ResultType,
typename Sequence,
typename MapFunctor,
typename ReduceFunctor>
294 MapFunctor &&mapFunctor,
295 ReduceFunctor &&reduceFunctor,
296 ReduceOptions options)
298 using DecayedSequence = std::decay_t<Sequence>;
299 using DecayedMapFunctor = std::decay_t<MapFunctor>;
300 using DecayedReduceFunctor = std::decay_t<ReduceFunctor>;
301 using Iterator =
typename DecayedSequence::const_iterator;
302 using Reducer = ReduceKernel<DecayedReduceFunctor, ResultType,
303 typename qValueType<Iterator>::value_type>;
304 using FilteredReduceType = FilteredReducedKernel<ResultType, Iterator, DecayedMapFunctor,
305 DecayedReduceFunctor, Reducer>;
306 using SequenceHolderType = SequenceHolder2<DecayedSequence, FilteredReduceType,
307 DecayedMapFunctor, DecayedReduceFunctor>;
308 return startThreadEngine(
new SequenceHolderType(pool, std::forward<Sequence>(sequence),
309 std::forward<MapFunctor>(mapFunctor),
310 std::forward<ReduceFunctor>(reduceFunctor),
316template <
typename ResultType,
typename Iterator,
typename MapFunctor,
typename ReduceFunctor>
320 MapFunctor &&mapFunctor,
321 ReduceFunctor &&reduceFunctor,
322 ReduceOptions options)
324 using Reducer = ReduceKernel<std::decay_t<ReduceFunctor>, ResultType,
325 typename qValueType<Iterator>::value_type>;
326 using FilteredReduceType = FilteredReducedKernel<ResultType, Iterator, std::decay_t<MapFunctor>,
327 std::decay_t<ReduceFunctor>, Reducer>;
328 return startThreadEngine(
329 new FilteredReduceType(pool, begin, end, std::forward<MapFunctor>(mapFunctor),
330 std::forward<ReduceFunctor>(reduceFunctor), options));
335template <
typename ResultType,
typename Sequence,
typename MapFunctor,
typename ReduceFunctor>
338 MapFunctor &&mapFunctor,
339 ReduceFunctor &&reduceFunctor,
340 ResultType &&initialValue,
341 ReduceOptions options)
343 using DecayedSequence = std::decay_t<Sequence>;
344 using DecayedMapFunctor = std::decay_t<MapFunctor>;
345 using DecayedReduceFunctor = std::decay_t<ReduceFunctor>;
346 using Iterator =
typename DecayedSequence::const_iterator;
347 using Reducer = ReduceKernel<DecayedReduceFunctor, ResultType,
348 typename qValueType<Iterator>::value_type>;
349 using FilteredReduceType = FilteredReducedKernel<ResultType, Iterator, DecayedMapFunctor,
350 DecayedReduceFunctor, Reducer>;
351 using SequenceHolderType = SequenceHolder2<DecayedSequence, FilteredReduceType,
352 DecayedMapFunctor, DecayedReduceFunctor>;
353 return startThreadEngine(
new SequenceHolderType(
354 pool, std::forward<Sequence>(sequence), std::forward<MapFunctor>(mapFunctor),
355 std::forward<ReduceFunctor>(reduceFunctor), std::forward<ResultType>(initialValue),
360template <
typename ResultType,
typename Iterator,
typename MapFunctor,
typename ReduceFunctor>
364 MapFunctor &&mapFunctor,
365 ReduceFunctor &&reduceFunctor,
366 ResultType &&initialValue,
367 ReduceOptions options)
369 using Reducer = ReduceKernel<std::decay_t<ReduceFunctor>, ResultType,
370 typename qValueType<Iterator>::value_type>;
371 using FilteredReduceType = FilteredReducedKernel<ResultType, Iterator, std::decay_t<MapFunctor>,
372 std::decay_t<ReduceFunctor>, Reducer>;
373 return startThreadEngine(
374 new FilteredReduceType(pool, begin, end, std::forward<MapFunctor>(mapFunctor),
375 std::forward<ReduceFunctor>(reduceFunctor),
376 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]