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;
36 promise.finish(std::move(value));
37 return promise.
task();
44 return promise.
task();
48template<
typename Result,
typename Input,
typename Converter>
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));
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>
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>
118 using IqType = std::decay_t<decltype(std::get<0>(Result {}))>;
119 return chain<Result>(std::move(input), context, [](Input &&sendResult)
mutable {
120 return parseIq<IqType, Result>(sendResult);
Create and update QXmppTask objects to communicate results of asynchronous operations.
Definition QXmppPromise.h:23
QXmppTask< T > task()
Definition QXmppPromise.h:86
Definition QXmppTask.h:46
Definition QXmppError.h:17