Rollup merge of #75015 - Amanieu:vec_spare, r=sfackler
Add Vec::spare_capacity_mut Returns the remaining spare capacity of the vector as a slice of `MaybeUninit<T>`. As suggested by @sfackler in https://github.com/rust-lang/rust/pull/70967#issuecomment-612659006. r? @sfackler
This commit is contained in:
commit
d544e21dc3
1 changed files with 42 additions and 1 deletions
|
@ -65,7 +65,7 @@ use core::hash::{Hash, Hasher};
|
||||||
use core::intrinsics::{arith_offset, assume};
|
use core::intrinsics::{arith_offset, assume};
|
||||||
use core::iter::{FromIterator, FusedIterator, TrustedLen};
|
use core::iter::{FromIterator, FusedIterator, TrustedLen};
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
use core::mem::{self, ManuallyDrop};
|
use core::mem::{self, ManuallyDrop, MaybeUninit};
|
||||||
use core::ops::Bound::{Excluded, Included, Unbounded};
|
use core::ops::Bound::{Excluded, Included, Unbounded};
|
||||||
use core::ops::{self, Index, IndexMut, RangeBounds};
|
use core::ops::{self, Index, IndexMut, RangeBounds};
|
||||||
use core::ptr::{self, NonNull};
|
use core::ptr::{self, NonNull};
|
||||||
|
@ -1525,6 +1525,47 @@ impl<T> Vec<T> {
|
||||||
{
|
{
|
||||||
Box::leak(vec.into_boxed_slice())
|
Box::leak(vec.into_boxed_slice())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the remaining spare capacity of the vector as a slice of
|
||||||
|
/// `MaybeUninit<T>`.
|
||||||
|
///
|
||||||
|
/// The returned slice can be used to fill the vector with data (e.g. by
|
||||||
|
/// reading from a file) before marking the data as initialized using the
|
||||||
|
/// [`set_len`] method.
|
||||||
|
///
|
||||||
|
/// [`set_len`]: #method.set_len
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(vec_spare_capacity, maybe_uninit_extra)]
|
||||||
|
///
|
||||||
|
/// // Allocate vector big enough for 10 elements.
|
||||||
|
/// let mut v = Vec::with_capacity(10);
|
||||||
|
///
|
||||||
|
/// // Fill in the first 3 elements.
|
||||||
|
/// let uninit = v.spare_capacity_mut();
|
||||||
|
/// uninit[0].write(0);
|
||||||
|
/// uninit[1].write(1);
|
||||||
|
/// uninit[2].write(2);
|
||||||
|
///
|
||||||
|
/// // Mark the first 3 elements of the vector as being initialized.
|
||||||
|
/// unsafe {
|
||||||
|
/// v.set_len(3);
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// assert_eq!(&v, &[0, 1, 2]);
|
||||||
|
/// ```
|
||||||
|
#[unstable(feature = "vec_spare_capacity", issue = "75017")]
|
||||||
|
#[inline]
|
||||||
|
pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
|
||||||
|
unsafe {
|
||||||
|
slice::from_raw_parts_mut(
|
||||||
|
self.as_mut_ptr().add(self.len) as *mut MaybeUninit<T>,
|
||||||
|
self.buf.capacity() - self.len,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Clone> Vec<T> {
|
impl<T: Clone> Vec<T> {
|
||||||
|
|
Loading…
Add table
Reference in a new issue