diff options
Diffstat (limited to 'src/concurrent/qtconcurrentmap.h')
-rw-r--r-- | src/concurrent/qtconcurrentmap.h | 395 |
1 files changed, 228 insertions, 167 deletions
diff --git a/src/concurrent/qtconcurrentmap.h b/src/concurrent/qtconcurrentmap.h index e6a434f852..4043ecd8a2 100644 --- a/src/concurrent/qtconcurrentmap.h +++ b/src/concurrent/qtconcurrentmap.h @@ -57,52 +57,55 @@ namespace QtConcurrent { // map() on sequences template <typename Sequence, typename MapFunctor> -QFuture<void> map(QThreadPool *pool, Sequence &&sequence, MapFunctor map) +QFuture<void> map(QThreadPool *pool, Sequence &&sequence, MapFunctor &&map) { - return startMap(pool, sequence.begin(), sequence.end(), map); + return startMap(pool, sequence.begin(), sequence.end(), std::forward<MapFunctor>(map)); } template <typename Sequence, typename MapFunctor> -QFuture<void> map(Sequence &&sequence, MapFunctor map) +QFuture<void> map(Sequence &&sequence, MapFunctor &&map) { - return startMap(QThreadPool::globalInstance(), sequence.begin(), sequence.end(), map); + return startMap(QThreadPool::globalInstance(), sequence.begin(), sequence.end(), + std::forward<MapFunctor>(map)); } // map() on iterators template <typename Iterator, typename MapFunctor> -QFuture<void> map(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor map) +QFuture<void> map(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor &&map) { - return startMap(pool, begin, end, map); + return startMap(pool, begin, end, std::forward<MapFunctor>(map)); } template <typename Iterator, typename MapFunctor> -QFuture<void> map(Iterator begin, Iterator end, MapFunctor map) +QFuture<void> map(Iterator begin, Iterator end, MapFunctor &&map) { - return startMap(QThreadPool::globalInstance(), begin, end, map); + return startMap(QThreadPool::globalInstance(), begin, end, std::forward<MapFunctor>(map)); } // mappedReduced() for sequences. template <typename ResultType, typename Sequence, typename MapFunctor, typename ReduceFunctor> QFuture<ResultType> mappedReduced(QThreadPool *pool, Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType> - (pool, std::forward<Sequence>(sequence), map, reduce, options); + (pool, std::forward<Sequence>(sequence), std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); } template <typename ResultType, typename Sequence, typename MapFunctor, typename ReduceFunctor> QFuture<ResultType> mappedReduced(Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType> - (QThreadPool::globalInstance(), std::forward<Sequence>(sequence), map, reduce, options); + (QThreadPool::globalInstance(), std::forward<Sequence>(sequence), + std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), options); } #ifdef Q_CLANG_QDOC @@ -115,14 +118,15 @@ template <typename ResultType, typename Sequence, typename MapFunctor, typename #endif QFuture<ResultType> mappedReduced(QThreadPool *pool, Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType>( - pool, std::forward<Sequence>(sequence), map, reduce, + pool, std::forward<Sequence>(sequence), std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); } #ifdef Q_CLANG_QDOC @@ -134,41 +138,45 @@ template <typename ResultType, typename Sequence, typename MapFunctor, typename std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> #endif QFuture<ResultType> mappedReduced(Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType> - (QThreadPool::globalInstance(), std::forward<Sequence>(sequence), map, reduce, + (QThreadPool::globalInstance(), std::forward<Sequence>(sequence), + std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); } template <typename Sequence, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType> QFuture<ResultType> mappedReduced(QThreadPool *pool, Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType> - (pool, std::forward<Sequence>(sequence), map, reduce, options); + (pool, std::forward<Sequence>(sequence), std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); } template <typename Sequence, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> -QFuture<ResultType> mappedReduced( - Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType> +QFuture<ResultType> mappedReduced(Sequence &&sequence, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType> - (QThreadPool::globalInstance(), std::forward<Sequence>(sequence), map, reduce, options); + (QThreadPool::globalInstance(), std::forward<Sequence>(sequence), + std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), options); } #ifdef Q_CLANG_QDOC @@ -176,20 +184,22 @@ template <typename Sequence, typename MapFunctor, typename ReduceFunctor, typena typename InitialValueType> #else template <typename Sequence, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType, + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType, typename InitialValueType, std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> #endif QFuture<ResultType> mappedReduced(QThreadPool *pool, Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType>( - pool, std::forward<Sequence>(sequence), map, reduce, + pool, std::forward<Sequence>(sequence), std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); } @@ -198,19 +208,21 @@ template <typename Sequence, typename MapFunctor, typename ReduceFunctor, typena typename InitialValueType> #else template <typename Sequence, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType, + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType, typename InitialValueType, std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> #endif QFuture<ResultType> mappedReduced(Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Sequence, MapFunctor>, ResultType> - (QThreadPool::globalInstance(), std::forward<Sequence>(sequence), map, reduce, + (QThreadPool::globalInstance(), std::forward<Sequence>(sequence), + std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); } @@ -219,25 +231,27 @@ template <typename ResultType, typename Iterator, typename MapFunctor, typename QFuture<ResultType> mappedReduced(QThreadPool *pool, Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType> - (pool, begin, end, map, reduce, options); + (pool, begin, end, std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), + options); } template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor> QFuture<ResultType> mappedReduced(Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType> - (QThreadPool::globalInstance(), begin, end, map, reduce, options); + (QThreadPool::globalInstance(), begin, end, std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); } #ifdef Q_CLANG_QDOC @@ -251,14 +265,14 @@ template <typename ResultType, typename Iterator, typename MapFunctor, typename QFuture<ResultType> mappedReduced(QThreadPool *pool, Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType> - (pool, begin, end, map, reduce, + (pool, begin, end, std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); } @@ -272,42 +286,46 @@ template <typename ResultType, typename Iterator, typename MapFunctor, typename #endif QFuture<ResultType> mappedReduced(Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType> - (QThreadPool::globalInstance(), begin, end, map, reduce, + (QThreadPool::globalInstance(), begin, end, std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); } template <typename Iterator, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType> QFuture<ResultType> mappedReduced(QThreadPool *pool, Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType> - (pool, begin, end, map, reduce, options); + return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType>( + pool, begin, end, std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), + options); } template <typename Iterator, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> + typename ResultType = typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType> QFuture<ResultType> mappedReduced(Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType> - (QThreadPool::globalInstance(), begin, end, map, reduce, options); + (QThreadPool::globalInstance(), begin, end, std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); } #ifdef Q_CLANG_QDOC @@ -315,43 +333,46 @@ template <typename Iterator, typename MapFunctor, typename ReduceFunctor, typena typename InitialValueType> #else template <typename Iterator, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType, + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType, typename InitialValueType, std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> #endif QFuture<ResultType> mappedReduced(QThreadPool *pool, Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType> - (pool, begin, end, map, reduce, ResultType(std::forward<InitialValueType>(initialValue)), - options); + (pool, begin, end, std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), + ResultType(std::forward<InitialValueType>(initialValue)), options); } #ifdef Q_CLANG_QDOC template <typename Iterator, typename MapFunctor, typename ReduceFunctor, typename ResultType, typename InitialValueType> #else -template <typename Iterator, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType, - typename InitialValueType, - std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> +template<typename Iterator, typename MapFunctor, typename ReduceFunctor, + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType, + typename InitialValueType, + std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> #endif QFuture<ResultType> mappedReduced(Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { return startMappedReduced<QtPrivate::MapResultType<Iterator, MapFunctor>, ResultType> - (QThreadPool::globalInstance(), begin, end, map, reduce, + (QThreadPool::globalInstance(), begin, end, std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); } @@ -360,19 +381,20 @@ template <typename Sequence, typename MapFunctor> QFuture<QtPrivate::MapResultType<Sequence, MapFunctor>> mapped( QThreadPool *pool, Sequence &&sequence, - MapFunctor map) + MapFunctor &&map) { return startMapped<QtPrivate::MapResultType<Sequence, MapFunctor>>( - pool, std::forward<Sequence>(sequence), map); + pool, std::forward<Sequence>(sequence), std::forward<MapFunctor>(map)); } template <typename Sequence, typename MapFunctor> QFuture<QtPrivate::MapResultType<Sequence, MapFunctor>> mapped( Sequence &&sequence, - MapFunctor map) + MapFunctor &&map) { return startMapped<QtPrivate::MapResultType<Sequence, MapFunctor>> - (QThreadPool::globalInstance(), std::forward<Sequence>(sequence), map); + (QThreadPool::globalInstance(), std::forward<Sequence>(sequence), + std::forward<MapFunctor>(map)); } // mapped() for iterator ranges. @@ -381,48 +403,52 @@ QFuture<QtPrivate::MapResultType<Iterator, MapFunctor>> mapped( QThreadPool *pool, Iterator begin, Iterator end, - MapFunctor map) + MapFunctor &&map) { - return startMapped<QtPrivate::MapResultType<Iterator, MapFunctor>>(pool, begin, end, map); + return startMapped<QtPrivate::MapResultType<Iterator, MapFunctor>>( + pool, begin, end, std::forward<MapFunctor>(map)); } template <typename Iterator, typename MapFunctor> QFuture<QtPrivate::MapResultType<Iterator, MapFunctor>> mapped( Iterator begin, Iterator end, - MapFunctor map) + MapFunctor &&map) { return startMapped<QtPrivate::MapResultType<Iterator, MapFunctor>> - (QThreadPool::globalInstance(), begin, end, map); + (QThreadPool::globalInstance(), begin, end, std::forward<MapFunctor>(map)); } // blockingMap() for sequences template <typename Sequence, typename MapFunctor> void blockingMap(QThreadPool *pool, Sequence &&sequence, MapFunctor map) { - QFuture<void> future = startMap(pool, sequence.begin(), sequence.end(), map); + QFuture<void> future = + startMap(pool, sequence.begin(), sequence.end(), std::forward<MapFunctor>(map)); future.waitForFinished(); } template <typename Sequence, typename MapFunctor> -void blockingMap(Sequence &&sequence, MapFunctor map) +void blockingMap(Sequence &&sequence, MapFunctor &&map) { - QFuture<void> future = startMap(QThreadPool::globalInstance(), sequence.begin(), sequence.end(), map); + QFuture<void> future = startMap(QThreadPool::globalInstance(), sequence.begin(), sequence.end(), + std::forward<MapFunctor>(map)); future.waitForFinished(); } // blockingMap() for iterator ranges template <typename Iterator, typename MapFunctor> -void blockingMap(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor map) +void blockingMap(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor &&map) { QFuture<void> future = startMap(pool, begin, end, map); future.waitForFinished(); } template <typename Iterator, typename MapFunctor> -void blockingMap(Iterator begin, Iterator end, MapFunctor map) +void blockingMap(Iterator begin, Iterator end, MapFunctor &&map) { - QFuture<void> future = startMap(QThreadPool::globalInstance(), begin, end, map); + QFuture<void> future = startMap(QThreadPool::globalInstance(), begin, end, + std::forward<MapFunctor>(map)); future.waitForFinished(); } @@ -430,25 +456,29 @@ void blockingMap(Iterator begin, Iterator end, MapFunctor map) template <typename ResultType, typename Sequence, typename MapFunctor, typename ReduceFunctor> ResultType blockingMappedReduced(QThreadPool *pool, Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = - mappedReduced<ResultType>(pool, std::forward<Sequence>(sequence), map, reduce, options); + mappedReduced<ResultType>(pool, std::forward<Sequence>(sequence), + std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); return future.takeResult(); } template <typename ResultType, typename Sequence, typename MapFunctor, typename ReduceFunctor> ResultType blockingMappedReduced(Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = - mappedReduced<ResultType>(std::forward<Sequence>(sequence), map, reduce, options); + mappedReduced<ResultType>(std::forward<Sequence>(sequence), + std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); return future.takeResult(); } @@ -462,14 +492,15 @@ template <typename ResultType, typename Sequence, typename MapFunctor, typename #endif ResultType blockingMappedReduced(QThreadPool *pool, Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = mappedReduced<ResultType>( - pool, std::forward<Sequence>(sequence), map, reduce, + pool, std::forward<Sequence>(sequence), std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); return future.takeResult(); } @@ -483,42 +514,49 @@ template <typename ResultType, typename Sequence, typename MapFunctor, typename std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> #endif ResultType blockingMappedReduced(Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = mappedReduced<ResultType>( - std::forward<Sequence>(sequence), map, reduce, + std::forward<Sequence>(sequence), std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); return future.takeResult(); } template <typename MapFunctor, typename ReduceFunctor, typename Sequence, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType> ResultType blockingMappedReduced(QThreadPool *pool, Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = - mappedReduced<ResultType>(pool, std::forward<Sequence>(sequence), map, reduce, options); + mappedReduced<ResultType>(pool, std::forward<Sequence>(sequence), + std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); return future.takeResult(); } template <typename MapFunctor, typename ReduceFunctor, typename Sequence, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType> ResultType blockingMappedReduced(Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = - mappedReduced<ResultType>(std::forward<Sequence>(sequence), map, reduce, options); + mappedReduced<ResultType>(std::forward<Sequence>(sequence), + std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); return future.takeResult(); } @@ -527,20 +565,22 @@ template <typename MapFunctor, typename ReduceFunctor, typename Sequence, typena typename InitialValueType> #else template <typename MapFunctor, typename ReduceFunctor, typename Sequence, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType, + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType, typename InitialValueType, std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> #endif ResultType blockingMappedReduced(QThreadPool *pool, Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = mappedReduced<ResultType>( - pool, std::forward<Sequence>(sequence), map, reduce, + pool, std::forward<Sequence>(sequence), std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); return future.takeResult(); } @@ -549,20 +589,22 @@ ResultType blockingMappedReduced(QThreadPool *pool, template <typename MapFunctor, typename ReduceFunctor, typename Sequence, typename ResultType, typename InitialValueType> #else -template <typename MapFunctor, typename ReduceFunctor, typename Sequence, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType, - typename InitialValueType, - std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> +template<typename MapFunctor, typename ReduceFunctor, typename Sequence, + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType, + typename InitialValueType, + std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> #endif ResultType blockingMappedReduced(Sequence &&sequence, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = mappedReduced<ResultType>( - std::forward<Sequence>(sequence), map, reduce, + std::forward<Sequence>(sequence), std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), ResultType(std::forward<InitialValueType>(initialValue)), options); return future.takeResult(); } @@ -572,24 +614,28 @@ template <typename ResultType, typename Iterator, typename MapFunctor, typename ResultType blockingMappedReduced(QThreadPool *pool, Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - QFuture<ResultType> future = mappedReduced<ResultType>(pool, begin, end, map, reduce, options); + QFuture<ResultType> future = + mappedReduced<ResultType>(pool, begin, end, std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); return future.takeResult(); } template <typename ResultType, typename Iterator, typename MapFunctor, typename ReduceFunctor> ResultType blockingMappedReduced(Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - QFuture<ResultType> future = mappedReduced<ResultType>(begin, end, map, reduce, options); + QFuture<ResultType> future = + mappedReduced<ResultType>(begin, end, std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); return future.takeResult(); } @@ -604,14 +650,15 @@ template <typename ResultType, typename Iterator, typename MapFunctor, typename ResultType blockingMappedReduced(QThreadPool *pool, Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = mappedReduced<ResultType>( - pool, begin, end, map, reduce, ResultType(std::forward<InitialValueType>(initialValue)), + pool, begin, end, std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), + ResultType(std::forward<InitialValueType>(initialValue)), options); return future.takeResult(); } @@ -626,42 +673,49 @@ template <typename ResultType, typename Iterator, typename MapFunctor, typename #endif ResultType blockingMappedReduced(Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = mappedReduced<ResultType>( - begin, end, map, reduce, ResultType(std::forward<InitialValueType>(initialValue)), + begin, end, std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), + ResultType(std::forward<InitialValueType>(initialValue)), options); return future.takeResult(); } template <typename Iterator, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType> ResultType blockingMappedReduced(QThreadPool *pool, Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - QFuture<ResultType> future = mappedReduced<ResultType>(pool, begin, end, map, reduce, options); + QFuture<ResultType> future = + mappedReduced<ResultType>(pool, begin, end, std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); return future.takeResult(); } template <typename Iterator, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType> ResultType blockingMappedReduced(Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { - QFuture<ResultType> future = mappedReduced<ResultType>(begin, end, map, reduce, options); + QFuture<ResultType> future = + mappedReduced<ResultType>(begin, end, std::forward<MapFunctor>(map), + std::forward<ReduceFunctor>(reduce), options); return future.takeResult(); } @@ -670,22 +724,23 @@ template <typename Iterator, typename MapFunctor, typename ReduceFunctor, typena typename InitialValueType> #else template <typename Iterator, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType, + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType, typename InitialValueType, std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> #endif ResultType blockingMappedReduced(QThreadPool *pool, Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = mappedReduced<ResultType>( - pool, begin, end, map, reduce, ResultType(std::forward<InitialValueType>(initialValue)), - options); + pool, begin, end, std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), + ResultType(std::forward<InitialValueType>(initialValue)), options); return future.takeResult(); } @@ -694,88 +749,94 @@ template <typename Iterator, typename MapFunctor, typename ReduceFunctor, typena typename InitialValueType> #else template <typename Iterator, typename MapFunctor, typename ReduceFunctor, - typename ResultType = typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType, + typename ResultType = + typename QtPrivate::ReduceResultType<std::decay_t<ReduceFunctor>>::ResultType, typename InitialValueType, std::enable_if_t<std::is_convertible_v<InitialValueType, ResultType>, int> = 0> #endif ResultType blockingMappedReduced(Iterator begin, Iterator end, - MapFunctor map, - ReduceFunctor reduce, + MapFunctor &&map, + ReduceFunctor &&reduce, InitialValueType &&initialValue, ReduceOptions options = ReduceOptions(UnorderedReduce | SequentialReduce)) { QFuture<ResultType> future = mappedReduced<ResultType>( - begin, end, map, reduce, ResultType(std::forward<InitialValueType>(initialValue)), - options); + begin, end, std::forward<MapFunctor>(map), std::forward<ReduceFunctor>(reduce), + ResultType(std::forward<InitialValueType>(initialValue)), options); return future.takeResult(); } // mapped() for sequences with a different putput sequence type. template <typename OutputSequence, typename InputSequence, typename MapFunctor> -OutputSequence blockingMapped(QThreadPool *pool, InputSequence &&sequence, MapFunctor map) +OutputSequence blockingMapped(QThreadPool *pool, InputSequence &&sequence, MapFunctor &&map) { - return blockingMappedReduced<OutputSequence>(pool, std::forward<InputSequence>(sequence), map, - QtPrivate::PushBackWrapper(), OrderedReduce); + return blockingMappedReduced<OutputSequence>(pool, std::forward<InputSequence>(sequence), + std::forward<MapFunctor>(map), + QtPrivate::PushBackWrapper(), OrderedReduce); } template <typename OutputSequence, typename InputSequence, typename MapFunctor> -OutputSequence blockingMapped(InputSequence &&sequence, MapFunctor map) +OutputSequence blockingMapped(InputSequence &&sequence, MapFunctor &&map) { - return blockingMappedReduced<OutputSequence>(QThreadPool::globalInstance(), - std::forward<InputSequence>(sequence), map, - QtPrivate::PushBackWrapper(), OrderedReduce); + return blockingMappedReduced<OutputSequence>( + QThreadPool::globalInstance(), std::forward<InputSequence>(sequence), + std::forward<MapFunctor>(map), QtPrivate::PushBackWrapper(), OrderedReduce); } template <typename MapFunctor, typename InputSequence> -auto blockingMapped(QThreadPool *pool, InputSequence &&sequence, MapFunctor map) +auto blockingMapped(QThreadPool *pool, InputSequence &&sequence, MapFunctor &&map) { using OutputSequence = typename QtPrivate::MapSequenceResultType<std::decay_t<InputSequence>, MapFunctor>::ResultType; - return blockingMappedReduced<OutputSequence>(pool, std::forward<InputSequence>(sequence), map, + return blockingMappedReduced<OutputSequence>(pool, std::forward<InputSequence>(sequence), + std::forward<MapFunctor>(map), QtPrivate::PushBackWrapper(), OrderedReduce); } template <typename MapFunctor, typename InputSequence> -auto blockingMapped(InputSequence &&sequence, MapFunctor map) +auto blockingMapped(InputSequence &&sequence, MapFunctor &&map) { using OutputSequence = typename QtPrivate::MapSequenceResultType<std::decay_t<InputSequence>, MapFunctor>::ResultType; return blockingMappedReduced<OutputSequence>(QThreadPool::globalInstance(), - std::forward<InputSequence>(sequence), map, + std::forward<InputSequence>(sequence), + std::forward<MapFunctor>(map), QtPrivate::PushBackWrapper(), OrderedReduce); } // mapped() for iterator ranges template <typename Sequence, typename Iterator, typename MapFunctor> -Sequence blockingMapped(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor map) +Sequence blockingMapped(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor &&map) { - return blockingMappedReduced<Sequence>(pool, begin, end, map, + return blockingMappedReduced<Sequence>(pool, begin, end, std::forward<MapFunctor>(map), QtPrivate::PushBackWrapper(), OrderedReduce); } template <typename Sequence, typename Iterator, typename MapFunctor> -Sequence blockingMapped(Iterator begin, Iterator end, MapFunctor map) +Sequence blockingMapped(Iterator begin, Iterator end, MapFunctor &&map) { - return blockingMappedReduced<Sequence>(QThreadPool::globalInstance(), begin, end, map, - QtPrivate::PushBackWrapper(), OrderedReduce); + return blockingMappedReduced<Sequence>(QThreadPool::globalInstance(), begin, end, + std::forward<MapFunctor>(map), + QtPrivate::PushBackWrapper(), OrderedReduce); } template <typename Iterator, typename MapFunctor> -auto blockingMapped(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor map) +auto blockingMapped(QThreadPool *pool, Iterator begin, Iterator end, MapFunctor &&map) { using OutputSequence = QtPrivate::MapResultType<Iterator, MapFunctor>; - return blockingMappedReduced<OutputSequence>(pool, begin, end, map, + return blockingMappedReduced<OutputSequence>(pool, begin, end, std::forward<MapFunctor>(map), QtPrivate::PushBackWrapper(), OrderedReduce); } template <typename Iterator, typename MapFunctor> -auto blockingMapped(Iterator begin, Iterator end, MapFunctor map) +auto blockingMapped(Iterator begin, Iterator end, MapFunctor &&map) { using OutputSequence = QtPrivate::MapResultType<Iterator, MapFunctor>; - return blockingMappedReduced<OutputSequence>(QThreadPool::globalInstance(), begin, end, map, - QtPrivate::PushBackWrapper(), OrderedReduce); + return blockingMappedReduced<OutputSequence>(QThreadPool::globalInstance(), begin, end, + std::forward<MapFunctor>(map), + QtPrivate::PushBackWrapper(), OrderedReduce); } } // namespace QtConcurrent |