about summary refs log tree commit diff
diff options
context:
space:
mode:
authorblake2-ppc <blake2-ppc>2013-07-06 05:42:45 +0200
committerblake2-ppc <blake2-ppc>2013-07-06 05:42:45 +0200
commit08dc72f5d54d3385d2a772b0ce2c92459ff25bfd (patch)
tree28988177c94f4560b6efe4d06805ff5e6baf6dd3
parent40ce0b7d76fe39c58e4bdf119af33c4d24950077 (diff)
downloadrust-08dc72f5d54d3385d2a772b0ce2c92459ff25bfd.tar.gz
rust-08dc72f5d54d3385d2a772b0ce2c92459ff25bfd.zip
deque: Implement FromIterator
So that deque can be used with IteratorUtil::collect()
-rw-r--r--src/libextra/deque.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/libextra/deque.rs b/src/libextra/deque.rs
index 02d3e81148f..3710f089e2f 100644
--- a/src/libextra/deque.rs
+++ b/src/libextra/deque.rs
@@ -13,6 +13,7 @@
 use std::uint;
 use std::vec;
 use std::cast::transmute;
+use std::iterator::FromIterator;
 
 static INITIAL_CAPACITY: uint = 32u; // 2^5
 
@@ -253,6 +254,16 @@ fn get<'r, T>(elts: &'r [Option<T>], i: uint) -> &'r T {
     match elts[i] { Some(ref t) => t, _ => fail!() }
 }
 
+impl<A, T: Iterator<A>> FromIterator<A, T> for Deque<A> {
+    fn from_iterator(iterator: &mut T) -> Deque<A> {
+        let mut deq = Deque::new();
+        for iterator.advance |elt| {
+            deq.add_back(elt);
+        }
+        deq
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use super::*;
@@ -545,4 +556,20 @@ mod tests {
         }
         assert_eq!(d.rev_iter().collect::<~[&int]>(), ~[&4,&3,&2,&1,&0,&6,&7,&8]);
     }
+
+    #[test]
+    fn test_from_iterator() {
+        use std::iterator;
+        let v = ~[1,2,3,4,5,6,7];
+        let deq: Deque<int> = v.iter().transform(|&x| x).collect();
+        let u: ~[int] = deq.iter().transform(|&x| x).collect();
+        assert_eq!(u, v);
+
+        let mut seq = iterator::Counter::new(0u, 2).take_(256);
+        let deq: Deque<uint> = seq.collect();
+        for deq.iter().enumerate().advance |(i, &x)| {
+            assert_eq!(2*i, x);
+        }
+        assert_eq!(deq.len(), 256);
+    }
 }