use_prelude!();
use crate::extension_traits::MaybeUninitExt;
use core::mem::MaybeUninit;
pub unsafe trait AsMaybeUninit {
type Uninit: ?Sized + MaybeUninitExt<T = Self>;
type SizedPart: Sized;
fn as_ref_uninit(&self) -> &Self::Uninit;
unsafe fn as_mut_uninit(&mut self) -> &mut Self::Uninit;
unsafe fn raw_as_uninit<'a>(raw: *const Self) -> &'a Self::Uninit;
unsafe fn raw_mut_as_uninit<'a>(raw: *mut Self) -> &'a mut Self::Uninit;
}
unsafe impl<T> AsMaybeUninit for T {
type Uninit = MaybeUninit<T>;
type SizedPart = T;
#[inline]
fn as_ref_uninit(&self) -> &Self::Uninit {
unsafe { &*(self as *const T).cast() }
}
#[inline]
unsafe fn as_mut_uninit(&mut self) -> &mut Self::Uninit {
unsafe { &mut *(self as *mut T).cast() }
}
#[inline]
unsafe fn raw_as_uninit<'a>(raw: *const Self) -> &'a Self::Uninit {
unsafe { &*(raw as *const MaybeUninit<T>) }
}
#[inline]
unsafe fn raw_mut_as_uninit<'a>(raw: *mut Self) -> &'a mut Self::Uninit {
unsafe { &mut *(raw as *mut MaybeUninit<T>) }
}
}
unsafe impl<T> AsMaybeUninit for [T] {
type Uninit = [MaybeUninit<T>];
type SizedPart = T;
#[inline]
fn as_ref_uninit(&self) -> &Self::Uninit {
unsafe { &*(self as *const [T] as *const [MaybeUninit<T>]) }
}
#[inline]
unsafe fn as_mut_uninit(&mut self) -> &mut Self::Uninit {
unsafe { &mut *(self as *mut [T] as *mut [MaybeUninit<T>]) }
}
#[inline]
unsafe fn raw_as_uninit<'a>(raw: *const Self) -> &'a Self::Uninit {
unsafe { &*(raw as *const [MaybeUninit<T>]) }
}
#[inline]
unsafe fn raw_mut_as_uninit<'a>(raw: *mut Self) -> &'a mut Self::Uninit {
unsafe { &mut *(raw as *mut [MaybeUninit<T>]) }
}
}