4#ifndef QTCONCURRENT_REDUCEKERNEL_H
5#define QTCONCURRENT_REDUCEKERNEL_H
7#include <QtConcurrent/qtconcurrent_global.h>
9#if !defined(QT_NO_CONCURRENT) || defined(Q_QDOC)
11#include <QtCore/qatomic.h>
12#include <QtCore/qlist.h>
13#include <QtCore/qmap.h>
14#include <QtCore/qmutex.h>
15#include <QtCore/qthread.h>
16#include <QtCore/qthreadpool.h>
24template<
typename Sequence>
44enum ReduceQueueLimits {
77template <
typename ReduceFunctor,
typename ReduceResultType,
typename T>
82 const ReduceOptions reduceOptions;
85 int progress, resultsMapSize;
86 const int threadCount;
89 bool canReduce(
int begin)
const
94 && progress ==
begin));
97 void reduceResult(ReduceFunctor &reduce,
101 for (
int i = 0;
i <
result.vector.size(); ++
i) {
102 std::invoke(reduce,
r,
result.vector.at(
i));
106 void reduceResults(ReduceFunctor &reduce,
110 typename ResultsMap::iterator
it =
map.
begin();
112 reduceResult(reduce,
r,
it.value());
119 : reduceOptions(_reduceOptions), progress(0), resultsMapSize(0),
120 threadCount(
pool->maxThreadCount())
127 std::unique_lock<QMutex> locker(
mutex);
128 if (!canReduce(
result.begin)) {
140 reduceResult(reduce,
r,
result);
144 while (!resultsMap.
isEmpty()) {
149 reduceResults(reduce,
r, resultsMapCopy);
152 resultsMapSize -= resultsMapCopy.
size();
159 reduceResult(reduce,
r,
result);
166 typename ResultsMap::iterator
it = resultsMap.
begin();
167 while (
it != resultsMap.
end()) {
168 if (
it.value().
begin != progress)
172 reduceResult(reduce,
r,
it.value());
183 void finish(ReduceFunctor &reduce, ReduceResultType &
r)
185 reduceResults(reduce,
r, resultsMap);
190 std::lock_guard<QMutex> locker(
mutex);
196 std::lock_guard<QMutex> locker(
mutex);
201template <
typename Sequence,
typename Base,
typename Functor1,
typename Functor2>
204 template<
typename S = Sequence,
typename F1 = Functor1,
typename F2 = Functor2>
206 ReduceOptions reduceOptions)
209 std::forward<F1>(functor1),
std::forward<F2>(functor2), reduceOptions)
212 template<
typename InitialValueType,
typename S = Sequence,
213 typename F1 = Functor1,
typename F2 = Functor2>
215 InitialValueType &&initialValue, ReduceOptions reduceOptions)
218 std::forward<F1>(functor1),
std::forward<F2>(functor2),
219 std::forward<InitialValueType>(initialValue), reduceOptions)
iterator insert(const Key &key, const T &value)
iterator erase(const_iterator it)
ReduceKernel(QThreadPool *pool, ReduceOptions _reduceOptions)
void finish(ReduceFunctor &reduce, ReduceResultType &r)
void runReduce(ReduceFunctor &reduce, ReduceResultType &r, const IntermediateResults< T > &result)
QMap< QString, QString > map
[6]
QSet< QString >::iterator it
Combined button and popup list for selecting options.
ReduceOption
This enum specifies the order of which results from the map or filter function are passed to the redu...
@ ReduceQueueThrottleLimit
#define Q_DECLARE_FLAGS(Flags, Enum)
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
SequenceHolder2(QThreadPool *pool, S &&_sequence, F1 &&functor1, F2 &&functor2, ReduceOptions reduceOptions)
SequenceHolder2(QThreadPool *pool, S &&_sequence, F1 &&functor1, F2 &&functor2, InitialValueType &&initialValue, ReduceOptions reduceOptions)
SequenceHolder(Sequence &&s)
SequenceHolder(const Sequence &s)