/* LICENSE BEGIN This file is part of the SixtyFPS Project -- https://sixtyfps.io Copyright (c) 2020 Olivier Goffart Copyright (c) 2020 Simon Hausmann SPDX-License-Identifier: GPL-3.0-only This file is also available under commercial licensing terms. Please contact info@sixtyfps.io for more information. LICENSE END */ #pragma once #include #include "sixtyfps_properties_internal.h" namespace sixtyfps { template struct Callback; template struct Callback { Callback() { cbindgen_private::sixtyfps_callback_init(&inner); } ~Callback() { cbindgen_private::sixtyfps_callback_drop(&inner); } Callback(const Callback &) = delete; Callback(Callback &&) = delete; Callback &operator=(const Callback &) = delete; template void set_handler(F binding) const { cbindgen_private::sixtyfps_callback_set_handler( &inner, [](void *user_data, const void *arg) { auto *p = reinterpret_cast(arg); *p->first = std::apply(*reinterpret_cast(user_data), p->second); }, new F(std::move(binding)), [](void *user_data) { delete reinterpret_cast(user_data); }); } Ret emit(const Arg &...arg) const { Ret r{}; Pair p = std::pair{ &r, Tuple{arg...} }; cbindgen_private::sixtyfps_callback_emit(&inner, &p); return r; } private: using Tuple = std::tuple; using Pair = std::pair; cbindgen_private::CallbackOpaque inner; }; template struct Callback { Callback() { cbindgen_private::sixtyfps_callback_init(&inner); } ~Callback() { cbindgen_private::sixtyfps_callback_drop(&inner); } Callback(const Callback &) = delete; Callback(Callback &&) = delete; Callback &operator=(const Callback &) = delete; template void set_handler(F binding) const { cbindgen_private::sixtyfps_callback_set_handler( &inner, [](void *user_data, const void *arg) { std::apply(*reinterpret_cast(user_data), *reinterpret_cast(arg)); }, new F(std::move(binding)), [](void *user_data) { delete reinterpret_cast(user_data); }); } void emit(const Arg &...arg) const { Tuple tuple{arg...}; cbindgen_private::sixtyfps_callback_emit(&inner, &tuple); } private: using Tuple = std::tuple; cbindgen_private::CallbackOpaque inner; }; }