1 #![allow(dead_code)]
2 use core::{mem::MaybeUninit, ptr};
3 
4 /// Polyfill for `maybe_uninit_slice` feature's
5 /// `MaybeUninit::slice_assume_init_mut`. Every element of `slice` must have
6 /// been initialized.
7 #[inline(always)]
slice_assume_init_mut<T>(slice: &mut [MaybeUninit<T>]) -> &mut [T]8 pub unsafe fn slice_assume_init_mut<T>(slice: &mut [MaybeUninit<T>]) -> &mut [T] {
9     // SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
10     &mut *(slice as *mut [MaybeUninit<T>] as *mut [T])
11 }
12 
13 #[inline]
uninit_slice_fill_zero(slice: &mut [MaybeUninit<u8>]) -> &mut [u8]14 pub fn uninit_slice_fill_zero(slice: &mut [MaybeUninit<u8>]) -> &mut [u8] {
15     unsafe { ptr::write_bytes(slice.as_mut_ptr(), 0, slice.len()) };
16     unsafe { slice_assume_init_mut(slice) }
17 }
18 
19 #[inline(always)]
slice_as_uninit<T>(slice: &[T]) -> &[MaybeUninit<T>]20 pub fn slice_as_uninit<T>(slice: &[T]) -> &[MaybeUninit<T>] {
21     // SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
22     // There is no risk of writing a `MaybeUninit<T>` into the result since
23     // the result isn't mutable.
24     unsafe { &*(slice as *const [T] as *const [MaybeUninit<T>]) }
25 }
26 
27 /// View an mutable initialized array as potentially-uninitialized.
28 ///
29 /// This is unsafe because it allows assigning uninitialized values into
30 /// `slice`, which would be undefined behavior.
31 #[inline(always)]
slice_as_uninit_mut<T>(slice: &mut [T]) -> &mut [MaybeUninit<T>]32 pub unsafe fn slice_as_uninit_mut<T>(slice: &mut [T]) -> &mut [MaybeUninit<T>] {
33     // SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
34     &mut *(slice as *mut [T] as *mut [MaybeUninit<T>])
35 }
36