[][src]Trait uninit::extension_traits::AsOut

pub trait AsOut<Pointee: ?Sized> {
    fn as_out<'out>(&'out mut self) -> Out<'out, Pointee>;
}

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

fn as_out<'out>(&'out mut self) -> Out<'out, Pointee>

Loading content...

Implementations on Foreign Types

impl<T> AsOut<[T]> for [MaybeUninit<T>][src]

impl<T> AsOut<[T]> for [T] where
    T: Copy
[src]

impl<T> AsOut<T> for ManuallyDrop<T>[src]

impl<T> AsOut<[T]> for [ManuallyDrop<T>][src]

impl<T, const N: usize> AsOut<[T]> for [MaybeUninit<T>; N][src]

impl<T, const N: usize> AsOut<[T]> for [T; N] where
    T: Copy
[src]

Loading content...

Implementors

impl<T> AsOut<T> for MaybeUninit<T>[src]

impl<T> AsOut<T> for T where
    T: Copy
[src]

Loading content...