use core::mem::{align_of, size_of, MaybeUninit};
const TANY_STORAGE_SIZE: usize = size_of::<[usize; 3]>();
const TANY_STORAGE_ALIGN: usize = 8;
#[repr(C, align(8))] #[derive(Clone, Copy)]
pub(crate) struct InlineStorage {
pub storage: MaybeUninit<[u8; TANY_STORAGE_SIZE]>,
}
impl InlineStorage {
pub fn new() -> Self {
InlineStorage {
storage: MaybeUninit::uninit(),
}
}
pub const fn fits<T>() -> bool {
size_of::<T>() <= TANY_STORAGE_SIZE && align_of::<T>() <= TANY_STORAGE_ALIGN
}
pub fn as_ref<T>(&self) -> &MaybeUninit<T> {
assert!(size_of::<T>() <= TANY_STORAGE_SIZE);
assert!(align_of::<T>() <= TANY_STORAGE_ALIGN);
unsafe { &*self.storage.as_ptr().cast() }
}
pub fn as_mut<T>(&mut self) -> &mut MaybeUninit<T> {
assert!(size_of::<T>() <= TANY_STORAGE_SIZE);
assert!(align_of::<T>() <= TANY_STORAGE_ALIGN);
unsafe { &mut *self.storage.as_mut_ptr().cast() }
}
}