@@ -681,6 +681,43 @@ impl<T> Vec<T> {
681681 }
682682 }
683683
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+
684721 /// Creates a draining iterator that clears the `Vec` and iterates over
685722 /// the removed items from start to end.
686723 ///
@@ -2298,6 +2335,15 @@ mod tests {
22982335 assert_eq ! ( ys. as_slice( ) , [ 1 u, 2 , 3 ] ) ;
22992336 }
23002337
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+
23012347 #[ bench]
23022348 fn bench_new ( b : & mut Bencher ) {
23032349 b. iter ( || {
0 commit comments