8#include "QXmppPromise.h"
9#include "QXmppVisitHelper_p.h"
14namespace QXmpp::Private {
17template<
typename F,
typename Ret,
typename A,
typename... Rest>
18A lambda_helper(Ret (F::*)(A, Rest...));
20template<
typename F,
typename Ret,
typename A,
typename... Rest>
21A lambda_helper(Ret (F::*)(A, Rest...)
const);
24struct first_argument {
25 using type =
decltype(lambda_helper(&F::operator()));
29using first_argument_t =
typename first_argument<F>::type;
33QXmppTask<T> makeReadyTask(T &&value)
35 QXmppPromise<T> promise;
36 promise.finish(std::move(value));
37 return promise.
task();
40inline QXmppTask<void> makeReadyTask()
42 QXmppPromise<void> promise;
44 return promise.
task();
48template<
typename Result,
typename Input,
typename Converter>
49auto chain(QXmppTask<Input> &&source, QObject *context, Converter convert) -> QXmppTask<Result>
51 QXmppPromise<Result> promise;
52 auto task = promise.
task();
53 if constexpr (std::is_void_v<Input>) {
54 source.then(context, [p = std::move(promise), convert = std::move(convert)]()
mutable {
55 if constexpr (std::is_void_v<Result>) {
63 source.then(context, [p = std::move(promise), convert = std::move(convert)](Input &&input)
mutable {
64 if constexpr (std::is_void_v<Result>) {
65 convert(std::move(input));
68 p.finish(convert(std::move(input)));
76template<
typename IqType,
typename Input,
typename Converter>
77auto parseIq(Input &&sendResult, Converter convert) ->
decltype(convert({}))
79 using Result =
decltype(convert({}));
80 return std::visit(overloaded {
81 [convert = std::move(convert)](
const QDomElement &element) -> Result {
84 return convert(std::move(iq));
86 [](QXmppError &&error) -> Result {
90 std::move(sendResult));
93template<
typename IqType,
typename Result,
typename Input>
94auto parseIq(Input &&sendResult) -> Result
96 return parseIq<IqType>(std::move(sendResult), [](IqType &&iq) -> Result {
103template<
typename Input,
typename Converter>
104auto chainIq(QXmppTask<Input> &&input, QObject *context, Converter convert) -> QXmppTask<
decltype(convert({}))>
106 using Result =
decltype(convert({}));
107 using IqType = std::decay_t<first_argument_t<Converter>>;
108 return chain<Result>(std::move(input), context, [convert = std::move(convert)](Input &&input) -> Result {
109 return parseIq<IqType>(std::move(input), convert);
114template<
typename Result,
typename Input>
115auto chainIq(QXmppTask<Input> &&input, QObject *context) -> QXmppTask<Result>
118 using IqType = std::decay_t<
decltype(
getValue(Result {}))>;
119 return chain<Result>(std::move(input), context, [](Input &&sendResult)
mutable {
120 return parseIq<IqType, Result>(sendResult);
QXmppTask< T > task()
Definition QXmppPromise.h:86
const T & getValue(const Result< T > &r)
Definition QXmppGlobal.h:232
Definition QXmppError.h:17