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