1#![allow(dead_code)]
2use 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)]
8pub 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]
14pub 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)]
20pub 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)]
32pub 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