#![deny(missing_docs)]
#![no_std]
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "std")]
extern crate std;
pub mod deref_markers;
mod borrow;
pub mod zeroed;
pub mod slice;
#[cfg(feature = "alloc")]
pub mod boxed;
pub mod cast;
use core::mem::MaybeUninit;
use core::ptr::NonNull;
pub use borrow::{BorrowUninit, BorrowUninitMut};
pub struct RefMut<'a, T>(&'a mut MaybeUninit<T>);
impl<'a, T> RefMut<'a, T> {
pub fn write(self, value: T) -> &'a mut T {
unsafe {
*self.0 = MaybeUninit::new(value);
self.into_assume_init()
}
}
pub fn write_mut(&mut self, value: T) -> &mut T {
unsafe {
*self.0 = MaybeUninit::new(value);
self.assume_init_mut()
}
}
pub unsafe fn into_assume_init(self) -> &'a mut T {
&mut *(self.0 as *mut MaybeUninit<T> as *mut T)
}
pub fn as_non_null(&mut self) -> NonNull<T> {
<NonNull<MaybeUninit<T>>>::from(&mut *self.0).cast()
}
pub fn as_mut_ptr(&mut self) -> *mut T {
self.0 as *mut MaybeUninit<T> as *mut T
}
pub fn write_zeroes(&mut self) -> &mut T where T: zeroed::ZeroValid {
use crate::zeroed::ZeroValid;
unsafe {
self.0.write_zeroes();
self.0.assume_init_mut()
}
}
pub fn into_zeroed(self) -> &'a mut T where T: zeroed::ZeroValid {
use crate::zeroed::ZeroValid;
unsafe {
self.0.write_zeroes();
self.0.assume_init_mut()
}
}
}
impl<'a, T> From<&'a mut T> for RefMut<'a, T> {
fn from(value: &'a mut T) -> Self {
unsafe {
RefMut(&mut *(value as *mut T as *mut MaybeUninit<T>))
}
}
}
impl<'a, T> From<&'a mut MaybeUninit<T>> for RefMut<'a, T> {
fn from(value: &'a mut MaybeUninit<T>) -> Self {
RefMut(value)
}
}
unsafe impl<'a, T> BorrowUninit<T> for RefMut<'a, T> {
fn borrow_uninit(&self) -> &MaybeUninit<T> {
self.0
}
}
unsafe impl<'a, T> BorrowUninitMut<T> for RefMut<'a, T> {
fn borrow_uninit_mut(&mut self) -> RefMut<'_, T> {
self.0.into()
}
}