mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
Add {Box,Rc,Arc}::new_zeroed_slice
This commit is contained in:
parent
361f668c49
commit
ab204c5b20
@ -273,6 +273,29 @@ impl<T> Box<[T]> {
|
|||||||
pub fn new_uninit_slice(len: usize) -> Box<[mem::MaybeUninit<T>]> {
|
pub fn new_uninit_slice(len: usize) -> Box<[mem::MaybeUninit<T>]> {
|
||||||
unsafe { RawVec::with_capacity(len).into_box(len) }
|
unsafe { RawVec::with_capacity(len).into_box(len) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Constructs a new boxed slice with uninitialized contents, with the memory
|
||||||
|
/// being filled with `0` bytes.
|
||||||
|
///
|
||||||
|
/// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
|
||||||
|
/// of this method.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(new_uninit)]
|
||||||
|
///
|
||||||
|
/// let values = Box::<[u32]>::new_zeroed_slice(3);
|
||||||
|
/// let values = unsafe { values.assume_init() };
|
||||||
|
///
|
||||||
|
/// assert_eq!(*values, [0, 0, 0])
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// [zeroed]: ../../std/mem/union.MaybeUninit.html#method.zeroed
|
||||||
|
#[unstable(feature = "new_uninit", issue = "63291")]
|
||||||
|
pub fn new_zeroed_slice(len: usize) -> Box<[mem::MaybeUninit<T>]> {
|
||||||
|
unsafe { RawVec::with_capacity_zeroed(len).into_box(len) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Box<mem::MaybeUninit<T>> {
|
impl<T> Box<mem::MaybeUninit<T>> {
|
||||||
|
@ -469,6 +469,40 @@ impl<T> Rc<[T]> {
|
|||||||
pub fn new_uninit_slice(len: usize) -> Rc<[mem::MaybeUninit<T>]> {
|
pub fn new_uninit_slice(len: usize) -> Rc<[mem::MaybeUninit<T>]> {
|
||||||
unsafe { Rc::from_ptr(Rc::allocate_for_slice(len)) }
|
unsafe { Rc::from_ptr(Rc::allocate_for_slice(len)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Constructs a new reference-counted slice with uninitialized contents, with the memory being
|
||||||
|
/// filled with `0` bytes.
|
||||||
|
///
|
||||||
|
/// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and
|
||||||
|
/// incorrect usage of this method.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(new_uninit)]
|
||||||
|
///
|
||||||
|
/// use std::rc::Rc;
|
||||||
|
///
|
||||||
|
/// let values = Rc::<[u32]>::new_zeroed_slice(3);
|
||||||
|
/// let values = unsafe { values.assume_init() };
|
||||||
|
///
|
||||||
|
/// assert_eq!(*values, [0, 0, 0])
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// [zeroed]: ../../std/mem/union.MaybeUninit.html#method.zeroed
|
||||||
|
#[unstable(feature = "new_uninit", issue = "63291")]
|
||||||
|
pub fn new_zeroed_slice(len: usize) -> Rc<[mem::MaybeUninit<T>]> {
|
||||||
|
unsafe {
|
||||||
|
Rc::from_ptr(Rc::allocate_for_layout(
|
||||||
|
Layout::array::<T>(len).unwrap(),
|
||||||
|
|layout| Global.alloc_zeroed(layout),
|
||||||
|
|mem| {
|
||||||
|
ptr::slice_from_raw_parts_mut(mem as *mut T, len)
|
||||||
|
as *mut RcBox<[mem::MaybeUninit<T>]>
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Rc<mem::MaybeUninit<T>> {
|
impl<T> Rc<mem::MaybeUninit<T>> {
|
||||||
|
@ -468,6 +468,40 @@ impl<T> Arc<[T]> {
|
|||||||
pub fn new_uninit_slice(len: usize) -> Arc<[mem::MaybeUninit<T>]> {
|
pub fn new_uninit_slice(len: usize) -> Arc<[mem::MaybeUninit<T>]> {
|
||||||
unsafe { Arc::from_ptr(Arc::allocate_for_slice(len)) }
|
unsafe { Arc::from_ptr(Arc::allocate_for_slice(len)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Constructs a new atomically reference-counted slice with uninitialized contents, with the memory being
|
||||||
|
/// filled with `0` bytes.
|
||||||
|
///
|
||||||
|
/// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and
|
||||||
|
/// incorrect usage of this method.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(new_uninit)]
|
||||||
|
///
|
||||||
|
/// use std::sync::Arc;
|
||||||
|
///
|
||||||
|
/// let values = Arc::<[u32]>::new_zeroed_slice(3);
|
||||||
|
/// let values = unsafe { values.assume_init() };
|
||||||
|
///
|
||||||
|
/// assert_eq!(*values, [0, 0, 0])
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// [zeroed]: ../../std/mem/union.MaybeUninit.html#method.zeroed
|
||||||
|
#[unstable(feature = "new_uninit", issue = "63291")]
|
||||||
|
pub fn new_zeroed_slice(len: usize) -> Arc<[mem::MaybeUninit<T>]> {
|
||||||
|
unsafe {
|
||||||
|
Arc::from_ptr(Arc::allocate_for_layout(
|
||||||
|
Layout::array::<T>(len).unwrap(),
|
||||||
|
|layout| Global.alloc_zeroed(layout),
|
||||||
|
|mem| {
|
||||||
|
ptr::slice_from_raw_parts_mut(mem as *mut T, len)
|
||||||
|
as *mut ArcInner<[mem::MaybeUninit<T>]>
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Arc<mem::MaybeUninit<T>> {
|
impl<T> Arc<mem::MaybeUninit<T>> {
|
||||||
|
Loading…
Reference in New Issue
Block a user