aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2021-08-26 16:42:17 +0200
committerLinus Jahn <lnj@kaidan.im>2021-08-26 16:42:17 +0200
commited8e1ccc3522d9cbbd2d751d1a4a66b1ebe21390 (patch)
tree3905113c068e8df03e83653fd95fc298648b453e /src
parentdf4d7a98d8172754e53b2a3e74f239b76f05f8bc (diff)
downloadqxmpp-ed8e1ccc3522d9cbbd2d751d1a4a66b1ebe21390.tar.gz
FutureUtils: Add await() function
Diffstat (limited to 'src')
-rw-r--r--src/base/QXmppFutureUtils_p.h24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/base/QXmppFutureUtils_p.h b/src/base/QXmppFutureUtils_p.h
index 531d52e3..720e6df4 100644
--- a/src/base/QXmppFutureUtils_p.h
+++ b/src/base/QXmppFutureUtils_p.h
@@ -82,6 +82,30 @@ inline QFuture<void> makeReadyFuture()
return QFutureInterface<void>(State(State::Started | State::Finished)).future();
}
+template<typename T, typename Handler>
+void await(const QFuture<T> &future, QObject *context, Handler handler)
+{
+ auto *watcher = new QFutureWatcher<T>(context);
+ QObject::connect(watcher, &QFutureWatcherBase::finished,
+ context, [watcher, handler { std::move(handler) }]() {
+ handler(watcher->result());
+ watcher->deleteLater();
+ });
+ watcher->setFuture(future);
+}
+
+template<typename Handler>
+void await(const QFuture<void> &future, QObject *context, Handler handler)
+{
+ auto *watcher = new QFutureWatcher<void>(context);
+ QObject::connect(watcher, &QFutureWatcherBase::finished,
+ context, [watcher, handler { std::move(handler) }]() {
+ handler();
+ watcher->deleteLater();
+ });
+ watcher->setFuture(future);
+}
+
template<typename Result, typename Input, typename Converter>
auto chain(QFuture<Input> &&source, QObject *context, Converter task) -> QFuture<Result>
{