Skip to content

Commit 1b14a93

Browse files
committed
auto merge of #11242 : Dretch/rust/hashmap-key-value-iterators, r=pcwalton
2 parents 48918fa + d435f4f commit 1b14a93

File tree

2 files changed

+41
-9
lines changed

2 files changed

+41
-9
lines changed

src/librustc/middle/typeck/coherence.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -426,10 +426,9 @@ impl CoherenceChecker {
426426

427427
pub fn check_implementation_coherence(&self) {
428428
let trait_impls = self.crate_context.tcx.trait_impls.borrow();
429-
trait_impls.get().each_key(|&trait_id| {
429+
for &trait_id in trait_impls.get().keys() {
430430
self.check_implementation_coherence_of(trait_id);
431-
true
432-
});
431+
}
433432
}
434433

435434
pub fn check_implementation_coherence_of(&self, trait_def_id: DefId) {

src/libstd/hashmap.rs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ use clone::Clone;
5757
use cmp::{Eq, Equiv};
5858
use default::Default;
5959
use hash::Hash;
60+
use iter;
6061
use iter::{Iterator, FromIterator, Extendable};
6162
use iter::{FilterMap, Chain, Repeat, Zip};
6263
use num;
@@ -525,14 +526,16 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
525526
}
526527
}
527528

528-
/// Visit all keys
529-
pub fn each_key(&self, blk: |k: &K| -> bool) -> bool {
530-
self.iter().advance(|(k, _)| blk(k))
529+
/// An iterator visiting all keys in arbitrary order.
530+
/// Iterator element type is &'a K.
531+
pub fn keys<'a>(&'a self) -> HashMapKeyIterator<'a, K, V> {
532+
self.iter().map(|(k, _v)| k)
531533
}
532534

533-
/// Visit all values
534-
pub fn each_value<'a>(&'a self, blk: |v: &'a V| -> bool) -> bool {
535-
self.iter().advance(|(_, v)| blk(v))
535+
/// An iterator visiting all values in arbitrary order.
536+
/// Iterator element type is &'a V.
537+
pub fn values<'a>(&'a self) -> HashMapValueIterator<'a, K, V> {
538+
self.iter().map(|(_k, v)| v)
536539
}
537540

538541
/// An iterator visiting all key-value pairs in arbitrary order.
@@ -609,6 +612,14 @@ pub struct HashMapMoveIterator<K, V> {
609612
priv iter: vec::MoveIterator<Option<Bucket<K, V>>>,
610613
}
611614

615+
/// HashMap keys iterator
616+
pub type HashMapKeyIterator<'a, K, V> =
617+
iter::Map<'static, (&'a K, &'a V), &'a K, HashMapIterator<'a, K, V>>;
618+
619+
/// HashMap values iterator
620+
pub type HashMapValueIterator<'a, K, V> =
621+
iter::Map<'static, (&'a K, &'a V), &'a V, HashMapIterator<'a, K, V>>;
622+
612623
/// HashSet iterator
613624
#[deriving(Clone)]
614625
pub struct HashSetIterator<'a, K> {
@@ -1015,6 +1026,28 @@ mod test_map {
10151026
assert_eq!(observed, 0xFFFF_FFFF);
10161027
}
10171028

1029+
#[test]
1030+
fn test_keys() {
1031+
let vec = ~[(1, 'a'), (2, 'b'), (3, 'c')];
1032+
let map = vec.move_iter().collect::<HashMap<int, char>>();
1033+
let keys = map.keys().map(|&k| k).collect::<~[int]>();
1034+
assert_eq!(keys.len(), 3);
1035+
assert!(keys.contains(&1));
1036+
assert!(keys.contains(&2));
1037+
assert!(keys.contains(&3));
1038+
}
1039+
1040+
#[test]
1041+
fn test_values() {
1042+
let vec = ~[(1, 'a'), (2, 'b'), (3, 'c')];
1043+
let map = vec.move_iter().collect::<HashMap<int, char>>();
1044+
let values = map.values().map(|&v| v).collect::<~[char]>();
1045+
assert_eq!(values.len(), 3);
1046+
assert!(values.contains(&'a'));
1047+
assert!(values.contains(&'b'));
1048+
assert!(values.contains(&'c'));
1049+
}
1050+
10181051
#[test]
10191052
fn test_find() {
10201053
let mut m = HashMap::new();

0 commit comments

Comments
 (0)