summaryrefslogtreecommitdiff
path: root/src/util.rs
blob: 6b7180a666f1d7998b449df504a7b359dd3f08b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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>(),
            )
        }
    }
}