Skip to content

Commit a1835bc

Browse files
committed
Make Vec::split_at_spare_mut impl safer & simplier
1 parent 9c4e3af commit a1835bc

File tree

1 file changed

+5
-9
lines changed

1 file changed

+5
-9
lines changed

library/alloc/src/vec/mod.rs

+5-9
Original file line numberDiff line numberDiff line change
@@ -1944,20 +1944,16 @@ impl<T, A: Allocator> Vec<T, A> {
19441944
#[unstable(feature = "vec_split_at_spare", issue = "81944")]
19451945
#[inline]
19461946
pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>]) {
1947-
let ptr = self.as_mut_ptr();
1948-
1949-
// SAFETY:
1950-
// - `ptr` is guaranteed to be in bounds for `capacity` elements
1951-
// - `len` is guaranteed to less or equal to `capacity`
1952-
// - `MaybeUninit<T>` has the same layout as `T`
1953-
let spare_ptr = unsafe { ptr.cast::<MaybeUninit<T>>().add(self.len) };
1947+
let Range { start: ptr, end: spare_ptr } = self.as_mut_ptr_range();
1948+
let spare_ptr = spare_ptr.cast::<MaybeUninit<T>>();
1949+
let spare_len = self.buf.capacity() - self.len;
19541950

19551951
// SAFETY:
19561952
// - `ptr` is guaranteed to be valid for `len` elements
1957-
// - `spare_ptr` is offseted from `ptr` by `len`, so it doesn't overlap `initialized` slice
1953+
// - `spare_ptr` is pointing one element past the buffer, so it doesn't overlap with `initialized` slice
19581954
unsafe {
19591955
let initialized = slice::from_raw_parts_mut(ptr, self.len);
1960-
let spare = slice::from_raw_parts_mut(spare_ptr, self.buf.capacity() - self.len);
1956+
let spare = slice::from_raw_parts_mut(spare_ptr, spare_len);
19611957

19621958
(initialized, spare)
19631959
}

0 commit comments

Comments
 (0)