8#include "QXmppAsync_p.h"
9#include "QXmppGlobal.h"
14#include <QFutureWatcher>
16namespace QXmpp::Private {
18template<
typename Function>
19auto later(QObject *context, Function function)
21 QMetaObject::invokeMethod(context, std::forward<Function>(function), Qt::QueuedConnection);
24#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
26QFuture<T> makeReadyFuture(T &&value) {
return QtFuture::makeReadyValueFuture(std::move(value)); }
27#elif QT_VERSION >= QT_VERSION_CHECK(6, 1, 0)
28using QtFuture::makeReadyFuture;
31QFuture<T> makeReadyFuture(T &&value)
33 QFutureInterface<T> interface(QFutureInterfaceBase::Started);
34 interface.reportResult(std::move(value));
35 interface.reportFinished();
36 return interface.future();
39inline QFuture<void> makeReadyFuture()
41 using State = QFutureInterfaceBase::State;
42 return QFutureInterface<void>(State(State::Started | State::Finished)).future();
46template<
typename T,
typename Handler>
47void await(
const QFuture<T> &future, QObject *context, Handler handler)
49 auto *watcher =
new QFutureWatcher<T>(context);
50 QObject::connect(watcher, &QFutureWatcherBase::finished,
51 context, [watcher, handler = std::move(handler)]()
mutable {
52 handler(watcher->result());
53 watcher->deleteLater();
55 watcher->setFuture(future);
58template<
typename Handler>
59void await(
const QFuture<void> &future, QObject *context, Handler handler)
61 auto *watcher =
new QFutureWatcher<void>(context);
62 QObject::connect(watcher, &QFutureWatcherBase::finished,
63 context, [watcher, handler = std::move(handler)]()
mutable {
65 watcher->deleteLater();
67 watcher->setFuture(future);
70template<
typename T,
typename Err,
typename Function>
71auto mapSuccess(std::variant<T, Err> var, Function lambda)
73 using MapResult = std::decay_t<
decltype(lambda({}))>;
74 using MappedVariant = std::variant<MapResult, Err>;
75 return std::visit(overloaded {
76 [lambda = std::move(lambda)](T val) -> MappedVariant {
77 return lambda(std::move(val));
79 [](Err err) -> MappedVariant {
85template<
typename T,
typename Err>
86auto mapToSuccess(std::variant<T, Err> var)
88 return mapSuccess(std::move(var), [](T) {
93template<
typename T,
typename Err>
96 return chain<std::variant<QXmpp::Success, QXmppError>>(std::move(source), context, mapToSuccess<T, Err>);
99template<
typename Input,
typename Converter>
100auto chainMapSuccess(
QXmppTask<Input> &&source, QObject *context, Converter convert)
102 return chain<std::variant<
decltype(convert({})),
QXmppError>>(std::move(source), context, [convert](Input &&input) {
103 return mapSuccess(std::move(input), convert);
Definition QXmppTask.h:46
Definition QXmppError.h:17