diff options
| 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 |
| commit | 4ff7ef434ff5805dc8636fa0bb821feeb0705d22 (patch) | |
| tree | 893d3cfab36f6a85cf41f83d5ed91e88400c7396 /src/libstd | |
| parent | 8d0feb58e7f5ae67546db9c3cd7fdf4ab792d839 (diff) | |
| download | rust-4ff7ef434ff5805dc8636fa0bb821feeb0705d22.tar.gz rust-4ff7ef434ff5805dc8636fa0bb821feeb0705d22.zip | |
Implemented FromIterator for std::hashmap
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/hashmap.rs | 25 |
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)] |
