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>
47 Sequence reducedResult;
54 template <
typename Keep = KeepFunctor,
typename Reduce = ReduceFunctor>
57 const_cast<const Sequence &>(_sequence).
end()), reducedResult(),
59 keep(
std::forward<Keep>(_keep)),
60 reduce(
std::forward<Reduce>(_reduce)),
70 if (std::invoke(keep, *
it))
85 typename Sequence::const_iterator
it = sequenceBeginIterator;
88 if (std::invoke(keep, *
it))
99 reducer.
finish(reduce, reducedResult);
100 sequence = std::move(reducedResult);
118template <
typename ReducedResultType,
120 typename KeepFunctor,
121 typename ReduceFunctor,
127 ReducedResultType &reducedResult;
129 ReduceFunctor reduce;
134 template<
typename Keep = KeepFunctor,
typename Reduce = ReduceFunctor>
136 Reduce &&_reduce, ReduceOptions reduceOption)
139 keep(
std::forward<Keep>(_keep)),
140 reduce(
std::forward<Reduce>(_reduce)),
141 reducer(
pool, reduceOption)
144 template <
typename Keep = KeepFunctor,
typename Reduce = ReduceFunctor>
146 Reduce &&_reduce, ReducedResultType &&initialValue,
147 ReduceOptions reduceOption)
150 keep(
std::forward<Keep>(_keep)),
151 reduce(
std::forward<Reduce>(_reduce)),
152 reducer(
pool, reduceOption)
162 if (std::invoke(keep, *
it))
165 reducer.runReduce(reduce, reducedResult,
results);
176 Iterator
it = sequenceBeginIterator;
179 if (std::invoke(keep, *
it))
184 reducer.runReduce(reduce, reducedResult,
results);
190 reducer.finish(reduce, reducedResult);
207 return &reducedResult;
212template <
typename Iterator,
typename KeepFunctor>
224 template <
typename Keep = KeepFunctor>
238 if (std::invoke(keep, *
it))
253 Iterator
it = sequenceBeginIterator;
256 if (std::invoke(keep, *
it))
267template <
typename Iterator,
typename KeepFunctor>
269ThreadEngineStarter<typename qValueType<Iterator>::value_type>
273 (
pool,
begin,
end, std::forward<KeepFunctor>(functor)));
277template <
typename Sequence,
typename KeepFunctor>
280 using DecayedSequence = std::decay_t<Sequence>;
281 using DecayedFunctor = std::decay_t<KeepFunctor>;
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,
304 DecayedReduceFunctor, Reducer>;
305 using SequenceHolderType =
SequenceHolder2<DecayedSequence, FilteredReduceType,
306 DecayedMapFunctor, DecayedReduceFunctor>;
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)
326 std::decay_t<ReduceFunctor>, Reducer>;
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,
349 DecayedReduceFunctor, Reducer>;
350 using SequenceHolderType =
SequenceHolder2<DecayedSequence, FilteredReduceType,
351 DecayedMapFunctor, DecayedReduceFunctor>;
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)
371 std::decay_t<ReduceFunctor>, Reducer>;
373 new FilteredReduceType(
pool,
begin,
end, std::forward<MapFunctor>(mapFunctor),
374 std::forward<ReduceFunctor>(reduceFunctor),
375 std::forward<ResultType>(initialValue), options));
void setFilterMode(bool enable)
void reserve(qsizetype size)
void append(parameter_type t)
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
const Sequence::const_iterator end
bool shouldStartThread() override
const Sequence::const_iterator begin
DefaultValueContainer< ResultType > defaultValue
void finish(ReduceFunctor &reduce, ReduceResultType &r)
void runReduce(ReduceFunctor &reduce, ReduceResultType &r, const IntermediateResults< T > &result)
virtual bool shouldThrottleThread()
QFutureInterfaceBase * futureInterface
void reportResult(const T *_result, int index=-1)
void reportResults(const QList< T > &_result, int index=-1, int count=-1)
QSet< QString >::iterator it
Combined button and popup list for selecting options.
ThreadEngineStarter< ResultType > startFilteredReduced(QThreadPool *pool, Sequence &&sequence, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ReduceOptions options)
[QtConcurrent-4]
ThreadEngineStarter< typename qValueType< Iterator >::value_type > startFiltered(QThreadPool *pool, Iterator begin, Iterator end, KeepFunctor &&functor)
[QtConcurrent-2]
ThreadEngineStarter< typename ThreadEngine::ResultType > startThreadEngine(ThreadEngine *threadEngine)
[qtconcurrentthreadengine-1]
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLenum GLenum GLsizei count
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)