tnn/extension/
opaque_fn.rs

1use super::{CallContext, CallOutput};
2
3pub struct OpaqueFunctionCall([usize; 2]);
4
5impl OpaqueFunctionCall {
6	pub fn from<Argument, Return>(handler: &'static dyn Fn(CallContext<Argument>) -> CallOutput<Return>) -> Self {
7		assert_eq!(
8			std::mem::size_of::<&dyn Fn(CallContext<Argument>) -> CallOutput<Return>>(),
9			2 * std::mem::size_of::<usize>()
10		);
11		Self(unsafe { std::mem::transmute(handler) })
12	}
13	pub unsafe fn invoke<Argument, Return>(&self, context: CallContext<Argument>) -> CallOutput<Return> {
14		let handler: &dyn Fn(CallContext<Argument>) -> CallOutput<Return> = std::mem::transmute(self.0);
15		handler(context)
16	}
17}