use core::mem::MaybeUninit;
use super::RefMut;
use crate::zeroed::ZeroValid;
pub unsafe trait BorrowUninit<Borrowed> {
fn borrow_uninit(&self) -> &MaybeUninit<Borrowed>;
unsafe fn assume_init_ref(&self) -> &Borrowed {
&*(self.borrow_uninit() as *const MaybeUninit<Borrowed> as *const Borrowed)
}
}
pub unsafe trait BorrowUninitMut<Borrowed>: BorrowUninit<Borrowed> {
fn borrow_uninit_mut(&mut self) -> RefMut<'_, Borrowed>;
unsafe fn assume_init_mut(&mut self) -> &mut Borrowed {
self.borrow_uninit_mut().into_assume_init()
}
fn init(&mut self, item: Borrowed) -> &mut Borrowed {
self.borrow_uninit_mut().write(item)
}
fn default_if_needed(&mut self) -> &mut Borrowed where Borrowed: Default {
self.init(Default::default())
}
fn zeroed_if_needed(&mut self) -> &mut Borrowed where Borrowed: ZeroValid {
self.borrow_uninit_mut().into_zeroed()
}
}
unsafe impl<T> BorrowUninit<T> for T {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
unsafe {
&*(self as *const T as *const MaybeUninit<T>)
}
}
}
unsafe impl<T> BorrowUninitMut<T> for T {
fn borrow_uninit_mut(&mut self) -> RefMut<'_, T> {
self.into()
}
fn default_if_needed(&mut self) -> &mut T where T: Default {
self
}
fn zeroed_if_needed(&mut self) -> &mut T where T: ZeroValid {
self
}
}
unsafe impl<T> BorrowUninit<T> for MaybeUninit<T> {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
self
}
}
unsafe impl<T> BorrowUninitMut<T> for MaybeUninit<T> {
fn borrow_uninit_mut(&mut self) -> RefMut<'_, T> {
self.into()
}
}
unsafe impl<T> BorrowUninit<T> for &T {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
(**self).borrow_uninit()
}
}
unsafe impl<T> BorrowUninit<T> for &mut T {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
(**self).borrow_uninit()
}
}
unsafe impl<T> BorrowUninitMut<T> for &mut T {
fn borrow_uninit_mut(&mut self) -> RefMut<'_, T> {
(*self).into()
}
fn default_if_needed(&mut self) -> &mut T where T: Default {
*self
}
fn zeroed_if_needed(&mut self) -> &mut T where T: ZeroValid {
*self
}
}
unsafe impl<T> BorrowUninit<T> for &MaybeUninit<T> {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
(**self).borrow_uninit()
}
}
unsafe impl<T> BorrowUninit<T> for &mut MaybeUninit<T> {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
(**self).borrow_uninit()
}
}
unsafe impl<T> BorrowUninitMut<T> for &mut MaybeUninit<T> {
fn borrow_uninit_mut(&mut self) -> RefMut<'_, T> {
(*self).borrow_uninit_mut()
}
}
unsafe impl<T> BorrowUninit<T> for core::cell::Ref<'_, T> {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
(**self).borrow_uninit()
}
}
unsafe impl<T> BorrowUninit<T> for core::cell::RefMut<'_, T> {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
(**self).borrow_uninit()
}
}
unsafe impl<T> BorrowUninitMut<T> for core::cell::RefMut<'_, T> {
fn borrow_uninit_mut(&mut self) -> RefMut<'_, T> {
(**self).borrow_uninit_mut()
}
fn default_if_needed(&mut self) -> &mut T where T: Default {
&mut **self
}
fn zeroed_if_needed(&mut self) -> &mut T where T: ZeroValid {
&mut **self
}
}
unsafe impl<T> BorrowUninit<T> for core::cell::Ref<'_, MaybeUninit<T>> {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
(**self).borrow_uninit()
}
}
unsafe impl<T> BorrowUninit<T> for core::cell::RefMut<'_, MaybeUninit<T>> {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
(**self).borrow_uninit()
}
}
unsafe impl<T> BorrowUninitMut<T> for core::cell::RefMut<'_, MaybeUninit<T>> {
fn borrow_uninit_mut(&mut self) -> RefMut<'_, T> {
(**self).borrow_uninit_mut()
}
}