diff options
author | Sona Kurazyan <sona.kurazyan@qt.io> | 2020-12-04 17:20:29 +0100 |
---|---|---|
committer | Sona Kurazyan <sona.kurazyan@qt.io> | 2020-12-11 09:36:45 +0100 |
commit | 335acffe1d955b5fe4535dc1d99ec2c3dbe1b978 (patch) | |
tree | 4648a3814a956bbe5d0dc8c39bf4f120ce30c591 /src/corelib/thread/qfuture.h | |
parent | b283ce1e836ab08e602a11ea255ee3d8e537902e (diff) |
Add support of invoking QFuture continuations in a given context
Added overloads of .then()/.onFailed()/.onCanceled() which take a
pointer of a context object, and invoke the continuations in the
object's thread.
Task-number: QTBUG-86794
Change-Id: I0f3cbb0500695673fc4087af5d4b96b416e3e1ce
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Diffstat (limited to 'src/corelib/thread/qfuture.h')
-rw-r--r-- | src/corelib/thread/qfuture.h | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/corelib/thread/qfuture.h b/src/corelib/thread/qfuture.h index 101bdc7808..a56e9ee3ff 100644 --- a/src/corelib/thread/qfuture.h +++ b/src/corelib/thread/qfuture.h @@ -173,15 +173,25 @@ QT_WARNING_POP template<class Function> QFuture<ResultType<Function>> then(QThreadPool *pool, Function &&function); + template<class Function> + QFuture<ResultType<Function>> then(QObject *context, Function &&function); + #ifndef QT_NO_EXCEPTIONS template<class Function, typename = std::enable_if_t<!QtPrivate::ArgResolver<Function>::HasExtraArgs>> QFuture<T> onFailed(Function &&handler); + + template<class Function, + typename = std::enable_if_t<!QtPrivate::ArgResolver<Function>::HasExtraArgs>> + QFuture<T> onFailed(QObject *context, Function &&handler); #endif template<class Function, typename = std::enable_if_t<std::is_invocable_r_v<T, Function>>> QFuture<T> onCanceled(Function &&handler); + template<class Function, typename = std::enable_if_t<std::is_invocable_r_v<T, Function>>> + QFuture<T> onCanceled(QObject *context, Function &&handler); + class const_iterator { public: @@ -363,8 +373,18 @@ QFuture<typename QFuture<T>::template ResultType<Function>> QFuture<T>::then(QTh return promise.future(); } -#ifndef QT_NO_EXCEPTIONS +template<class T> +template<class Function> +QFuture<typename QFuture<T>::template ResultType<Function>> QFuture<T>::then(QObject *context, + Function &&function) +{ + QFutureInterface<ResultType<Function>> promise(QFutureInterfaceBase::State::Pending); + QtPrivate::Continuation<std::decay_t<Function>, ResultType<Function>, T>::create( + std::forward<Function>(function), this, promise, context); + return promise.future(); +} +#ifndef QT_NO_EXCEPTIONS template<class T> template<class Function, typename> QFuture<T> QFuture<T>::onFailed(Function &&handler) @@ -375,6 +395,16 @@ QFuture<T> QFuture<T>::onFailed(Function &&handler) return promise.future(); } +template<class T> +template<class Function, typename> +QFuture<T> QFuture<T>::onFailed(QObject *context, Function &&handler) +{ + QFutureInterface<T> promise(QFutureInterfaceBase::State::Pending); + QtPrivate::FailureHandler<std::decay_t<Function>, T>::create(std::forward<Function>(handler), + this, promise, context); + return promise.future(); +} + #endif template<class T> @@ -387,6 +417,16 @@ QFuture<T> QFuture<T>::onCanceled(Function &&handler) return promise.future(); } +template<class T> +template<class Function, typename> +QFuture<T> QFuture<T>::onCanceled(QObject *context, Function &&handler) +{ + QFutureInterface<T> promise(QFutureInterfaceBase::State::Pending); + QtPrivate::CanceledHandler<std::decay_t<Function>, T>::create(std::forward<Function>(handler), + this, promise, context); + return promise.future(); +} + inline QFuture<void> QFutureInterface<void>::future() { return QFuture<void>(this); |