summaryrefslogtreecommitdiffstats
path: root/src/concurrent/qtconcurrentmapkernel.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/concurrent/qtconcurrentmapkernel.h')
-rw-r--r--src/concurrent/qtconcurrentmapkernel.h42
1 files changed, 26 insertions, 16 deletions
diff --git a/src/concurrent/qtconcurrentmapkernel.h b/src/concurrent/qtconcurrentmapkernel.h
index 0e6cfa4b9a..3acf299752 100644
--- a/src/concurrent/qtconcurrentmapkernel.h
+++ b/src/concurrent/qtconcurrentmapkernel.h
@@ -221,6 +221,11 @@ inline ThreadEngineStarter<T> startMapped(QThreadPool *pool, Iterator begin,
template <typename Sequence, typename Base, typename Functor>
struct SequenceHolder1 : private QtPrivate::SequenceHolder<Sequence>, public Base
{
+ SequenceHolder1(QThreadPool *pool, Sequence &&_sequence, Functor functor)
+ : QtPrivate::SequenceHolder<Sequence>(std::move(_sequence)),
+ Base(pool, this->sequence.cbegin(), this->sequence.cend(), functor)
+ { }
+
SequenceHolder1(QThreadPool *pool, const Sequence &_sequence, Functor functor)
: QtPrivate::SequenceHolder<Sequence>(_sequence),
Base(pool, this->sequence.cbegin(), this->sequence.cend(), functor)
@@ -237,33 +242,37 @@ struct SequenceHolder1 : private QtPrivate::SequenceHolder<Sequence>, public Bas
//! [qtconcurrentmapkernel-3]
template <typename T, typename Sequence, typename Functor>
-inline ThreadEngineStarter<T> startMapped(QThreadPool *pool, const Sequence &sequence,
+inline ThreadEngineStarter<T> startMapped(QThreadPool *pool, Sequence &&sequence,
Functor functor)
{
- typedef SequenceHolder1<Sequence,
- MappedEachKernel<typename Sequence::const_iterator , Functor>, Functor>
- SequenceHolderType;
+ using DecayedSequence = std::decay_t<Sequence>;
+ typedef SequenceHolder1<DecayedSequence,
+ MappedEachKernel<typename DecayedSequence::const_iterator, Functor>,
+ Functor>
+ SequenceHolderType;
- return startThreadEngine(new SequenceHolderType(pool, sequence, functor));
+ return startThreadEngine(
+ new SequenceHolderType(pool, std::forward<Sequence>(sequence), functor));
}
//! [qtconcurrentmapkernel-4]
template <typename IntermediateType, typename ResultType, typename Sequence, typename MapFunctor,
typename ReduceFunctor>
inline ThreadEngineStarter<ResultType> startMappedReduced(QThreadPool *pool,
- const Sequence & sequence,
+ Sequence &&sequence,
MapFunctor mapFunctor,
ReduceFunctor reduceFunctor,
ReduceOptions options)
{
- typedef typename Sequence::const_iterator Iterator;
+ using DecayedSequence = std::decay_t<Sequence>;
+ typedef typename DecayedSequence::const_iterator Iterator;
typedef ReduceKernel<ReduceFunctor, ResultType, IntermediateType> Reducer;
typedef MappedReducedKernel<ResultType, Iterator, MapFunctor, ReduceFunctor, Reducer>
MappedReduceType;
- typedef SequenceHolder2<Sequence, MappedReduceType, MapFunctor, ReduceFunctor>
+ typedef SequenceHolder2<DecayedSequence, MappedReduceType, MapFunctor, ReduceFunctor>
SequenceHolderType;
- return startThreadEngine(new SequenceHolderType(pool, sequence, mapFunctor, reduceFunctor,
- options));
+ return startThreadEngine(new SequenceHolderType(pool, std::forward<Sequence>(sequence),
+ mapFunctor, reduceFunctor, options));
}
//! [qtconcurrentmapkernel-5]
@@ -287,21 +296,22 @@ inline ThreadEngineStarter<ResultType> startMappedReduced(QThreadPool *pool,
template <typename IntermediateType, typename ResultType, typename Sequence, typename MapFunctor,
typename ReduceFunctor>
inline ThreadEngineStarter<ResultType> startMappedReduced(QThreadPool *pool,
- const Sequence &sequence,
+ Sequence &&sequence,
MapFunctor mapFunctor,
ReduceFunctor reduceFunctor,
ResultType &&initialValue,
ReduceOptions options)
{
- typedef typename Sequence::const_iterator Iterator;
+ using DecayedSequence = std::decay_t<Sequence>;
+ typedef typename DecayedSequence::const_iterator Iterator;
typedef ReduceKernel<ReduceFunctor, ResultType, IntermediateType> Reducer;
typedef MappedReducedKernel<ResultType, Iterator, MapFunctor, ReduceFunctor, Reducer>
MappedReduceType;
- typedef SequenceHolder2<Sequence, MappedReduceType, MapFunctor, ReduceFunctor>
+ typedef SequenceHolder2<DecayedSequence, MappedReduceType, MapFunctor, ReduceFunctor>
SequenceHolderType;
- return startThreadEngine(new SequenceHolderType(
- pool, sequence, mapFunctor, reduceFunctor, std::forward<ResultType>(initialValue),
- options));
+ return startThreadEngine(
+ new SequenceHolderType(pool, std::forward<Sequence>(sequence), mapFunctor,
+ reduceFunctor, std::forward<ResultType>(initialValue), options));
}
//! [qtconcurrentmapkernel-7]