@@ -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
9941030impl < 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