Pin<&mut MaybeUninit<T>> into Pin<&mut T>

82 Views Asked by At

How do I safely get Pin<&mut T> from Pin<&mut MaybeUninit<T>>, assuming MaybeUninit<T> is initialized?

1

There are 1 best solutions below

0
kmdreko On BEST ANSWER

It should be safe via Pin::map_unchecked_mut:

let pin_uninit_t: Pin<&mut MaybeUninit<T>> = ...;
let pin_t: Pin<&mut T> = unsafe { pin_uninit_t.map_unchecked_mut(|m| m.assume_init_mut()) };

The function is unsafe because you are given unprotected mutable access to a value you must not move, but we are not moving the value (assume_init_mut is a simple reference cast) so it is safe assuming the MaybeUninit<T> is initialized.