about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
author=Mark Sinclair <mark.edward.x@gmail.com>2013-07-14 11:26:03 -0400
committer=Mark Sinclair <mark.edward.x@gmail.com>2013-07-14 11:26:03 -0400
commit4ff7ef434ff5805dc8636fa0bb821feeb0705d22 (patch)
tree893d3cfab36f6a85cf41f83d5ed91e88400c7396 /src/libstd
parent8d0feb58e7f5ae67546db9c3cd7fdf4ab792d839 (diff)
downloadrust-4ff7ef434ff5805dc8636fa0bb821feeb0705d22.tar.gz
rust-4ff7ef434ff5805dc8636fa0bb821feeb0705d22.zip
Implemented FromIterator for std::hashmap
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/hashmap.rs25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/libstd/hashmap.rs b/src/libstd/hashmap.rs
index 6c93cd0dc86..d62a445882e 100644
--- a/src/libstd/hashmap.rs
+++ b/src/libstd/hashmap.rs
@@ -18,7 +18,7 @@
 use container::{Container, Mutable, Map, Set};
 use cmp::{Eq, Equiv};
 use hash::Hash;
-use iterator::{Iterator, IteratorUtil};
+use iterator::{Iterator, IteratorUtil, FromIterator};
 use num;
 use option::{None, Option, Some};
 use rand::RngUtil;
@@ -610,6 +610,18 @@ impl<'self, K> Iterator<&'self K> for HashSetIterator<'self, K> {
     }
 }
 
+impl<K: Eq + Hash, V, T: Iterator<(K, V)>> FromIterator<(K, V), T> for HashMap<K, V> {
+    pub fn from_iterator(iter: &mut T) -> HashMap<K, V> {
+        let (lower, _) = iter.size_hint();
+        let mut map = HashMap::with_capacity(lower);
+
+        for iter.advance |(k, v)| {
+            map.insert(k, v);
+        }
+
+        map
+    }
+}        
 
 /// An implementation of a hash set using the underlying representation of a
 /// HashMap where the value is (). As with the `HashMap` type, a `HashSet`
@@ -935,6 +947,17 @@ mod test_map {
 
         assert_eq!(m.find_equiv(&("qux")), None);
     }
+
+    #[test]
+    fn test_from_iter() {
+        let xs = ~[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
+        
+        let map: HashMap<int, int> = xs.iter().transform(|&x| x).collect();
+
+        for xs.iter().advance |&(k, v)| {
+            assert_eq!(map.find(&k), Some(&v));
+        }
+    }
 }
 
 #[cfg(test)]