Trait uninit::extension_traits::AsOut
source · [−]Expand description
Extension trait to convert a &mut _
into a &out _
by calling
.as_out()
on it.
By autoref, this means that you can even just extract a &out T
reference
out of a mut
element simply by calling .as_out()
on it.
There is, however, one restriction: to be able to call .as_out()
on
something, it needs to be either Copy
, or a value wrapped in a
MaybeUninit
/ a ManuallyDrop
.
This is by design. Indeed, Out
references do not call the destructor
of the overwritten element (since it may not be initialized).
This could cause memory leaks when there is an initialized element with
drop glue.
To solve this limitation, one must explicitly call
.manually_drop_mut()
to automagically transmute the &mut _
reference into a
&mut ManuallyDrop<_>
.
Examples
use ::uninit::prelude::*;
let mut x = 0;
x.as_out().write(42);
let mut y = ::core::mem::MaybeUninit::uninit();
y.as_out().write(42);
let y = unsafe { y.assume_init() };
assert_eq!(x, y);
Required Methods
Implementations on Foreign Types
sourceimpl<T> AsOut<[T]> for [MaybeUninit<T>]
impl<T> AsOut<[T]> for [MaybeUninit<T>]
fn as_out<'out>(self: &'out mut [MaybeUninit<T>]) -> Out<'out, [T]>
sourceimpl<T> AsOut<T> for ManuallyDrop<T>
impl<T> AsOut<T> for ManuallyDrop<T>
fn as_out<'out>(self: &'out mut ManuallyDrop<T>) -> Out<'out, T>
sourceimpl<T> AsOut<[T]> for [ManuallyDrop<T>]
impl<T> AsOut<[T]> for [ManuallyDrop<T>]
fn as_out<'out>(self: &'out mut [ManuallyDrop<T>]) -> Out<'out, [T]>
sourceimpl<T, const N: usize> AsOut<[T]> for [MaybeUninit<T>; N]
Available on crate feature const_generics
only.
impl<T, const N: usize> AsOut<[T]> for [MaybeUninit<T>; N]
Available on crate feature
const_generics
only.sourceimpl<T, const N: usize> AsOut<[T]> for [T; N] where
T: Copy,
Available on crate feature const_generics
only.
impl<T, const N: usize> AsOut<[T]> for [T; N] where
T: Copy,
Available on crate feature
const_generics
only.