use core::mem::{size_of_val, MaybeUninit};
use core::slice;
pub trait AsUninitBytes {
fn as_uninit_bytes(&self) -> &[MaybeUninit<u8>];
fn as_uninit_bytes_mut(&mut self) -> &mut [MaybeUninit<u8>];
}
impl AsUninitBytes for [u8] {
#[inline(always)]
fn as_uninit_bytes(&self) -> &[MaybeUninit<u8>] {
unsafe { slice::from_raw_parts(self.as_ptr() as *const MaybeUninit<u8>, self.len()) }
}
#[inline(always)]
fn as_uninit_bytes_mut(&mut self) -> &mut [MaybeUninit<u8>] {
unsafe { slice::from_raw_parts_mut(self.as_mut_ptr() as *mut MaybeUninit<u8>, self.len()) }
}
}
impl<T> AsUninitBytes for MaybeUninit<T> {
#[inline(always)]
fn as_uninit_bytes(&self) -> &[MaybeUninit<u8>] {
unsafe { slice::from_raw_parts(self.as_ptr() as *const MaybeUninit<u8>, size_of_val(self)) }
}
#[inline(always)]
fn as_uninit_bytes_mut(&mut self) -> &mut [MaybeUninit<u8>] {
unsafe {
slice::from_raw_parts_mut(self.as_mut_ptr() as *mut MaybeUninit<u8>, size_of_val(self))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn as_uninit_bytes() {
let mut xs = [0; 64];
assert_eq!(xs.as_uninit_bytes().len(), 64);
assert_eq!(xs.as_uninit_bytes_mut().len(), 64);
let mut xs = MaybeUninit::<[u64; 8]>::uninit();
assert_eq!(xs.as_uninit_bytes().len(), 64);
assert_eq!(xs.as_uninit_bytes_mut().len(), 64);
}
}