use core::fmt::Arguments;
use crate::core::trig::TrigManuallyDrop;
pub type AlwaysSafeHookManuallyDrop<T> = crate::beh::safe::SafeManuallyDrop<T, HookFnTrigManuallyDrop>;
pub type AutoSafeHookManuallyDrop<T> = crate::beh::auto::AutoSafeManuallyDrop<T, HookFnTrigManuallyDrop>;
pub type HookFunction = fn(Arguments) -> trig_manuallydrop_returntype!();
pub enum HookFnTrigManuallyDrop {}
static mut HOOK: HookFunction = |args| {
panic!("{}", args);
};
#[inline(always)]
pub unsafe fn set_hook(function: HookFunction) {
HOOK = function;
}
#[inline(always)]
pub fn take_hook() -> HookFunction {
unsafe { HOOK }
}
#[inline(always)]
pub fn run_hook<'a>(args: Arguments<'a>) -> trig_manuallydrop_returntype!() {
let trig_fn = take_hook();
trig_fn(args)
}
impl TrigManuallyDrop for HookFnTrigManuallyDrop {
#[inline(always)]
fn trig_next_invalid_beh<'a>(a: Arguments<'a>) -> trig_manuallydrop_returntype!() {
crate::core::trig::hook::run_hook(a);
}
}
impl<F> TrigManuallyDrop for F where F: Default + FnOnce(Arguments<'_>) {
#[inline(always)]
fn trig_next_invalid_beh<'a>(a: Arguments<'a>) -> trig_manuallydrop_returntype!() {
let function: F = Default::default();
function(a); panic!("Be sure to read the documentation an anonymous function should abort a thread, but it's not possible to do this in safe rust at the moment.");
}
}
impl AutoSafeHookManuallyDrop<()> {
#[inline(always)]
pub unsafe fn set_hook(function: HookFunction) {
crate::core::trig::hook::set_hook(function)
}
#[inline(always)]
pub fn take_hook() -> HookFunction {
crate::core::trig::hook::take_hook()
}
#[inline(always)]
pub fn run_hook<'a>(args: Arguments<'a>) -> trig_manuallydrop_returntype!() {
crate::core::trig::hook::run_hook(args)
}
}