diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2015-01-27 22:24:03 +0530 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2015-01-27 22:24:03 +0530 |
| commit | 3cda6afac48d91b8528855f906f87eb41d6b9c98 (patch) | |
| tree | 45fad0cdd2919ce97998bc0c12bd5722c297927f | |
| parent | 51ff9e82ec4ffe4d80765707e7348f34cecdc250 (diff) | |
| parent | b93843e1c9fa15d29c71fa96834e232c856b5bb6 (diff) | |
| download | rust-3cda6afac48d91b8528855f906f87eb41d6b9c98.tar.gz rust-3cda6afac48d91b8528855f906f87eb41d6b9c98.zip | |
Rollup merge of #21608 - JeffBelgum:collections-reform-issue-19986-add-append-and-split-off, r=Gankro
@brson @Gankro
| -rw-r--r-- | src/libcollections/vec.rs | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index 0de9b5733fb..03736b3a3ff 100644 --- a/src/libcollections/vec.rs +++ b/src/libcollections/vec.rs @@ -989,6 +989,42 @@ impl<T> Vec<T> { result } } + + /// Splits the collection into two at the given index. + /// + /// Returns a newly allocated `Self`. `self` contains elements `[0, at)`, + /// and the returned `Self` contains elements `[at, len)`. + /// + /// Note that the capacity of `self` does not change. + /// + /// # Examples + /// ```rust + /// let mut vec = vec![1,2,3]; + /// let vec2 = vec.split_off(1); + /// assert_eq!(vec, vec![1]); + /// assert_eq!(vec2, vec![2, 3]); + /// ``` + #[inline] + #[unstable = "new API, waiting for dust to settle"] + pub fn split_off(&mut self, at: usize) -> Self { + assert!(at < self.len(), "`at` out of bounds"); + + let other_len = self.len - at; + let mut other = Vec::with_capacity(other_len); + + // Unsafely `set_len` and copy items to `other`. + unsafe { + self.set_len(at); + other.set_len(other_len); + + ptr::copy_nonoverlapping_memory( + other.as_mut_ptr(), + self.as_ptr().offset(at as isize), + other.len()); + } + other + } + } impl<T: Clone> Vec<T> { @@ -1956,7 +1992,7 @@ mod tests { fn test_slice_from_mut() { let mut values = vec![1u8,2,3,4,5]; { - let slice = values.slice_from_mut(2); + let slice = &mut values[2 ..]; assert!(slice == [3, 4, 5]); for p in slice.iter_mut() { *p += 2; @@ -1970,7 +2006,7 @@ mod tests { fn test_slice_to_mut() { let mut values = vec![1u8,2,3,4,5]; { - let slice = values.slice_to_mut(2); + let slice = &mut values[.. 2]; assert!(slice == [1, 2]); for p in slice.iter_mut() { *p += 1; @@ -2344,6 +2380,14 @@ mod tests { assert_eq!(vec2, vec![]); } + #[test] + fn test_split_off() { + let mut vec = vec![1, 2, 3, 4, 5, 6]; + let vec2 = vec.split_off(4); + assert_eq!(vec, vec![1, 2, 3, 4]); + assert_eq!(vec2, vec![5, 6]); + } + #[bench] fn bench_new(b: &mut Bencher) { b.iter(|| { |
