#[allow(unused_macros)]
macro_rules! unsafe_runtime_dispatch {
(
$fn:ident,
$returnty:ty,
$input:ident,
$output:ident,
$is_feature_detected:ident,
$(($feature_name:tt, $feature_module:ident)),+,
$fallback_module:ident,
) => {{
#[cfg(feature = "std")]
{
use core::sync::atomic::{AtomicPtr, Ordering};
type FnType = unsafe fn(&[u8], &mut [MaybeUninit<u8>]) -> $returnty;
static FN_PTR: AtomicPtr<()> = AtomicPtr::new(init as *mut ());
unsafe fn init(i: &[u8], o: &mut [MaybeUninit<u8>]) -> $returnty {
let f = $(if std::$is_feature_detected!($feature_name) {
$feature_module::$fn as FnType
} else)+ {
$fallback_module::$fn as FnType
};
FN_PTR.store(f as *mut (), Ordering::Relaxed);
unsafe { f(i, o) }
}
let f = FN_PTR.load(Ordering::Relaxed);
unsafe { core::mem::transmute::<*mut (), FnType>(f)($input, $output) }
}
#[cfg(not(feature = "std"))]
unsafe {
$fallback_module::$fn($input, $output)
}
}}
}
#[allow(unused_imports)]
pub(crate) use unsafe_runtime_dispatch;