28 template<
typename... Args>
31 using Ret = std::tuple<std::decay_t<Args>...>;
38 return Ret { args... };
41 static auto GetRet (std::optional<Ret>&& result)
43 constexpr auto ArgsCount =
sizeof... (Args);
45 if constexpr (ArgsCount == 1)
46 return std::move (result)
47 .transform ([] (
Ret&& tup) {
return std::get<0> (std::move (tup)); });
48 else if constexpr (ArgsCount > 1)
49 return std::move (result);
51 return static_cast<bool> (result);
55 template<
typename FunType>
58 template<
typename... Args>
61 using Ret = std::invoke_result_t<FunType, Args...>;
68 return std::invoke (
Fun_, std::move (args)...);
71 static auto GetRet (std::optional<Ret>&& result)
73 return std::move (result);
79 std::derived_from<QObject> Obj,
80 template<
typename...>
typename SyncHandler,
91 std::optional<typename Handler::Ret>
Result_ {};
92 std::coroutine_handle<>
Cont_ {};
111 QMetaObject::invokeMethod (
this,
Cont_, Qt::QueuedConnection);
117 QMetaObject::invokeMethod (
this,
Cont_, Qt::QueuedConnection);
124 return Handler::GetRet (std::move (
Result_));
140 QObject::connect (&
Obj_,
144 Qt::SingleShotConnection);
145 QObject::connect (&
Obj_,
158 std::derived_from<QObject> Obj,
159 template<
typename...>
typename SyncHandler,
170 SignalAwaiter<Obj, SyncHandler, Sig, SlotArgs...>
operator co_await ()
const
179 template<std::derived_from<QObject> Obj,
template<
typename...>
typename SyncHandler,
typename Sig,
typename SlotArgsList>
182 template<std::derived_from<QObject> Obj,
template<
typename...>
typename SyncHandler,
typename Sig,
typename... SlotArgs>
185 template<std::derived_from<QObject> Obj,
template<
typename...>
typename SyncHandler,
typename Sig,
typename... SlotArgs>
187 struct Signal<Obj, SyncHandler, Sig,
Typelist<SlotArgs...>> :
Signal<Obj, SyncHandler, Sig, decltype (Init (Typelist<SlotArgs...> {}))> {};
190 std::derived_from<QObject> Base,
191 std::derived_from<Base> Derived,
192 typename... SignalArgs
194 Signal (Derived&,
void (Base::*) (SignalArgs...))
198 void (Base::*) (SignalArgs...),
203 std::derived_from<QObject> Base,
204 std::derived_from<Base> Derived,
206 typename... SignalArgs
208 Signal (Derived&,
void (Base::*) (SignalArgs...), Handler)
212 void (Base::*) (SignalArgs...),
A proper void type, akin to unit (or ()) type in functional languages.
static auto GetRet(std::optional< Ret > &&result)
std::invoke_result_t< FunType, Args... > Ret
Ret Collect(Args... args)
void Handle(SlotArgs... args)
std::optional< typename Handler::Ret > Result_
std::exception_ptr Exception_
SyncHandler< SlotArgs... > Handler
std::coroutine_handle Cont_
bool await_ready() const noexcept
void await_suspend(std::coroutine_handle<> handle) noexcept
SyncHandler< SlotArgs... >::Arg SyncHandlerArg_
std::tuple< std::decay_t< Args >... > Ret
static auto GetRet(std::optional< Ret > &&result)
Ret Collect(Args... args) const