6 #ifndef SWIFT_MISC_INVOKE_H
7 #define SWIFT_MISC_INVOKE_H
11 #include <QMetaObject>
18 namespace swift::misc::private_ns
24 template <
typename F,
typename T,
typename U,
size_t... Is>
25 decltype(
auto) invokeSlotImpl(F ptr, T *
object, U tuple, std::index_sequence<Is...>, std::true_type)
28 return (object->*ptr)(std::forward<std::tuple_element_t<Is, U>>(std::get<Is>(tuple))...);
30 template <
typename F,
typename T,
typename U,
size_t... Is>
31 decltype(
auto) invokeSlotImpl(F &&func, T *, U tuple, std::index_sequence<Is...>, std::false_type)
34 return std::forward<F>(func)(std::forward<std::tuple_element_t<Is, U>>(std::get<Is>(tuple))...);
36 template <
typename F,
typename T,
typename... Ts>
37 decltype(
auto) invokeSlot(F &&func, T *
object, Ts &&...args)
40 MaskSequence<std::make_index_sequence<
sizeof...(Ts)>, !TIsQPrivateSignal<std::decay_t<Ts>>::value...>;
41 return invokeSlotImpl(std::forward<F>(func), object, std::forward_as_tuple(std::forward<Ts>(args)...), seq(),
42 std::is_member_pointer<std::decay_t<F>>());
47 template <
typename T,
typename F,
typename... Ts>
48 auto invokeMethod(T *
object, F &&func, Ts &&...args)
50 const auto invoker = [](
auto &&...x) {
return private_ns::invokeSlot(std::forward<decltype(x)>(x)...); };
51 auto method = std::bind(invoker, std::forward<F>(func),
object, std::forward<Ts>(args)...);
52 CPromise<decltype(std::move(method)())> promise;
53 QMetaObject::invokeMethod(
54 object, [promise, method = std::move(method)]()
mutable { promise.setResultFrom(std::move(method)); });
55 return promise.future();