More work on signal returning value

This commit is contained in:
Olivier Goffart 2020-12-01 17:58:18 +01:00
parent 276e11a101
commit e73bbbcd10
8 changed files with 107 additions and 39 deletions

View file

@ -13,8 +13,46 @@ LICENSE END */
namespace sixtyfps {
template<typename = void()> struct Signal;
template<typename Ret, typename... Arg>
struct Signal<Ret(Arg...)>
{
Signal() { cbindgen_private::sixtyfps_signal_init(&inner); }
~Signal() { cbindgen_private::sixtyfps_signal_drop(&inner); }
Signal(const Signal &) = delete;
Signal(Signal &&) = delete;
Signal &operator=(const Signal &) = delete;
template<typename F>
void set_handler(F binding) const
{
cbindgen_private::sixtyfps_signal_set_handler(
&inner,
[](void *user_data, const void *arg) {
auto *p = reinterpret_cast<const Pair*>(arg);
*p->first = std::apply(*reinterpret_cast<F *>(user_data), p->second);
},
new F(std::move(binding)),
[](void *user_data) { delete reinterpret_cast<F *>(user_data); });
}
Ret emit(const Arg &...arg) const
{
Ret r{};
Pair p = std::pair{ &r, Tuple{arg...} };
cbindgen_private::sixtyfps_signal_emit(&inner, &p);
return r;
}
private:
using Tuple = std::tuple<Arg...>;
using Pair = std::pair<Ret *, Tuple>;
cbindgen_private::SignalOpaque inner;
};
template<typename... Arg>
struct Signal
struct Signal<void(Arg...)>
{
Signal() { cbindgen_private::sixtyfps_signal_init(&inner); }
~Signal() { cbindgen_private::sixtyfps_signal_drop(&inner); }
@ -45,4 +83,8 @@ private:
using Tuple = std::tuple<Arg...>;
cbindgen_private::SignalOpaque inner;
};
}