use std::mem::MaybeUninit; pub trait MaybeUninitByteSlice { unsafe fn cast<Item: 'static>(&self) -> &[Item]; } impl MaybeUninitByteSlice for &[MaybeUninit<u8>] { unsafe fn cast<Item: 'static>(&self) -> &[Item] { assert_eq!(self.len() % size_of::<Item>(), 0, "Invalid item size"); assert_eq!( self.as_ptr().addr() % align_of::<Item>(), 0, "Invalid item alignment" ); if size_of::<Item>() == 0 { return &[]; } unsafe { std::slice::from_raw_parts( self.as_ptr().cast::<Item>(), self.len() / size_of::<Item>(), ) } } }