From 102f7d31c469a546f52c930a047bd294fb198186 Mon Sep 17 00:00:00 2001 From: Sona Kurazyan Date: Thu, 4 Nov 2021 17:01:54 +0100 Subject: Add support for combining multiple QFutures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ChangeLog][QtCore] Added QtFuture::whenAll() and QtFuture::whenAny() functions, returning a QFuture that becomes ready when all or any of the supplied futures complete. Task-number: QTBUG-86714 Change-Id: I2bb7dbb4cdc4f79a7a4fd494142df6a0f93a2b39 Reviewed-by: Edward Welbourne Reviewed-by: MÃ¥rten Nordheim --- src/corelib/thread/qfuture.h | 84 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) (limited to 'src/corelib/thread/qfuture.h') diff --git a/src/corelib/thread/qfuture.h b/src/corelib/thread/qfuture.h index 094b3471b8..7aed38be16 100644 --- a/src/corelib/thread/qfuture.h +++ b/src/corelib/thread/qfuture.h @@ -314,6 +314,9 @@ private: friend class QtPrivate::FailureHandler; #endif + template + friend struct QtPrivate::WhenAnyContext; + using QFuturePrivate = std::conditional_t, QFutureInterfaceBase, QFutureInterface>; @@ -456,6 +459,87 @@ struct MetaTypeQFutureHelper> } // namespace QtPrivate +namespace QtFuture { + +#ifndef Q_CLANG_QDOC + +template::value_type, + std::enable_if_t, + QtPrivate::IsRandomAccessible, + QtPrivate::isQFuture>, + int> = 0> +QFuture whenAll(InputIt first, InputIt last) +{ + return QtPrivate::whenAllImpl(first, last); +} + +template::value_type, + std::enable_if_t, + QtPrivate::isQFuture>, + int> = 0> +QFuture> whenAll(InputIt first, InputIt last) +{ + return QtPrivate::whenAllImpl, InputIt, ValueType>(first, last); +} + +template, + QtPrivate::NotEmpty, + QtPrivate::isQFuture>...>, + int> = 0> +QFuture whenAll(Futures &&... futures) +{ + return QtPrivate::whenAllImpl(std::forward(futures)...); +} + +template, + QtPrivate::isQFuture>...>, + int> = 0> +QFuture...>>> whenAll(Futures &&... futures) +{ + return QtPrivate::whenAllImpl...>>, Futures...>( + std::forward(futures)...); +} + +template::value_type, + std::enable_if_t, + QtPrivate::isQFuture>, + int> = 0> +QFuture::type>> whenAny(InputIt first, + InputIt last) +{ + return QtPrivate::whenAnyImpl(first, last); +} + +template, + QtPrivate::isQFuture>...>, + int> = 0> +QFuture...>> whenAny(Futures &&... futures) +{ + return QtPrivate::whenAnyImpl(std::forward(futures)...); +} + +#else + +template +QFuture whenAll(InputIt first, InputIt last); + +template +QFuture whenAll(Futures &&... futures); + +template +QFuture> whenAny(InputIt first, InputIt last); + +template +QFuture...>> whenAny(Futures &&... futures); + +#endif // Q_CLANG_QDOC + +} // namespace QtFuture + Q_DECLARE_SEQUENTIAL_ITERATOR(Future) QT_END_NAMESPACE -- cgit v1.2.3