use_prelude!();
pub trait MaybeUninitExt {
type T: ?Sized;
fn as_ptr(&self) -> *const Self::T;
fn as_mut_ptr(&mut self) -> *mut Self::T;
unsafe fn assume_init_by_ref(&self) -> &Self::T;
unsafe fn assume_init_by_mut(&mut self) -> &mut Self::T;
#[deprecated = "Use `AsUninit::as_ref_uninit` instead"]
fn from_ref(init_ref: &'_ Self::T) -> &'_ Self;
}
impl<T> MaybeUninitExt for MaybeUninit<T> {
type T = T;
#[inline]
fn as_ptr(&self) -> *const Self::T {
self.as_ptr()
}
#[inline]
fn as_mut_ptr(&mut self) -> *mut Self::T {
self.as_mut_ptr()
}
#[inline]
unsafe fn assume_init_by_ref(self: &'_ Self) -> &'_ Self::T {
unsafe {
&*(self as *const _ as *const Self::T)
}
}
#[inline]
unsafe fn assume_init_by_mut(self: &'_ mut Self) -> &'_ mut Self::T {
unsafe {
&mut *(self as *mut _ as *mut Self::T)
}
}
#[inline]
fn from_ref(some_ref: &'_ Self::T) -> &'_ Self {
unsafe {
mem::transmute(some_ref)
}
}
}
impl<T> MaybeUninitExt for [MaybeUninit<T>] {
type T = [T];
#[inline]
fn as_ptr(&self) -> *const Self::T {
self as *const _ as *const Self::T
}
#[inline]
fn as_mut_ptr(&mut self) -> *mut Self::T {
self as *mut _ as *mut Self::T
}
#[inline]
unsafe fn assume_init_by_ref(self: &'_ Self) -> &'_ Self::T {
unsafe {
let len = self.len();
slice::from_raw_parts(self.as_ptr().cast(), len)
}
}
#[inline]
unsafe fn assume_init_by_mut(self: &'_ mut Self) -> &'_ mut Self::T {
unsafe {
let len = self.len();
slice::from_raw_parts_mut(self.as_mut_ptr().cast(), len)
}
}
#[inline]
fn from_ref(slice: &'_ Self::T) -> &'_ Self {
unsafe {
let len = slice.len();
slice::from_raw_parts(slice.as_ptr().cast(), len)
}
}
}