diff --git a/src/libcollections/ring_buf.rs b/src/libcollections/ring_buf.rs index 9d7c0ca3d992..c2b5f3fb1585 100644 --- a/src/libcollections/ring_buf.rs +++ b/src/libcollections/ring_buf.rs @@ -1302,7 +1302,10 @@ impl RingBuf { /// Panics if `at > len` /// /// # Examples - /// ```rust + /// + /// ``` + /// use std::collections::RingBuf; + /// /// let mut buf: RingBuf<_> = vec![1,2,3].into_iter().collect(); /// let buf2 = buf.split_off(1); /// // buf = [1], buf2 = [2, 3] @@ -1353,6 +1356,31 @@ impl RingBuf { other } + + /// Moves all the elements of `other` into `Self`, leaving `other` empty. + /// + /// # Panics + /// + /// Panics if the new number of elements in self overflows a `usize`. + /// + /// # Examples + /// + /// ``` + /// use std::collections::RingBuf; + /// + /// let mut buf: RingBuf<_> = vec![1, 2, 3].into_iter().collect(); + /// let mut buf2: RingBuf<_> = vec![4, 5, 6].into_iter().collect(); + /// buf.append(&mut buf2); + /// assert_eq!(buf.len(), 6); + /// assert_eq!(buf2.len(), 0); + /// ``` + #[inline] + #[unstable(feature = "collections", + reason = "new API, waiting for dust to settle")] + pub fn append(&mut self, other: &mut Self) { + // naive impl + self.extend(other.drain()); + } } impl RingBuf { @@ -2813,4 +2841,25 @@ mod tests { } } } + + #[test] + fn test_append() { + let mut a: RingBuf<_> = vec![1, 2, 3].into_iter().collect(); + let mut b: RingBuf<_> = vec![4, 5, 6].into_iter().collect(); + + // normal append + a.append(&mut b); + assert_eq!(a.iter().cloned().collect(), vec![1, 2, 3, 4, 5, 6]); + assert_eq!(b.iter().cloned().collect(), vec![]); + + // append nothing to something + a.append(&mut b); + assert_eq!(a.iter().cloned().collect(), vec![1, 2, 3, 4, 5, 6]); + assert_eq!(b.iter().cloned().collect(), vec![]); + + // append something to nothing + b.append(&mut a); + assert_eq!(b.iter().cloned().collect(), vec![1, 2, 3, 4, 5, 6]); + assert_eq!(a.iter().cloned().collect(), vec![]); + } }