heveanly 0.1.0

C is the heavenly option
Documentation
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);
   }
}