Skip to content

Commit c1d7c44

Browse files
committed
Rollup merge of rust-lang#21608 - JeffBelgum:collections-reform-issue-19986-add-append-and-split-off, r=Gankro
@brson @gankro
2 parents e59f56e + b93843e commit c1d7c44

File tree

1 file changed

+46
-2
lines changed

1 file changed

+46
-2
lines changed

src/libcollections/vec.rs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,42 @@ impl<T> Vec<T> {
989989
result
990990
}
991991
}
992+
993+
/// Splits the collection into two at the given index.
994+
///
995+
/// Returns a newly allocated `Self`. `self` contains elements `[0, at)`,
996+
/// and the returned `Self` contains elements `[at, len)`.
997+
///
998+
/// Note that the capacity of `self` does not change.
999+
///
1000+
/// # Examples
1001+
/// ```rust
1002+
/// let mut vec = vec![1,2,3];
1003+
/// let vec2 = vec.split_off(1);
1004+
/// assert_eq!(vec, vec![1]);
1005+
/// assert_eq!(vec2, vec![2, 3]);
1006+
/// ```
1007+
#[inline]
1008+
#[unstable = "new API, waiting for dust to settle"]
1009+
pub fn split_off(&mut self, at: usize) -> Self {
1010+
assert!(at < self.len(), "`at` out of bounds");
1011+
1012+
let other_len = self.len - at;
1013+
let mut other = Vec::with_capacity(other_len);
1014+
1015+
// Unsafely `set_len` and copy items to `other`.
1016+
unsafe {
1017+
self.set_len(at);
1018+
other.set_len(other_len);
1019+
1020+
ptr::copy_nonoverlapping_memory(
1021+
other.as_mut_ptr(),
1022+
self.as_ptr().offset(at as isize),
1023+
other.len());
1024+
}
1025+
other
1026+
}
1027+
9921028
}
9931029

9941030
impl<T: Clone> Vec<T> {
@@ -1956,7 +1992,7 @@ mod tests {
19561992
fn test_slice_from_mut() {
19571993
let mut values = vec![1u8,2,3,4,5];
19581994
{
1959-
let slice = values.slice_from_mut(2);
1995+
let slice = &mut values[2 ..];
19601996
assert!(slice == [3, 4, 5]);
19611997
for p in slice.iter_mut() {
19621998
*p += 2;
@@ -1970,7 +2006,7 @@ mod tests {
19702006
fn test_slice_to_mut() {
19712007
let mut values = vec![1u8,2,3,4,5];
19722008
{
1973-
let slice = values.slice_to_mut(2);
2009+
let slice = &mut values[.. 2];
19742010
assert!(slice == [1, 2]);
19752011
for p in slice.iter_mut() {
19762012
*p += 1;
@@ -2344,6 +2380,14 @@ mod tests {
23442380
assert_eq!(vec2, vec![]);
23452381
}
23462382

2383+
#[test]
2384+
fn test_split_off() {
2385+
let mut vec = vec![1, 2, 3, 4, 5, 6];
2386+
let vec2 = vec.split_off(4);
2387+
assert_eq!(vec, vec![1, 2, 3, 4]);
2388+
assert_eq!(vec2, vec![5, 6]);
2389+
}
2390+
23472391
#[bench]
23482392
fn bench_new(b: &mut Bencher) {
23492393
b.iter(|| {

0 commit comments

Comments
 (0)