Skip to content

Commit 5585cce

Browse files
committed
Add another example
1 parent 1c8033f commit 5585cce

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

library/core/src/mem/maybe_uninit.rs

+30
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,36 @@ impl<T> MaybeUninit<T> {
454454
/// // x is initialized now:
455455
/// let s = unsafe { x.assume_init() };
456456
/// ```
457+
///
458+
/// This method can be used to avoid unsafe in some cases. The example below
459+
/// shows a part of an implementation of a fixed sized arena that lends out
460+
/// pinned references.
461+
/// With `write`, we can avoid the need to write through a raw pointer:
462+
///
463+
/// ```rust
464+
/// #![feature(maybe_uninit_extra)]
465+
/// use core::pin::Pin;
466+
/// use core::mem::MaybeUninit;
467+
///
468+
/// struct PinArena<T> {
469+
/// memory: Box<[MaybeUninit<T>]>,
470+
/// len: usize,
471+
/// }
472+
///
473+
/// impl <T> PinArena<T> {
474+
/// pub fn capacity(&self) -> usize {
475+
/// self.memory.len()
476+
/// }
477+
/// pub fn push(&mut self, val: T) -> Pin<&mut T> {
478+
/// if self.len >= self.capacity() {
479+
/// panic!("Attempted to push to a full pin arena!");
480+
/// }
481+
/// let ref_ = self.memory[self.len].write(val);
482+
/// self.len += 1;
483+
/// unsafe { Pin::new_unchecked(ref_) }
484+
/// }
485+
/// }
486+
/// ```
457487
#[stable(feature = "maybe_uninit_write", since = "1.55.0")]
458488
#[rustc_const_unstable(feature = "const_maybe_uninit_write", issue = "63567")]
459489
#[inline(always)]

0 commit comments

Comments
 (0)