1//! Modified implementations of unstable libcore functions.
23#![allow(dead_code)]
45use core::mem::{self, MaybeUninit};
67/// [`MaybeUninit::slice_assume_init_mut`]
8#[inline(always)]
9pub(crate) unsafe fn slice_assume_init_mut<T>(slice: &mut [MaybeUninit<T>]) -> &mut [T] {
10// SAFETY: similar to safety notes for `slice_get_ref`, but we have a
11 // mutable reference which is also guaranteed to be valid for writes.
12unsafe { &mut *(slice as *mut [MaybeUninit<T>] as *mut [T]) }
13}
1415/// [`MaybeUninit::uninit_array`]
16#[inline]
17pub(crate) const fn uninit_array<T, const N: usize>() -> [MaybeUninit<T>; N] {
18// SAFETY: An uninitialized `[MaybeUninit<_>; N]` is valid.
19unsafe { MaybeUninit::<[MaybeUninit<T>; N]>::uninit().assume_init() }
20}
2122/// [`MaybeUninit::array_assume_init`]
23#[inline]
24pub(crate) unsafe fn array_assume_init<T, const N: usize>(array: [MaybeUninit<T>; N]) -> [T; N] {
25// SAFETY:
26 // * The caller guarantees that all elements of the array are initialized
27 // * `MaybeUninit<T>` and T are guaranteed to have the same layout
28 // * `MaybeUninit` does not drop, so there are no double-frees
29 // And thus the conversion is safe
30unsafe { transpose(array).assume_init() }
31}
3233/// [`MaybeUninit::transpose`]
34#[inline(always)]
35unsafe fn transpose<T, const N: usize>(array: [MaybeUninit<T>; N]) -> MaybeUninit<[T; N]> {
36 mem::transmute_copy::<[MaybeUninit<T>; N], MaybeUninit<[T; N]>>(&mem::ManuallyDrop::new(&array))
37}