diff options
| author | Jeff Belgum <jeffbelgum@gmail.com> | 2015-01-17 14:30:16 -0800 |
|---|---|---|
| committer | Jeff Belgum <jeffbelgum@gmail.com> | 2015-01-17 16:15:21 -0800 |
| commit | 08e712ebe9e778bb82acd0089f3ac865946ed547 (patch) | |
| tree | 06b43695e7a1956985291cdee554320a61ced252 | |
| parent | f4f10dba2975b51c2d2c92157018db3ac13d4d4a (diff) | |
| download | rust-08e712ebe9e778bb82acd0089f3ac865946ed547.tar.gz rust-08e712ebe9e778bb82acd0089f3ac865946ed547.zip | |
add append to vec with tests
| -rw-r--r-- | src/libcollections/vec.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index 73afefc5a03..f5d7a34536a 100644 --- a/src/libcollections/vec.rs +++ b/src/libcollections/vec.rs @@ -681,6 +681,43 @@ impl<T> Vec<T> { } } + /// Moves all the elements of `other` into `Self`, leaving `other` empty. + /// + /// # Panics + /// + /// Panics if the number of elements in the vector overflows a `uint`. + /// + /// # Examples + /// ```rust + /// let mut vec = vec![1, 2, 3]; + /// let mut vec2 = vec![4, 5, 6]; + /// vec.append(&mut vec2); + /// assert_eq!(vec, vec![1, 2, 3, 4, 5, 6]); + /// assert_eq!(vec2, vec![]); + /// ``` + #[inline] + #[unstable = "new API, waiting for dust to settle"] + pub fn append(&mut self, other: &mut Self) { + if mem::size_of::<T>() == 0 { + // zero-size types consume no memory, so we can't rely on the + // address space running out + self.len = self.len.checked_add(other.len()).expect("length overflow"); + unsafe { other.set_len(0) } + return; + } + self.reserve(other.len()); + let len = self.len(); + unsafe { + ptr::copy_nonoverlapping_memory( + self.get_unchecked_mut(len), + other.as_ptr(), + other.len()); + } + + self.len += other.len(); + unsafe { other.set_len(0); } + } + /// Creates a draining iterator that clears the `Vec` and iterates over /// the removed items from start to end. /// @@ -2298,6 +2335,15 @@ mod tests { assert_eq!(ys.as_slice(), [1u, 2, 3]); } + #[test] + fn test_append() { + let mut vec = vec![1, 2, 3]; + let mut vec2 = vec![4, 5, 6]; + vec.append(&mut vec2); + assert_eq!(vec, vec![1, 2, 3, 4, 5, 6]); + assert_eq!(vec2, vec![]); + } + #[bench] fn bench_new(b: &mut Bencher) { b.iter(|| { |
