use core::marker::PhantomData;
use core::mem::{ManuallyDrop, MaybeUninit};
pub struct Erased<const N: usize> {
bytes: MaybeUninit<[u8; N]>,
_marker: PhantomData<*const ()>,
}
impl<const N: usize> Erased<N> {
pub const fn new<T>(value: T) -> Self {
const {
assert!(core::mem::size_of::<T>() <= N);
}
let value = ManuallyDrop::new(value);
#[repr(C)]
union Transmute<T, const N: usize> {
value: ManuallyDrop<T>,
bytes: MaybeUninit<[u8; N]>,
}
Self {
bytes: unsafe { Transmute { value }.bytes },
_marker: PhantomData,
}
}
pub const unsafe fn into_inner<T>(self) -> T {
const {
assert!(core::mem::size_of::<T>() <= N);
}
#[repr(C)]
union Transmute<T, const N: usize> {
bytes: MaybeUninit<[u8; N]>,
value: ManuallyDrop<T>,
}
ManuallyDrop::into_inner(unsafe { Transmute { bytes: self.bytes }.value })
}
}