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>(),
            )
        }
    }
}