@@ -57,6 +57,7 @@ use clone::Clone;
57
57
use cmp:: { Eq , Equiv } ;
58
58
use default:: Default ;
59
59
use hash:: Hash ;
60
+ use iter;
60
61
use iter:: { Iterator , FromIterator , Extendable } ;
61
62
use iter:: { FilterMap , Chain , Repeat , Zip } ;
62
63
use num;
@@ -525,14 +526,16 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
525
526
}
526
527
}
527
528
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)
531
533
}
532
534
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)
536
539
}
537
540
538
541
/// An iterator visiting all key-value pairs in arbitrary order.
@@ -609,6 +612,14 @@ pub struct HashMapMoveIterator<K, V> {
609
612
priv iter : vec:: MoveIterator < Option < Bucket < K , V > > > ,
610
613
}
611
614
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
+
612
623
/// HashSet iterator
613
624
#[ deriving( Clone ) ]
614
625
pub struct HashSetIterator < ' a , K > {
@@ -1015,6 +1026,28 @@ mod test_map {
1015
1026
assert_eq ! ( observed, 0xFFFF_FFFF ) ;
1016
1027
}
1017
1028
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
+
1018
1051
#[ test]
1019
1052
fn test_find ( ) {
1020
1053
let mut m = HashMap :: new ( ) ;
0 commit comments