diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index f383677ed1477..a7005cf454db5 100644 --- a/src/libcollections/vec.rs +++ b/src/libcollections/vec.rs @@ -1618,6 +1618,19 @@ pub struct MoveItems { iter: Items<'static, T> } +impl MoveItems { + #[inline] + /// Drops all items that have not yet been moved and returns the empty vector. + pub fn unwrap(mut self) -> Vec { + unsafe { + for _x in self { } + let MoveItems { allocation, cap, iter: _iter } = self; + mem::forget(self); + Vec { ptr: allocation, cap: cap, len: 0 } + } + } +} + impl Iterator for MoveItems { #[inline] fn next<'a>(&'a mut self) -> Option { @@ -2016,6 +2029,18 @@ mod tests { assert_eq!(vec.swap_remove(0), None); } + #[test] + fn test_move_iter_unwrap() { + let mut vec: Vec = Vec::with_capacity(7); + vec.push(1); + vec.push(2); + let ptr = vec.as_ptr(); + vec = vec.move_iter().unwrap(); + assert_eq!(vec.as_ptr(), ptr); + assert_eq!(vec.capacity(), 7); + assert_eq!(vec.len(), 0); + } + #[bench] fn bench_new(b: &mut Bencher) { b.iter(|| {