Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qtconcurrentmapkernel.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QTCONCURRENT_MAPKERNEL_H
6#define QTCONCURRENT_MAPKERNEL_H
7
8#include <QtConcurrent/qtconcurrent_global.h>
9
10#if !defined(QT_NO_CONCURRENT) || defined (Q_QDOC)
11
12#include <QtConcurrent/qtconcurrentiteratekernel.h>
13#include <QtConcurrent/qtconcurrentreducekernel.h>
14#include <QtConcurrent/qtconcurrentfunctionwrappers.h>
15
16QT_BEGIN_NAMESPACE
17
18
19namespace QtConcurrent {
20
21// map kernel, works with both parallel-for and parallel-while
22template <typename Iterator, typename MapFunctor>
23class MapKernel : public IterateKernel<Iterator, void>
24{
25 MapFunctor map;
26public:
27 typedef void ReturnType;
28 template <typename F = MapFunctor>
29 MapKernel(QThreadPool *pool, Iterator begin, Iterator end, F &&_map)
31 { }
32
33 bool runIteration(Iterator it, int, void *) override
34 {
35 std::invoke(map, *it);
36 return false;
37 }
38
39 bool runIterations(Iterator sequenceBeginIterator, int beginIndex, int endIndex, void *) override
40 {
41 Iterator it = sequenceBeginIterator;
42 std::advance(it, beginIndex);
43 for (int i = beginIndex; i < endIndex; ++i) {
44 runIteration(it, i, nullptr);
45 std::advance(it, 1);
46 }
47
48 return false;
49 }
50};
51
52template <typename ReducedResultType,
53 typename Iterator,
54 typename MapFunctor,
55 typename ReduceFunctor,
60{
66
67public:
69
70 template<typename F1 = MapFunctor, typename F2 = ReduceFunctor>
79
80 template<typename F1 = MapFunctor, typename F2 = ReduceFunctor>
91
102
120
125
130
135
138 {
139 return &reducedResult;
140 }
141};
142
143template <typename Iterator, typename MapFunctor>
145{
146 MapFunctor map;
148
149public:
150 template <typename F = MapFunctor>
151 MappedEachKernel(QThreadPool *pool, Iterator begin, Iterator end, F &&_map)
153 { }
154
155 bool runIteration(Iterator it, int, T *result) override
156 {
157 *result = std::invoke(map, *it);
158 return true;
159 }
160
161 bool runIterations(Iterator sequenceBeginIterator, int beginIndex, int endIndex, T *results) override
162 {
163
164 Iterator it = sequenceBeginIterator;
165 std::advance(it, beginIndex);
166 for (int i = beginIndex; i < endIndex; ++i) {
167 runIteration(it, i, results + (i - beginIndex));
168 std::advance(it, 1);
169 }
170
171 return true;
172 }
173};
174
175//! [qtconcurrentmapkernel-1]
176template <typename Iterator, typename Functor>
177inline ThreadEngineStarter<void> startMap(QThreadPool *pool, Iterator begin,
178 Iterator end, Functor &&functor)
179{
180 return startThreadEngine(new MapKernel<Iterator, std::decay_t<Functor>>(
181 pool, begin, end, std::forward<Functor>(functor)));
182}
183
184//! [qtconcurrentmapkernel-2]
185template <typename T, typename Iterator, typename Functor>
186inline ThreadEngineStarter<T> startMapped(QThreadPool *pool, Iterator begin,
187 Iterator end, Functor &&functor)
188{
189 return startThreadEngine(new MappedEachKernel<Iterator, std::decay_t<Functor>>(
190 pool, begin, end, std::forward<Functor>(functor)));
191}
192
193/*
194 The SequnceHolder class is used to hold a reference to the
195 sequence we are working on.
196*/
197template <typename Sequence, typename Base, typename Functor>
198struct SequenceHolder1 : private QtPrivate::SequenceHolder<Sequence>, public Base
199{
200 template<typename S = Sequence, typename F = Functor>
201 SequenceHolder1(QThreadPool *pool, S &&_sequence, F &&functor)
203 Base(pool, this->sequence.cbegin(), this->sequence.cend(), std::forward<F>(functor))
204 { }
205
206 void finish() override
207 {
208 Base::finish();
209 // Clear the sequence to make sure all temporaries are destroyed
210 // before finished is signaled.
211 this->sequence = Sequence();
212 }
213};
214
215//! [qtconcurrentmapkernel-3]
216template <typename T, typename Sequence, typename Functor>
217inline ThreadEngineStarter<T> startMapped(QThreadPool *pool, Sequence &&sequence,
218 Functor &&functor)
219{
220 using DecayedSequence = std::decay_t<Sequence>;
221 using DecayedFunctor = std::decay_t<Functor>;
222 using SequenceHolderType = SequenceHolder1<
223 DecayedSequence,
224 MappedEachKernel<typename DecayedSequence::const_iterator, DecayedFunctor>,
225 DecayedFunctor>;
226
227 return startThreadEngine(new SequenceHolderType(pool, std::forward<Sequence>(sequence),
228 std::forward<Functor>(functor)));
229}
230
231//! [qtconcurrentmapkernel-4]
232template <typename IntermediateType, typename ResultType, typename Sequence, typename MapFunctor,
233 typename ReduceFunctor>
235 Sequence &&sequence,
236 MapFunctor &&mapFunctor,
237 ReduceFunctor &&reduceFunctor,
238 ReduceOptions options)
239{
240 using DecayedSequence = std::decay_t<Sequence>;
241 using DecayedMapFunctor = std::decay_t<MapFunctor>;
242 using DecayedReduceFunctor = std::decay_t<ReduceFunctor>;
243 using Iterator = typename DecayedSequence::const_iterator;
244 using Reducer = ReduceKernel<DecayedReduceFunctor, ResultType, IntermediateType>;
245 using MappedReduceType = MappedReducedKernel<ResultType, Iterator, DecayedMapFunctor,
246 DecayedReduceFunctor, Reducer>;
247 using SequenceHolderType = SequenceHolder2<DecayedSequence, MappedReduceType, DecayedMapFunctor,
248 DecayedReduceFunctor>;
249 return startThreadEngine(new SequenceHolderType(pool, std::forward<Sequence>(sequence),
250 std::forward<MapFunctor>(mapFunctor),
251 std::forward<ReduceFunctor>(reduceFunctor),
252 options));
253}
254
255//! [qtconcurrentmapkernel-5]
256template <typename IntermediateType, typename ResultType, typename Iterator, typename MapFunctor,
257 typename ReduceFunctor>
259 Iterator begin,
260 Iterator end,
261 MapFunctor &&mapFunctor,
262 ReduceFunctor &&reduceFunctor,
263 ReduceOptions options)
264{
265 using Reducer =
266 ReduceKernel<std::decay_t<ReduceFunctor>, std::decay_t<ResultType>, IntermediateType>;
267 using MappedReduceType = MappedReducedKernel<ResultType, Iterator, std::decay_t<MapFunctor>,
268 std::decay_t<ReduceFunctor>, Reducer>;
269 return startThreadEngine(new MappedReduceType(pool, begin, end,
270 std::forward<MapFunctor>(mapFunctor),
271 std::forward<ReduceFunctor>(reduceFunctor),
272 options));
273}
274
275//! [qtconcurrentmapkernel-6]
276template <typename IntermediateType, typename ResultType, typename Sequence, typename MapFunctor,
277 typename ReduceFunctor>
279 Sequence &&sequence,
280 MapFunctor &&mapFunctor,
281 ReduceFunctor &&reduceFunctor,
282 ResultType &&initialValue,
283 ReduceOptions options)
284{
285 using DecayedSequence = std::decay_t<Sequence>;
286 using DecayedMapFunctor = std::decay_t<MapFunctor>;
287 using DecayedReduceFunctor = std::decay_t<ReduceFunctor>;
288 using Iterator = typename DecayedSequence::const_iterator;
289 using Reducer = ReduceKernel<DecayedReduceFunctor, ResultType, IntermediateType>;
290 using MappedReduceType = MappedReducedKernel<ResultType, Iterator, DecayedMapFunctor,
291 DecayedReduceFunctor, Reducer>;
292 using SequenceHolderType = SequenceHolder2<DecayedSequence, MappedReduceType, DecayedMapFunctor,
293 DecayedReduceFunctor>;
294 return startThreadEngine(
295 new SequenceHolderType(pool, std::forward<Sequence>(sequence),
296 std::forward<MapFunctor>(mapFunctor),
297 std::forward<ReduceFunctor>(reduceFunctor),
298 std::forward<ResultType>(initialValue), options));
299}
300
301//! [qtconcurrentmapkernel-7]
302template <typename IntermediateType, typename ResultType, typename Iterator, typename MapFunctor,
303 typename ReduceFunctor>
305 Iterator begin,
306 Iterator end,
307 MapFunctor &&mapFunctor,
308 ReduceFunctor &&reduceFunctor,
309 ResultType &&initialValue,
310 ReduceOptions options)
311{
312 using Reducer = ReduceKernel<std::decay_t<ReduceFunctor>, ResultType, IntermediateType>;
313 using MappedReduceType = MappedReducedKernel<ResultType, Iterator, std::decay_t<MapFunctor>,
314 std::decay_t<ReduceFunctor>, Reducer>;
315 return startThreadEngine(new MappedReduceType(pool, begin, end,
316 std::forward<MapFunctor>(mapFunctor),
317 std::forward<ReduceFunctor>(reduceFunctor),
318 std::forward<ResultType>(initialValue), options));
319}
320
321} // namespace QtConcurrent
322
323
324QT_END_NAMESPACE
325
326#endif // QT_NO_CONCURRENT
327
328#endif
\inmodule QtConcurrent
bool runIteration(Iterator it, int, void *) override
MapKernel(QThreadPool *pool, Iterator begin, Iterator end, F &&_map)
bool runIterations(Iterator sequenceBeginIterator, int beginIndex, int endIndex, void *) override
MappedEachKernel(QThreadPool *pool, Iterator begin, Iterator end, F &&_map)
bool runIteration(Iterator it, int, T *result) override
bool runIterations(Iterator sequenceBeginIterator, int beginIndex, int endIndex, T *results) override
\inmodule QtConcurrent
ThreadEngineStarter< T > startMapped(QThreadPool *pool, Iterator begin, Iterator end, Functor &&functor)
[qtconcurrentmapkernel-2]
ThreadEngineStarter< ResultType > startMappedReduced(QThreadPool *pool, Sequence &&sequence, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ReduceOptions options)
[qtconcurrentmapkernel-4]
ThreadEngineStarter< T > startMapped(QThreadPool *pool, Sequence &&sequence, Functor &&functor)
[qtconcurrentmapkernel-3]
ThreadEngineStarter< ResultType > startMappedReduced(QThreadPool *pool, Sequence &&sequence, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ResultType &&initialValue, ReduceOptions options)
[qtconcurrentmapkernel-6]
ThreadEngineStarter< ResultType > startMappedReduced(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ReduceOptions options)
[qtconcurrentmapkernel-5]
ThreadEngineStarter< ResultType > startMappedReduced(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor &&mapFunctor, ReduceFunctor &&reduceFunctor, ResultType &&initialValue, ReduceOptions options)
[qtconcurrentmapkernel-7]
ThreadEngineStarter< void > startMap(QThreadPool *pool, Iterator begin, Iterator end, Functor &&functor)
[qtconcurrentmapkernel-1]
SequenceHolder1(QThreadPool *pool, S &&_sequence, F &&functor)