use std::mem::MaybeUninit;
pub type SplitInitBuffer<'a, T> = (&'a mut [T], &'a mut MaybeUninitSlice<T>);
pub type MaybeUninitSlice<T> = [MaybeUninit<T>];
pub trait MaybeUninitSliceExt<T>: sealed::Sealed<T> {
fn from_uninit_array_mut<const N: usize>(array: &mut MaybeUninit<[T; N]>) -> &mut Self;
fn from_uninit_array_ref<const N: usize>(array: &MaybeUninit<[T; N]>) -> &Self;
fn from_init_slice(slice: &[T]) -> &Self;
fn from_init_slice_mut(slice: &mut [T]) -> &mut Self
where
T: Copy;
#[inline]
unsafe fn assume_init_ref(&self) -> &[T] {
unsafe { std::slice::from_raw_parts(self.as_slice().as_ptr().cast(), self.as_slice().len()) }
}
#[inline]
unsafe fn assume_init_mut(&mut self) -> &mut [T] {
let len = self.as_slice().len();
unsafe { std::slice::from_raw_parts_mut(self.as_mut_slice().as_mut_ptr().cast(), len) }
}
}
impl<T> MaybeUninitSliceExt<T> for MaybeUninitSlice<T> {
#[inline]
fn from_uninit_array_mut<const N: usize>(array: &mut MaybeUninit<[T; N]>) -> &mut Self {
unsafe { std::slice::from_raw_parts_mut(array.as_mut_ptr().cast::<MaybeUninit<T>>(), N) }
}
#[inline]
fn from_uninit_array_ref<const N: usize>(array: &MaybeUninit<[T; N]>) -> &Self {
unsafe { std::slice::from_raw_parts(array.as_ptr().cast::<MaybeUninit<T>>(), N) }
}
#[inline]
fn from_init_slice(slice: &[T]) -> &Self {
unsafe { std::slice::from_raw_parts(slice.as_ptr().cast::<MaybeUninit<T>>(), slice.len()) }
}
#[inline]
fn from_init_slice_mut(slice: &mut [T]) -> &mut MaybeUninitSlice<T>
where
T: Copy,
{
unsafe { std::slice::from_raw_parts_mut(slice.as_mut_ptr().cast::<MaybeUninit<T>>(), slice.len()) }
}
}
mod sealed {
use super::MaybeUninitSlice;
use std::mem::MaybeUninit;
pub trait Sealed<T> {
fn as_slice(&self) -> &[MaybeUninit<T>];
fn as_mut_slice(&mut self) -> &mut [MaybeUninit<T>];
}
impl<T> Sealed<T> for MaybeUninitSlice<T> {
#[inline]
fn as_slice(&self) -> &[MaybeUninit<T>] {
self
}
#[inline]
fn as_mut_slice(&mut self) -> &mut [MaybeUninit<T>] {
self
}
}
}