summaryrefslogtreecommitdiff
path: root/src/util.rs
blob: 70e114b1fe2c070d1337f8e0c0411ade177569c3 (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
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"
        );

        let new_len = self.len() / size_of::<Item>();

        if new_len == 0 {
            return &[];
        }

        unsafe { std::slice::from_raw_parts(self.as_ptr().cast::<Item>(), new_len) }
    }
}