42 #ifndef QTCONCURRENT_REDUCEKERNEL_H
43 #define QTCONCURRENT_REDUCEKERNEL_H
47 #ifndef QT_NO_CONCURRENT
98 Q_DECLARE_OPERATORS_FOR_FLAGS(ReduceOptions)
103 template <
typename ReduceFunctor,
typename ReduceResultType,
typename T>
108 const ReduceOptions reduceOptions;
111 int progress, resultsMapSize, threadCount;
112 ResultsMap resultsMap;
114 bool canReduce(
int begin)
const
119 && progress == begin));
122 void reduceResult(ReduceFunctor &reduce,
126 for (
int i = 0; i < result.
vector.size(); ++i) {
127 reduce(r, result.
vector.at(i));
131 void reduceResults(ReduceFunctor &reduce,
135 typename ResultsMap::iterator it = map.
begin();
136 while (it != map.
end()) {
137 reduceResult(reduce, r, it.value());
144 : reduceOptions(_reduceOptions), progress(0), resultsMapSize(0),
145 threadCount(
QThreadPool::globalInstance()->maxThreadCount())
153 if (!canReduce(result.
begin)) {
165 reduceResult(reduce, r, result);
169 while (!resultsMap.
isEmpty()) {
170 ResultsMap resultsMapCopy = resultsMap;
174 reduceResults(reduce, r, resultsMapCopy);
177 resultsMapSize -= resultsMapCopy.
size();
184 reduceResult(reduce, r, result);
188 progress += result.
end - result.
begin;
191 typename ResultsMap::iterator it = resultsMap.
begin();
192 while (it != resultsMap.
end()) {
193 if (it.value().begin != progress)
197 reduceResult(reduce, r, it.value());
201 progress += it.value().end - it.value().begin;
202 it = resultsMap.
erase(it);
208 void finish(ReduceFunctor &reduce, ReduceResultType &r)
210 reduceResults(reduce, r, resultsMap);
224 template <
typename Sequence,
typename Base,
typename Functor1,
typename Functor2>
230 ReduceOptions reduceOptions)
231 : Base(_sequence.begin(), _sequence.
end(), functor1, functor2, reduceOptions),
242 sequence = Sequence();
253 #endif // QT_NO_CONCURRENT
GLdouble GLdouble GLdouble r
iterator erase(iterator it)
QFuture< void > map(Sequence &sequence, MapFunctor map)
iterator insert(const Key &key, const T &value)
#define QT_BEGIN_NAMESPACE
ReduceKernel(ReduceOptions _reduceOptions)
SequenceHolder2(const Sequence &_sequence, Functor1 functor1, Functor2 functor2, ReduceOptions reduceOptions)
void finish(ReduceFunctor &reduce, ReduceResultType &r)
void runReduce(ReduceFunctor &reduce, ReduceResultType &r, const IntermediateResults< T > &result)