33class NativeClosure<Ret(Args...)> :
private ClosureBase {
34 static inline Ret closureImpl(Args... args) {
35 auto& self = *
static_cast<NativeClosure*
>(
reinterpret_cast<PackedSelf*
>(getClosureData())->self);
36 return (self.func)(self.data, std::forward<Args>(args)...);
40 using origin = Ret(uintptr_t, Args...);
41 using closure = Ret(Args...);
46 [[nodiscard]] NativeClosure(origin* func, uintptr_t data) : ClosureBase(closureImpl), func(func), data(data) {}
48 [[nodiscard]] closure* get()
const {
return reinterpret_cast<closure*
>(storage.executable()); }
58class FunctionalClosure<Ret(Args...)> :
private ClosureBase {
59 static inline Ret closureImpl(Args... args) {
60 auto& self = *
static_cast<FunctionalClosure*
>(
reinterpret_cast<PackedSelf*
>(getClosureData())->self);
61 return (self.func)(std::forward<Args>(args)...);
65 using closure = Ret(Args...);
67 std::function<closure> func;
69 [[nodiscard]] FunctionalClosure(std::function<closure> func) : ClosureBase(closureImpl), func(std::move(func)) {}
71 [[nodiscard]] closure* get()
const {
return reinterpret_cast<closure*
>(storage.executable()); }