Make Vec::split_at_spare_mut public
This commit introduces a new method to the public API, under `vec_split_at_spare` feature gate: ```rust impl<T, A: Allocator> impl Vec<T, A> { pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>]); } ``` The method returns 2 slices, one slice references the content of the vector, and the other references the remaining spare capacity. The method was previously implemented while adding `Vec::extend_from_within`, and used to implement `Vec::spare_capacity_mut` (as the later is just a subset of former one).
This commit is contained in:
parent
3182375e06
commit
cd6dad641c
@ -1828,8 +1828,45 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||||||
self.split_at_spare_mut().1
|
self.split_at_spare_mut().1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns vector content as a slice of `T`, among with the remaining spare
|
||||||
|
/// capacity of the vector as a slice of `MaybeUninit<T>`.
|
||||||
|
///
|
||||||
|
/// The returned spare capacity 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`]: Vec::set_len
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(vec_split_at_spare, maybe_uninit_extra)]
|
||||||
|
///
|
||||||
|
/// let mut v = vec![1, 1, 2];
|
||||||
|
///
|
||||||
|
/// // Reserve additional space big enough for 10 elements.
|
||||||
|
/// v.reserve(10);
|
||||||
|
///
|
||||||
|
/// let (init, uninit) = v.split_at_spare_mut();
|
||||||
|
/// let sum = init.iter().copied().sum::<u32>();
|
||||||
|
///
|
||||||
|
/// // Fill in the next 4 elements.
|
||||||
|
/// uninit[0].write(sum);
|
||||||
|
/// uninit[1].write(sum * 2);
|
||||||
|
/// uninit[2].write(sum * 3);
|
||||||
|
/// uninit[3].write(sum * 4);
|
||||||
|
///
|
||||||
|
/// // Mark the 4 elements of the vector as being initialized.
|
||||||
|
/// unsafe {
|
||||||
|
/// let len = v.len();
|
||||||
|
/// v.set_len(len + 4);
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// assert_eq!(&v, &[1, 1, 2, 4, 8, 12, 16]);
|
||||||
|
/// ```
|
||||||
|
#[unstable(feature = "vec_split_at_spare", issue = "none")]
|
||||||
#[inline]
|
#[inline]
|
||||||
fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>]) {
|
pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>]) {
|
||||||
let ptr = self.as_mut_ptr();
|
let ptr = self.as_mut_ptr();
|
||||||
|
|
||||||
// Safety:
|
// Safety:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user