#[cfg(feature = "alloc")] use alloc::{boxed::Box, vec::Vec}; use core::{ mem::{self, MaybeUninit}, ptr, }; // TODO: Remove on `maybe_uninit_uninit_array` stabilization. pub fn uninit_array() -> [MaybeUninit; N] { unsafe { MaybeUninit::<[MaybeUninit; N]>::uninit().assume_init() } } // TODO: Remove on `maybe_uninit_slice` stabilization. pub unsafe fn slice_as_uninit_mut(slice: &mut [T]) -> &mut [MaybeUninit] { unsafe { &mut *(slice as *mut [T] as *mut [MaybeUninit]) } } // TODO: Remove on `maybe_uninit_slice` stabilization. pub unsafe fn slice_assume_init_ref(slice: &[MaybeUninit]) -> &[T] { unsafe { &*(slice as *const [MaybeUninit] as *const [T]) } } // TODO: Remove on `maybe_uninit_slice` stabilization. pub unsafe fn slice_assume_init_mut(slice: &mut [MaybeUninit]) -> &mut [T] { unsafe { &mut *(slice as *mut [MaybeUninit] as *mut [T]) } } // TODO: Remove on `maybe_uninit_write_slice` stabilization. pub fn write_slice<'a, T: Copy>(dst: &'a mut [MaybeUninit], src: &[T]) -> &'a mut [T] { let uninit_src: &[MaybeUninit] = unsafe { mem::transmute(src) }; dst.copy_from_slice(uninit_src); unsafe { slice_assume_init_mut(dst) } } pub fn move_uninit_slice(dst: &mut [MaybeUninit], src: &[MaybeUninit]) { assert_eq!(dst.len(), src.len()); for i in 0..dst.len() { unsafe { *dst.get_unchecked_mut(i) = ptr::read(src.get_unchecked(i) as *const _) }; } } pub fn array_to_uninit(value: [T; N]) -> [MaybeUninit; N] { let value = mem::ManuallyDrop::new(value); let ptr = &value as *const _ as *const [MaybeUninit; N]; unsafe { ptr.read() } } #[cfg(feature = "alloc")] pub fn vec_to_uninit(value: Vec) -> Vec> { let value = mem::ManuallyDrop::new(value); let ptr = &value as *const _ as *const Vec>; unsafe { ptr.read() } } #[cfg(feature = "alloc")] pub fn boxed_slice_to_uninit(value: Box<[T]>) -> Box<[MaybeUninit]> { let value = mem::ManuallyDrop::new(value); let ptr = &value as *const _ as *const Box<[MaybeUninit]>; unsafe { ptr.read() } }