| 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)] |
| 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 ] |
| 14 | pub fn uninit_slice_fill_zero(slice: &mut [MaybeUninit<u8>]) -> &mut [u8] { |
| 15 | unsafe { ptr::write_bytes(dst:slice.as_mut_ptr(), val:0, count:slice.len()) }; |
| 16 | unsafe { slice_assume_init_mut(slice) } |
| 17 | } |
| 18 | |
| 19 | #[inline (always)] |
| 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)] |
| 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 | |