17 template<
typename Ctx,
typename F,
typename... Args>
22 std::tuple<Ctx&, std::decay_t<Args>...>
Args_;
24 using R = std::invoke_result_t<std::decay_t<F>, Ctx&, std::decay_t<Args>...>;
25 constexpr static bool IsVoid = std::is_same_v<R, void>;
27 std::conditional_t<IsVoid, Void, std::optional<R>>
Result_ {};
40 const auto thread = QThread::currentThread ();
41 QMetaObject::invokeMethod (&
Ctx_,
56 Ready_.store (
true, std::memory_order_release);
58 QMetaObject::invokeMethod (thread, handle, Qt::QueuedConnection);
60 Qt::QueuedConnection);
65 while (!
Ready_.load (std::memory_order_acquire))
79 template<
typename Ctx,
typename F,
typename... Args>
82 return detail::MethodAwaiter<Ctx, F, Args...> { ctx, std::forward<F> (method), { ctx, std::forward<Args> (args)... } };
auto MetaMethod(Ctx &ctx, F &&method, Args &&... args)
static constexpr bool IsVoid
bool await_ready() const noexcept
std::invoke_result_t< std::decay_t< F >, Ctx &, std::decay_t< Args >... > R
void await_suspend(std::coroutine_handle<> handle) noexcept
std::tuple< Ctx &, std::decay_t< Args >... > Args_
std::conditional_t< IsVoid, Void, std::optional< R > > Result_
std::decay_t< F > Method_
std::exception_ptr Exception_