#![allow(clippy::crosspointer_transmute)]
use std::ffi::c_void;
use std::marker::PhantomData;
pub struct Symbol<'a, T> {
ptr: *const T,
useless: PhantomData<&'a ()>,
}
impl<'a, T> Symbol<'a, T> {
#[inline(always)]
pub unsafe fn from_raw(val: *const c_void) -> Self {
Self {
ptr: val as *const T,
useless: PhantomData,
}
}
#[inline(always)]
pub fn as_ptr(&self) -> *const T {
self.ptr
}
#[inline(always)]
pub unsafe fn as_static(&self) -> Symbol<'static, T> {
Symbol {
ptr: self.ptr,
useless: PhantomData,
}
}
}
impl<'a, R> Symbol<'a, extern "Rust" fn() -> R> {
pub fn call(&self) -> R {
let f: extern "Rust" fn() -> R = unsafe { std::mem::transmute(self.ptr) };
f()
}
}
impl<'a, T, R> Symbol<'a, extern "Rust" fn(T) -> R> {
pub fn call(&self, val: T) -> R {
let f: extern "Rust" fn(T) -> R = unsafe { std::mem::transmute(self.ptr) };
f(val)
}
}
impl<'a, T, R> Symbol<'a, extern "C" fn(T) -> R> {
pub fn call(&self, val: T) -> R {
let f: extern "C" fn(T) -> R = unsafe { std::mem::transmute(self.ptr) };
f(val)
}
}
impl<'a, T, T1, R> Symbol<'a, extern "C" fn(T, T1) -> R> {
pub fn call(&self, val: T, val1: T1) -> R {
let f: extern "C" fn(T, T1) -> R = unsafe { std::mem::transmute(self.ptr) };
f(val, val1)
}
}
impl<'a, T, T1, T2, R> Symbol<'a, extern "C" fn(T, T1, T2) -> R> {
pub fn call(&self, val: T, val1: T1, val2: T2) -> R {
let f: extern "C" fn(T, T1, T2) -> R = unsafe { std::mem::transmute(self.ptr) };
f(val, val1, val2)
}
}
impl<'a, R> Symbol<'a, extern "C" fn() -> R> {
pub fn call(&self) -> R {
let f: extern "C" fn() -> R = unsafe { std::mem::transmute(self.ptr) };
f()
}
}