Implement write() method for Box<MaybeUninit<T>>
This adds method similar to `MaybeUninit::write` main difference being it returns owned `Box`. This can be used to elide copy from stack safely, however it's not currently tested that the optimization actually occurs. Analogous methods are not provided for `Rc` and `Arc` as those need to handle the possibility of sharing. Some version of them may be added in the future. This was discussed in #63291 which this change extends.
This commit is contained in:
parent
18bb8c61a9
commit
41e21aa1c2
2 changed files with 38 additions and 4 deletions
|
@ -31,11 +31,9 @@ impl<T> IdFunctor for Box<T> {
|
|||
let value = raw.read();
|
||||
// SAFETY: Converts `Box<T>` to `Box<MaybeUninit<T>>` which is the
|
||||
// inverse of `Box::assume_init()` and should be safe.
|
||||
let mut raw: Box<mem::MaybeUninit<T>> = Box::from_raw(raw.cast());
|
||||
let raw: Box<mem::MaybeUninit<T>> = Box::from_raw(raw.cast());
|
||||
// SAFETY: Write the mapped value back into the `Box`.
|
||||
raw.write(f(value)?);
|
||||
// SAFETY: We just initialized `raw`.
|
||||
raw.assume_init()
|
||||
Box::write(raw, f(value)?)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue