@@ -681,6 +681,43 @@ impl<T> Vec<T> {
681
681
}
682
682
}
683
683
684
+ /// Moves all the elements of `other` into `Self`, leaving `other` empty.
685
+ ///
686
+ /// # Panics
687
+ ///
688
+ /// Panics if the number of elements in the vector overflows a `uint`.
689
+ ///
690
+ /// # Examples
691
+ /// ```rust
692
+ /// let mut vec = vec![1, 2, 3];
693
+ /// let mut vec2 = vec![4, 5, 6];
694
+ /// vec.append(&mut vec2);
695
+ /// assert_eq!(vec, vec![1, 2, 3, 4, 5, 6]);
696
+ /// assert_eq!(vec2, vec![]);
697
+ /// ```
698
+ #[ inline]
699
+ #[ unstable = "new API, waiting for dust to settle" ]
700
+ pub fn append ( & mut self , other : & mut Self ) {
701
+ if mem:: size_of :: < T > ( ) == 0 {
702
+ // zero-size types consume no memory, so we can't rely on the
703
+ // address space running out
704
+ self . len = self . len . checked_add ( other. len ( ) ) . expect ( "length overflow" ) ;
705
+ unsafe { other. set_len ( 0 ) }
706
+ return ;
707
+ }
708
+ self . reserve ( other. len ( ) ) ;
709
+ let len = self . len ( ) ;
710
+ unsafe {
711
+ ptr:: copy_nonoverlapping_memory (
712
+ self . get_unchecked_mut ( len) ,
713
+ other. as_ptr ( ) ,
714
+ other. len ( ) ) ;
715
+ }
716
+
717
+ self . len += other. len ( ) ;
718
+ unsafe { other. set_len ( 0 ) ; }
719
+ }
720
+
684
721
/// Creates a draining iterator that clears the `Vec` and iterates over
685
722
/// the removed items from start to end.
686
723
///
@@ -2298,6 +2335,15 @@ mod tests {
2298
2335
assert_eq ! ( ys. as_slice( ) , [ 1 u, 2 , 3 ] ) ;
2299
2336
}
2300
2337
2338
+ #[ test]
2339
+ fn test_append ( ) {
2340
+ let mut vec = vec ! [ 1 , 2 , 3 ] ;
2341
+ let mut vec2 = vec ! [ 4 , 5 , 6 ] ;
2342
+ vec. append ( & mut vec2) ;
2343
+ assert_eq ! ( vec, vec![ 1 , 2 , 3 , 4 , 5 , 6 ] ) ;
2344
+ assert_eq ! ( vec2, vec![ ] ) ;
2345
+ }
2346
+
2301
2347
#[ bench]
2302
2348
fn bench_new ( b : & mut Bencher ) {
2303
2349
b. iter ( || {
0 commit comments