about summary refs log tree commit diff
path: root/src/libextra
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-07-14 12:01:22 -0700
committerbors <bors@rust-lang.org>2013-07-14 12:01:22 -0700
commit0cb1ac0f9f7bf98ea8ab5ccbd6ef319decc41a72 (patch)
tree273268a2048fe1c4c1e41750f8fac87d1d7810f1 /src/libextra
parent1c35ab322ff2f26962a3550fffc2fa4154224b64 (diff)
parentbbe03da9c6bad23d8e09077461c1616872e1aca0 (diff)
downloadrust-0cb1ac0f9f7bf98ea8ab5ccbd6ef319decc41a72.tar.gz
rust-0cb1ac0f9f7bf98ea8ab5ccbd6ef319decc41a72.zip
auto merge of #7788 : MarkJr94/rust/from_iter, r=cmr
Added Iterators for HashMap/Set, TreeMap/Set, TrieMap/Set, and PriorityQueue as per Issue #7626 
Diffstat (limited to 'src/libextra')
-rw-r--r--src/libextra/priority_queue.rs27
-rw-r--r--src/libextra/treemap.rs47
2 files changed, 74 insertions, 0 deletions
diff --git a/src/libextra/priority_queue.rs b/src/libextra/priority_queue.rs
index 1f7ba9f6530..58bf4ba9247 100644
--- a/src/libextra/priority_queue.rs
+++ b/src/libextra/priority_queue.rs
@@ -16,6 +16,7 @@
 use std::unstable::intrinsics::{move_val_init, init};
 use std::util::{replace, swap};
 use std::vec;
+use std::iterator::FromIterator;
 
 /// A priority queue implemented with a binary heap
 pub struct PriorityQueue<T> {
@@ -191,6 +192,21 @@ impl<'self, T> Iterator<&'self T> for PriorityQueueIterator<'self, T> {
     fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
 }
 
+impl<T: Ord, Iter: Iterator<T>> FromIterator<T, Iter> for PriorityQueue<T> {
+    pub fn from_iterator(iter: &mut Iter) -> PriorityQueue<T> {
+        let (lower, _) = iter.size_hint();
+
+        let mut q = PriorityQueue::new();
+        q.reserve_at_least(lower);
+
+        for iter.advance |elem| {
+            q.push(elem);
+        }
+
+        q
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use sort::merge_sort;
@@ -341,4 +357,15 @@ mod tests {
     #[should_fail]
     #[ignore(cfg(windows))]
     fn test_empty_replace() { let mut heap = PriorityQueue::new(); heap.replace(5); }
+
+    #[test]
+    fn test_from_iter() {
+        let xs = ~[9u, 8, 7, 6, 5, 4, 3, 2, 1];
+
+        let mut q: PriorityQueue<uint> = xs.rev_iter().transform(|&x| x).collect();
+
+        for xs.iter().advance |&x| {
+            assert_eq!(q.pop(), x);
+        }
+    }
 }
diff --git a/src/libextra/treemap.rs b/src/libextra/treemap.rs
index 05a941b4925..f1fe7acb00f 100644
--- a/src/libextra/treemap.rs
+++ b/src/libextra/treemap.rs
@@ -15,6 +15,7 @@
 
 use std::num;
 use std::util::{swap, replace};
+use std::iterator::FromIterator;
 
 // This is implemented as an AA tree, which is a simplified variation of
 // a red-black tree where red (horizontal) nodes can only be added
@@ -699,6 +700,30 @@ fn remove<K: TotalOrd, V>(node: &mut Option<~TreeNode<K, V>>,
     };
 }
 
+impl<K: TotalOrd, V, T: Iterator<(K, V)>> FromIterator<(K, V), T> for TreeMap<K, V> {
+    pub fn from_iterator(iter: &mut T) -> TreeMap<K, V> {
+        let mut map = TreeMap::new();
+
+        for iter.advance |(k, v)| {
+            map.insert(k, v);
+        }
+
+        map
+    }
+}
+
+impl<T: TotalOrd, Iter: Iterator<T>> FromIterator<T, Iter> for TreeSet<T> {
+    pub fn from_iterator(iter: &mut Iter) -> TreeSet<T> {
+        let mut set = TreeSet::new();
+
+        for iter.advance |elem| {
+            set.insert(elem);
+        }
+
+        set
+    }
+}
+
 #[cfg(test)]
 mod test_treemap {
 
@@ -1017,6 +1042,17 @@ mod test_treemap {
             i += 1;
         }
     }
+
+    #[test]
+    fn test_from_iter() {
+        let xs = ~[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
+
+        let map: TreeMap<int, int> = xs.iter().transform(|&x| x).collect();
+
+        for xs.iter().advance |&(k, v)| {
+            assert_eq!(map.find(&k), Some(&v));
+        }
+    }
 }
 
 #[cfg(test)]
@@ -1244,4 +1280,15 @@ mod test_set {
         assert_eq!(m.pop(&1), Some(2));
         assert_eq!(m.pop(&1), None);
     }
+
+    #[test]
+    fn test_from_iter() {
+        let xs = ~[1, 2, 3, 4, 5, 6, 7, 8, 9];
+
+        let set: TreeSet<int> = xs.iter().transform(|&x| x).collect();
+
+        for xs.iter().advance |x: &int| {
+            assert!(set.contains(x));
+        }
+    }
 }