use super::{AtomicFnPtr, ErasedFnPtr, Func};
use core::marker::PhantomData;
#[repr(transparent)]
pub struct FuncStorage<F: Func> {
_pd: PhantomData<F>,
inner: AtomicFnPtr,
}
impl<F: Func> FuncStorage<F> {
#[must_use]
#[expect(clippy::new_without_default, reason = "default would be unused")]
pub const fn new() -> Self {
let inner = AtomicFnPtr::new(ErasedFnPtr::erase::<F>(F::actual));
Self { _pd: PhantomData, inner }
}
#[inline]
#[must_use]
pub fn get(&'static self) -> F::Ptr {
let erased = self.inner.load_relaxed();
unsafe { erased.typed::<F::Ptr>() }
}
pub fn update(&'static self) {
let erased = ErasedFnPtr::erase::<F>(F::actual);
unsafe { self.inner.store_relaxed(erased) };
log::debug!("Updated {:?} to {:?}", F::NAME, erased);
}
}