40 #ifndef QTCONCURRENT_FILTERKERNEL_H 41 #define QTCONCURRENT_FILTERKERNEL_H 43 #include <QtConcurrent/qtconcurrent_global.h> 45 #if !defined(QT_NO_CONCURRENT) || defined (Q_CLANG_QDOC) 47 #include <QtConcurrent/qtconcurrentiteratekernel.h> 48 #include <QtConcurrent/qtconcurrentmapkernel.h> 49 #include <QtConcurrent/qtconcurrentreducekernel.h> 76 template <
typename Sequence,
typename KeepFunctor,
typename ReduceFunctor>
81 typedef typename ReduceFunctor::result_type T;
83 Sequence reducedResult;
90 FilterKernel(Sequence &_sequence, KeepFunctor _keep, ReduceFunctor _reduce)
91 : IterateKernelType(const_cast<const Sequence &>(_sequence).begin(), const_cast<const Sequence &>(_sequence).end()), reducedResult(),
98 bool runIteration(
typename Sequence::const_iterator it,
int index, T *)
override 101 results.
begin = index;
102 results.
end = index + 1;
105 results.
vector.append(*it);
107 reducer.
runReduce(reduce, reducedResult, results);
111 bool runIterations(
typename Sequence::const_iterator sequenceBeginIterator,
int begin,
int end, T *)
override 114 results.
begin = begin;
116 results.
vector.reserve(end - begin);
119 typename Sequence::const_iterator it = sequenceBeginIterator;
120 std::advance(it, begin);
121 for (
int i = begin; i < end; ++i) {
123 results.
vector.append(*it);
127 reducer.
runReduce(reduce, reducedResult, results);
133 reducer.
finish(reduce, reducedResult);
134 sequence = reducedResult;
139 return IterateKernelType::shouldThrottleThread() || reducer.
shouldThrottle();
152 template <
typename ReducedResultType,
154 typename KeepFunctor,
155 typename ReduceFunctor,
161 ReducedResultType reducedResult;
163 ReduceFunctor reduce;
171 ReduceFunctor _reduce,
172 ReduceOptions reduceOption)
173 : IterateKernelType(begin, end), reducedResult(), keep(_keep), reduce(_reduce), reducer(reduceOption)
179 ReduceFunctor reduce,
181 : reducedResult(initialValue), keep(keep), reduce(reduce), reducer(reduceOption)
185 bool runIteration(Iterator it,
int index, ReducedResultType *)
override 188 results.
begin = index;
189 results.
end = index + 1;
192 results.
vector.append(*it);
194 reducer.runReduce(reduce, reducedResult, results);
198 bool runIterations(Iterator sequenceBeginIterator,
int begin,
int end, ReducedResultType *)
override 201 results.
begin = begin;
203 results.
vector.reserve(end - begin);
205 Iterator it = sequenceBeginIterator;
206 std::advance(it, begin);
207 for (
int i = begin; i < end; ++i) {
209 results.
vector.append(*it);
213 reducer.runReduce(reduce, reducedResult, results);
219 reducer.finish(reduce, reducedResult);
224 return IterateKernelType::shouldThrottleThread() || reducer.shouldThrottle();
229 return IterateKernelType::shouldStartThread() && reducer.shouldStartThread();
236 return &reducedResult;
241 template <
typename Iterator,
typename KeepFunctor>
254 : IterateKernelType(begin, end), keep(_keep)
259 if (this->futureInterface)
260 this->futureInterface->setFilterMode(
true);
261 IterateKernelType::start();
267 this->reportResult(&(*it), index);
269 this->reportResult(0, index);
273 bool runIterations(Iterator sequenceBeginIterator,
int begin,
int end, T *)
override 275 const int count = end - begin;
277 results.
begin = begin;
279 results.
vector.reserve(count);
281 Iterator it = sequenceBeginIterator;
282 std::advance(it, begin);
283 for (
int i = begin; i < end; ++i) {
285 results.
vector.append(*it);
289 this->reportResults(results.
vector, begin, count);
295 template <
typename Iterator,
typename KeepFunctor>
304 template <
typename Sequence,
typename KeepFunctor>
316 template <
typename ResultType,
typename Sequence,
typename MapFunctor,
typename ReduceFunctor>
318 MapFunctor mapFunctor, ReduceFunctor reduceFunctor,
319 ReduceOptions options)
321 typedef typename Sequence::const_iterator Iterator;
325 return startThreadEngine(
new SequenceHolderType(sequence, mapFunctor, reduceFunctor, options));
330 template <
typename ResultType,
typename Iterator,
typename MapFunctor,
typename ReduceFunctor>
332 MapFunctor mapFunctor, ReduceFunctor reduceFunctor,
333 ReduceOptions options)
337 return startThreadEngine(
new FilteredReduceType(begin, end, mapFunctor, reduceFunctor, options));
346 #endif // QT_NO_CONCURRENT T ResultType
Definition: qtconcurrentfilterkernel.h:251
Definition: qtconcurrentiteratekernel.h:180
void ReturnType
Definition: qtconcurrentfilterkernel.h:147
Definition: qtconcurrentfilterkernel.h:77
ThreadEngineStarter< typename ThreadEngine::ResultType > startThreadEngine(ThreadEngine *threadEngine)
[qtconcurrentthreadengine-1]
Definition: qtconcurrentthreadengine.h:262
bool shouldStartThread() override
Definition: qtconcurrentfilterkernel.h:227
ThreadEngineStarter< ResultType > startFilteredReduced(const Sequence &sequence, MapFunctor mapFunctor, ReduceFunctor reduceFunctor, ReduceOptions options)
[QtConcurrent-4]
Definition: qtconcurrentfilterkernel.h:317
bool shouldStartThread()
Definition: qtconcurrentreducekernel.h:216
T ReturnType
Definition: qtconcurrentfilterkernel.h:250
ThreadEngineStarter< typename qValueType< Iterator >::value_type > startFiltered(Iterator begin, Iterator end, KeepFunctor functor)
[QtConcurrent-2]
Definition: qtconcurrentfilterkernel.h:298
void runReduce(ReduceFunctor &reduce, ReduceResultType &r, const IntermediateResults< T > &result)
Definition: qtconcurrentreducekernel.h:146
Definition: qtconcurrentmapkernel.h:212
Definition: qtconcurrentfilterkernel.h:159
bool runIteration(Iterator it, int index, T *) override
Definition: qtconcurrentfilterkernel.h:264
ReduceOption
Definition: qtconcurrentreducekernel.h:90
bool runIterations(Iterator sequenceBeginIterator, int begin, int end, ReducedResultType *) override
Definition: qtconcurrentfilterkernel.h:198
bool shouldThrottle()
Definition: qtconcurrentreducekernel.h:211
bool shouldThrottleThread() override
Definition: qtconcurrentfilterkernel.h:137
void finish() override
Definition: qtconcurrentfilterkernel.h:131
bool shouldStartThread() override
Definition: qtconcurrentfilterkernel.h:142
T::value_type value_type
Definition: qtconcurrentfilterkernel.h:60
ReducedResultType * result() override
Definition: qtconcurrentfilterkernel.h:234
Definition: qtconcurrentreducekernel.h:223
void finish() override
Definition: qtconcurrentfilterkernel.h:217
void ResultType
Definition: qtconcurrentfilterkernel.h:148
Definition: qtconcurrentfilterkernel.h:242
Definition: qtconcurrentthreadengine.h:229
bool runIterations(Iterator sequenceBeginIterator, int begin, int end, T *) override
Definition: qtconcurrentfilterkernel.h:273
ReducedResultType ResultType
Definition: qtconcurrentfilterkernel.h:233
T value_type
Definition: qtconcurrentfilterkernel.h:72
void start() override
Definition: qtconcurrentfilterkernel.h:257
FilteredEachKernel(Iterator begin, Iterator end, KeepFunctor _keep)
Definition: qtconcurrentfilterkernel.h:253
bool shouldThrottleThread() override
Definition: qtconcurrentfilterkernel.h:222
The QtConcurrent namespace provides high-level APIs that make it possible to write multi-threaded pro...
Definition: qtconcurrentexception.h:51
bool runIteration(Iterator it, int index, ReducedResultType *) override
Definition: qtconcurrentfilterkernel.h:185
FilterKernel(Sequence &_sequence, KeepFunctor _keep, ReduceFunctor _reduce)
Definition: qtconcurrentfilterkernel.h:90
Definition: qtconcurrentfilterkernel.h:58
T value_type
Definition: qtconcurrentfilterkernel.h:66
Definition: qtconcurrentreducekernel.h:92
bool runIteration(typename Sequence::const_iterator it, int index, T *) override
Definition: qtconcurrentfilterkernel.h:98
ReducedResultType ReturnType
Definition: qtconcurrentfilterkernel.h:232
bool runIterations(typename Sequence::const_iterator sequenceBeginIterator, int begin, int end, T *) override
Definition: qtconcurrentfilterkernel.h:111
void finish(ReduceFunctor &reduce, ReduceResultType &r)
Definition: qtconcurrentreducekernel.h:206
FilteredReducedKernel(Iterator begin, Iterator end, KeepFunctor _keep, ReduceFunctor _reduce, ReduceOptions reduceOption)
Definition: qtconcurrentfilterkernel.h:168