about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-09-08 13:46:15 +0000
committerbors <bors@rust-lang.org>2014-09-08 13:46:15 +0000
commit6f34760e4173dda94162502153fe4c5a2a96fc9d (patch)
treed93f94633b5f4956dd0ded02ea54e063559dbf19
parent5c3987985e919a47826dd5d68a7cf1b50c8837cf (diff)
parentd34992ecbabc8c7e5e7edc82ec0e2caa083c5517 (diff)
downloadrust-6f34760e4173dda94162502153fe4c5a2a96fc9d.tar.gz
rust-6f34760e4173dda94162502153fe4c5a2a96fc9d.zip
auto merge of #16903 : mahkoh/rust/move_items_unwrap, r=aturon
Closes #16879
-rw-r--r--src/libcollections/vec.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs
index f383677ed14..a7005cf454d 100644
--- a/src/libcollections/vec.rs
+++ b/src/libcollections/vec.rs
@@ -1618,6 +1618,19 @@ pub struct MoveItems<T> {
     iter: Items<'static, T>
 }
 
+impl<T> MoveItems<T> {
+    #[inline]
+    /// Drops all items that have not yet been moved and returns the empty vector.
+    pub fn unwrap(mut self) -> Vec<T> {
+        unsafe {
+            for _x in self { }
+            let MoveItems { allocation, cap, iter: _iter } = self;
+            mem::forget(self);
+            Vec { ptr: allocation, cap: cap, len: 0 }
+        }
+    }
+}
+
 impl<T> Iterator<T> for MoveItems<T> {
     #[inline]
     fn next<'a>(&'a mut self) -> Option<T> {
@@ -2016,6 +2029,18 @@ mod tests {
         assert_eq!(vec.swap_remove(0), None);
     }
 
+    #[test]
+    fn test_move_iter_unwrap() {
+        let mut vec: Vec<uint> = 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(|| {