about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJeff Belgum <jeffbelgum@gmail.com>2015-01-24 17:23:26 -0800
committerJeff Belgum <jeffbelgum@gmail.com>2015-01-26 14:08:38 -0800
commitb93843e1c9fa15d29c71fa96834e232c856b5bb6 (patch)
treea2dca38a236e7514f76e8fe0efe6d8c9e63143ea /src
parent16286f5cf921a9de463d8a744c33f49837698c3d (diff)
downloadrust-b93843e1c9fa15d29c71fa96834e232c856b5bb6.tar.gz
rust-b93843e1c9fa15d29c71fa96834e232c856b5bb6.zip
add split_off method to vec with tests
Diffstat (limited to 'src')
-rw-r--r--src/libcollections/vec.rs48
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(|| {