@@ -20,13 +20,13 @@ use cmp::{Eq, Equiv};
20
20
use hash:: Hash ;
21
21
use old_iter:: BaseIter ;
22
22
use old_iter;
23
- use iterator:: IteratorUtil ;
23
+ use iterator:: { Iterator , IteratorUtil } ;
24
24
use option:: { None , Option , Some } ;
25
25
use rand:: RngUtil ;
26
26
use rand;
27
27
use uint;
28
28
use vec;
29
- use vec:: ImmutableVector ;
29
+ use vec:: { ImmutableVector , MutableVector } ;
30
30
use kinds:: Copy ;
31
31
use util:: { replace, unreachable} ;
32
32
@@ -311,24 +311,17 @@ impl<K:Hash + Eq,V> Map<K, V> for HashMap<K, V> {
311
311
312
312
/// Visit all key-value pairs
313
313
fn each < ' a > ( & ' a self , blk : & fn ( & K , & ' a V ) -> bool ) -> bool {
314
- for self . buckets. iter( ) . advance |bucket| {
315
- for bucket. iter( ) . advance |pair| {
316
- if !blk( & pair. key, & pair. value) {
317
- return false ;
318
- }
319
- }
320
- }
321
- return true ;
314
+ self . iter ( ) . advance ( |( k, v) | blk ( k, v) )
322
315
}
323
316
324
317
/// Visit all keys
325
318
fn each_key ( & self , blk : & fn ( k : & K ) -> bool ) -> bool {
326
- self . each ( | k, _| blk( k) )
319
+ self . iter ( ) . advance ( | ( k, _) | blk ( k) )
327
320
}
328
321
329
322
/// Visit all values
330
323
fn each_value < ' a > ( & ' a self , blk : & fn ( v : & ' a V ) -> bool ) -> bool {
331
- self . each ( | _, v| blk( v) )
324
+ self . iter ( ) . advance ( | ( _, v) | blk ( v) )
332
325
}
333
326
334
327
/// Iterate over the map and mutate the contained values
@@ -524,6 +517,19 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
524
517
TableFull | FoundHole ( _) => None ,
525
518
}
526
519
}
520
+
521
+ /// An iterator visiting all key-value pairs in arbitrary order.
522
+ /// Iterator element type is (&'a K, &'a V).
523
+ pub fn iter < ' a > ( & ' a self ) -> HashMapIterator < ' a , K , V > {
524
+ HashMapIterator { iter : self . buckets . iter ( ) }
525
+ }
526
+
527
+ /// An iterator visiting all key-value pairs in arbitrary order,
528
+ /// with mutable references to the values.
529
+ /// Iterator element type is (&'a K, &'a mut V).
530
+ pub fn mut_iter < ' a > ( & ' a mut self ) -> HashMapMutIterator < ' a , K , V > {
531
+ HashMapMutIterator { iter : self . buckets . mut_iter ( ) }
532
+ }
527
533
}
528
534
529
535
impl < K : Hash + Eq , V : Copy > HashMap < K , V > {
@@ -555,6 +561,61 @@ impl<K:Hash + Eq,V:Eq> Eq for HashMap<K, V> {
555
561
fn ne ( & self , other : & HashMap < K , V > ) -> bool { !self . eq ( other) }
556
562
}
557
563
564
+ /// HashMap iterator
565
+ pub struct HashMapIterator < ' self , K , V > {
566
+ priv iter : vec:: VecIterator < ' self , Option < Bucket < K , V > > > ,
567
+ }
568
+
569
+ /// HashMap mutable values iterator
570
+ pub struct HashMapMutIterator < ' self , K , V > {
571
+ priv iter : vec:: VecMutIterator < ' self , Option < Bucket < K , V > > > ,
572
+ }
573
+
574
+ /// HashSet iterator
575
+ pub struct HashSetIterator < ' self , K > {
576
+ priv iter : vec:: VecIterator < ' self , Option < Bucket < K , ( ) > > > ,
577
+ }
578
+
579
+ impl < ' self , K , V > Iterator < ( & ' self K , & ' self V ) > for HashMapIterator < ' self , K , V > {
580
+ #[ inline]
581
+ fn next ( & mut self ) -> Option < ( & ' self K , & ' self V ) > {
582
+ for self . iter. advance |elt| {
583
+ match elt {
584
+ & Some ( ref bucket) => return Some ( ( & bucket. key , & bucket. value ) ) ,
585
+ & None => { } ,
586
+ }
587
+ }
588
+ None
589
+ }
590
+ }
591
+
592
+ impl < ' self , K , V > Iterator < ( & ' self K , & ' self mut V ) > for HashMapMutIterator < ' self , K , V > {
593
+ #[ inline]
594
+ fn next ( & mut self ) -> Option < ( & ' self K , & ' self mut V ) > {
595
+ for self . iter. advance |elt| {
596
+ match elt {
597
+ & Some ( ref mut bucket) => return Some ( ( & bucket. key , & mut bucket. value ) ) ,
598
+ & None => { } ,
599
+ }
600
+ }
601
+ None
602
+ }
603
+ }
604
+
605
+ impl < ' self , K > Iterator < & ' self K > for HashSetIterator < ' self , K > {
606
+ #[ inline]
607
+ fn next ( & mut self ) -> Option < & ' self K > {
608
+ for self . iter. advance |elt| {
609
+ match elt {
610
+ & Some ( ref bucket) => return Some ( & bucket. key ) ,
611
+ & None => { } ,
612
+ }
613
+ }
614
+ None
615
+ }
616
+ }
617
+
618
+
558
619
/// An implementation of a hash set using the underlying representation of a
559
620
/// HashMap where the value is (). As with the `HashMap` type, a `HashSet`
560
621
/// requires that the elements implement the `Eq` and `Hash` traits.
@@ -664,6 +725,12 @@ impl<T:Hash + Eq> HashSet<T> {
664
725
pub fn contains_equiv < Q : Hash + Equiv < T > > ( & self , value : & Q ) -> bool {
665
726
self . map . contains_key_equiv ( value)
666
727
}
728
+
729
+ /// An iterator visiting all elements in arbitrary order.
730
+ /// Iterator element type is &'a T.
731
+ pub fn iter < ' a > ( & ' a self ) -> HashSetIterator < ' a , T > {
732
+ HashSetIterator { iter : self . map . buckets . iter ( ) }
733
+ }
667
734
}
668
735
669
736
#[ cfg( test) ]
0 commit comments