@@ -989,6 +989,42 @@ impl<T> Vec<T> {
989
989
result
990
990
}
991
991
}
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
+
992
1028
}
993
1029
994
1030
impl < T : Clone > Vec < T > {
@@ -1956,7 +1992,7 @@ mod tests {
1956
1992
fn test_slice_from_mut ( ) {
1957
1993
let mut values = vec ! [ 1u8 , 2 , 3 , 4 , 5 ] ;
1958
1994
{
1959
- let slice = values. slice_from_mut ( 2 ) ;
1995
+ let slice = & mut values[ 2 .. ] ;
1960
1996
assert ! ( slice == [ 3 , 4 , 5 ] ) ;
1961
1997
for p in slice. iter_mut ( ) {
1962
1998
* p += 2 ;
@@ -1970,7 +2006,7 @@ mod tests {
1970
2006
fn test_slice_to_mut ( ) {
1971
2007
let mut values = vec ! [ 1u8 , 2 , 3 , 4 , 5 ] ;
1972
2008
{
1973
- let slice = values. slice_to_mut ( 2 ) ;
2009
+ let slice = & mut values[ .. 2 ] ;
1974
2010
assert ! ( slice == [ 1 , 2 ] ) ;
1975
2011
for p in slice. iter_mut ( ) {
1976
2012
* p += 1 ;
@@ -2344,6 +2380,14 @@ mod tests {
2344
2380
assert_eq ! ( vec2, vec![ ] ) ;
2345
2381
}
2346
2382
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
+
2347
2391
#[ bench]
2348
2392
fn bench_new ( b : & mut Bencher ) {
2349
2393
b. iter ( || {
0 commit comments