diff options
| author | Gareth Smith <garethdanielsmith@gmail.com> | 2013-12-31 19:09:18 +0000 |
|---|---|---|
| committer | Gareth Smith <garethdanielsmith@gmail.com> | 2013-12-31 20:29:39 +0000 |
| commit | d435f4f0598d8a98480cdc2c7bdd3ae2631d9be1 (patch) | |
| tree | 905609c924c31fb7dc2430524f1a6f74abac2da5 /src/libstd | |
| parent | 250ca0eb85ca7bf4497cdf68ecbaa5f90dc7439d (diff) | |
| download | rust-d435f4f0598d8a98480cdc2c7bdd3ae2631d9be1.tar.gz rust-d435f4f0598d8a98480cdc2c7bdd3ae2631d9be1.zip | |
Fix issue #11216 - Replace std::hashmap::{each_key, each_value} with iterators.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/hashmap.rs | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/src/libstd/hashmap.rs b/src/libstd/hashmap.rs index 6ef327ab617..5c3b18caa06 100644 --- a/src/libstd/hashmap.rs +++ b/src/libstd/hashmap.rs @@ -57,6 +57,7 @@ use clone::Clone; use cmp::{Eq, Equiv}; use default::Default; use hash::Hash; +use iter; use iter::{Iterator, FromIterator, Extendable}; use iter::{FilterMap, Chain, Repeat, Zip}; use num; @@ -525,14 +526,16 @@ impl<K: Hash + Eq, V> HashMap<K, V> { } } - /// Visit all keys - pub fn each_key(&self, blk: |k: &K| -> bool) -> bool { - self.iter().advance(|(k, _)| blk(k)) + /// An iterator visiting all keys in arbitrary order. + /// Iterator element type is &'a K. + pub fn keys<'a>(&'a self) -> HashMapKeyIterator<'a, K, V> { + self.iter().map(|(k, _v)| k) } - /// Visit all values - pub fn each_value<'a>(&'a self, blk: |v: &'a V| -> bool) -> bool { - self.iter().advance(|(_, v)| blk(v)) + /// An iterator visiting all values in arbitrary order. + /// Iterator element type is &'a V. + pub fn values<'a>(&'a self) -> HashMapValueIterator<'a, K, V> { + self.iter().map(|(_k, v)| v) } /// An iterator visiting all key-value pairs in arbitrary order. @@ -609,6 +612,14 @@ pub struct HashMapMoveIterator<K, V> { priv iter: vec::MoveIterator<Option<Bucket<K, V>>>, } +/// HashMap keys iterator +pub type HashMapKeyIterator<'a, K, V> = + iter::Map<'static, (&'a K, &'a V), &'a K, HashMapIterator<'a, K, V>>; + +/// HashMap values iterator +pub type HashMapValueIterator<'a, K, V> = + iter::Map<'static, (&'a K, &'a V), &'a V, HashMapIterator<'a, K, V>>; + /// HashSet iterator #[deriving(Clone)] pub struct HashSetIterator<'a, K> { @@ -1016,6 +1027,28 @@ mod test_map { } #[test] + fn test_keys() { + let vec = ~[(1, 'a'), (2, 'b'), (3, 'c')]; + let map = vec.move_iter().collect::<HashMap<int, char>>(); + let keys = map.keys().map(|&k| k).collect::<~[int]>(); + assert_eq!(keys.len(), 3); + assert!(keys.contains(&1)); + assert!(keys.contains(&2)); + assert!(keys.contains(&3)); + } + + #[test] + fn test_values() { + let vec = ~[(1, 'a'), (2, 'b'), (3, 'c')]; + let map = vec.move_iter().collect::<HashMap<int, char>>(); + let values = map.values().map(|&v| v).collect::<~[char]>(); + assert_eq!(values.len(), 3); + assert!(values.contains(&'a')); + assert!(values.contains(&'b')); + assert!(values.contains(&'c')); + } + + #[test] fn test_find() { let mut m = HashMap::new(); assert!(m.find(&1).is_none()); |
