@@ -57,6 +57,7 @@ use clone::Clone;
5757use cmp:: { Eq , Equiv } ;
5858use default:: Default ;
5959use hash:: Hash ;
60+ use iter;
6061use iter:: { Iterator , FromIterator , Extendable } ;
6162use iter:: { FilterMap , Chain , Repeat , Zip } ;
6263use 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 ) ]
614625pub 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