pub struct OutParam;
impl OutParam {
#[inline]
pub unsafe fn call1<T>(f: impl FnOnce(isize)) -> T {
let mut val = std::mem::MaybeUninit::<T>::uninit();
f(val.as_mut_ptr() as isize);
unsafe { val.assume_init() }
}
#[inline]
pub unsafe fn call2<A, B>(f: impl FnOnce(isize, isize)) -> (A, B) {
let mut a = std::mem::MaybeUninit::<A>::uninit();
let mut b = std::mem::MaybeUninit::<B>::uninit();
f(a.as_mut_ptr() as isize, b.as_mut_ptr() as isize);
unsafe { (a.assume_init(), b.assume_init()) }
}
#[inline]
pub unsafe fn call3<A, B, C>(f: impl FnOnce(isize, isize, isize)) -> (A, B, C) {
let mut a = std::mem::MaybeUninit::<A>::uninit();
let mut b = std::mem::MaybeUninit::<B>::uninit();
let mut c = std::mem::MaybeUninit::<C>::uninit();
f(
a.as_mut_ptr() as isize,
b.as_mut_ptr() as isize,
c.as_mut_ptr() as isize,
);
unsafe { (a.assume_init(), b.assume_init(), c.assume_init()) }
}
}