1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use core::mem::MaybeUninit;

/// A place containing a single value.
pub trait SinglePlace<T> {
    /// # Safety
    /// `f` must initialize `T` correctly.
    unsafe fn emplace_with(f: impl FnOnce(&mut MaybeUninit<T>)) -> Self;

    /// # Safety
    /// `f` must initialize `T` correctly.
    unsafe fn emplace_zeroed_with(f: impl FnOnce(&mut MaybeUninit<T>)) -> Self;
}

/// A place containing multiple continuous values.
pub trait SlicePlace<T> {
    /// # Safety
    /// `f` must initialize every `T` correctly.
    unsafe fn emplace_with(len: usize, f: impl FnOnce(&mut [MaybeUninit<T>])) -> Self;

    /// # Safety
    /// `f` must initialize every `T` correctly.
    unsafe fn emplace_zeroed_with(len: usize, f: impl FnOnce(&mut [MaybeUninit<T>])) -> Self;
}