18
18
use container:: { Container , Mutable , Map , Set } ;
19
19
use cmp:: { Eq , Equiv } ;
20
20
use hash:: Hash ;
21
- use old_iter:: BaseIter ;
22
- use old_iter;
23
- use iterator:: IteratorUtil ;
21
+ use iterator:: { Iterator , IteratorUtil } ;
24
22
use option:: { None , Option , Some } ;
25
23
use rand:: RngUtil ;
26
24
use rand;
27
25
use uint;
28
26
use vec;
29
- use vec:: ImmutableVector ;
27
+ use vec:: { ImmutableVector , MutableVector } ;
30
28
use kinds:: Copy ;
31
29
use util:: { replace, unreachable} ;
32
30
@@ -311,24 +309,17 @@ impl<K:Hash + Eq,V> Map<K, V> for HashMap<K, V> {
311
309
312
310
/// Visit all key-value pairs
313
311
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 ;
312
+ self . iter ( ) . advance ( |( k, v) | blk ( k, v) )
322
313
}
323
314
324
315
/// Visit all keys
325
316
fn each_key ( & self , blk : & fn ( k : & K ) -> bool ) -> bool {
326
- self . each ( | k, _| blk( k) )
317
+ self . iter ( ) . advance ( | ( k, _) | blk ( k) )
327
318
}
328
319
329
320
/// Visit all values
330
321
fn each_value < ' a > ( & ' a self , blk : & fn ( v : & ' a V ) -> bool ) -> bool {
331
- self . each ( | _, v| blk( v) )
322
+ self . iter ( ) . advance ( | ( _, v) | blk ( v) )
332
323
}
333
324
334
325
/// Iterate over the map and mutate the contained values
@@ -524,6 +515,19 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
524
515
TableFull | FoundHole ( _) => None ,
525
516
}
526
517
}
518
+
519
+ /// An iterator visiting all key-value pairs in arbitrary order.
520
+ /// Iterator element type is (&'a K, &'a V).
521
+ pub fn iter < ' a > ( & ' a self ) -> HashMapIterator < ' a , K , V > {
522
+ HashMapIterator { iter : self . buckets . iter ( ) }
523
+ }
524
+
525
+ /// An iterator visiting all key-value pairs in arbitrary order,
526
+ /// with mutable references to the values.
527
+ /// Iterator element type is (&'a K, &'a mut V).
528
+ pub fn mut_iter < ' a > ( & ' a mut self ) -> HashMapMutIterator < ' a , K , V > {
529
+ HashMapMutIterator { iter : self . buckets . mut_iter ( ) }
530
+ }
527
531
}
528
532
529
533
impl < K : Hash + Eq , V : Copy > HashMap < K , V > {
@@ -542,7 +546,7 @@ impl<K:Hash + Eq,V:Eq> Eq for HashMap<K, V> {
542
546
fn eq ( & self , other : & HashMap < K , V > ) -> bool {
543
547
if self . len ( ) != other. len ( ) { return false ; }
544
548
545
- for self . each | key, value| {
549
+ for self . iter ( ) . advance | ( key, value) | {
546
550
match other. find( key) {
547
551
None => return false ,
548
552
Some ( v) => if value != v { return false } ,
@@ -555,19 +559,68 @@ impl<K:Hash + Eq,V:Eq> Eq for HashMap<K, V> {
555
559
fn ne( & self , other: & HashMap < K , V > ) -> bool { !self . eq( other) }
556
560
}
557
561
562
+ /// HashMap iterator
563
+ pub struct HashMapIterator < ' self , K , V > {
564
+ priv iter: vec:: VecIterator < ' self , Option < Bucket < K , V > > > ,
565
+ }
566
+
567
+ /// HashMap mutable values iterator
568
+ pub struct HashMapMutIterator < ' self , K , V > {
569
+ priv iter: vec:: VecMutIterator < ' self , Option < Bucket < K , V > > > ,
570
+ }
571
+
572
+ /// HashSet iterator
573
+ pub struct HashSetIterator < ' self , K > {
574
+ priv iter: vec:: VecIterator < ' self , Option < Bucket < K , ( ) > > > ,
575
+ }
576
+
577
+ impl <' self , K , V > Iterator < ( & ' self K , & ' self V ) > for HashMapIterator < ' self , K , V > {
578
+ #[ inline]
579
+ fn next( & mut self ) -> Option < ( & ' self K , & ' self V ) > {
580
+ for self . iter. advance |elt| {
581
+ match elt {
582
+ & Some ( ref bucket) => return Some ( ( & bucket. key, & bucket. value) ) ,
583
+ & None => { } ,
584
+ }
585
+ }
586
+ None
587
+ }
588
+ }
589
+
590
+ impl <' self , K , V > Iterator < ( & ' self K , & ' self mut V ) > for HashMapMutIterator < ' self , K , V > {
591
+ #[ inline]
592
+ fn next( & mut self ) -> Option < ( & ' self K , & ' self mut V ) > {
593
+ for self . iter. advance |elt| {
594
+ match elt {
595
+ & Some ( ref mut bucket) => return Some ( ( & bucket. key, & mut bucket. value) ) ,
596
+ & None => { } ,
597
+ }
598
+ }
599
+ None
600
+ }
601
+ }
602
+
603
+ impl <' self , K > Iterator < & ' self K > for HashSetIterator < ' self , K > {
604
+ #[ inline]
605
+ fn next( & mut self ) -> Option < & ' self K > {
606
+ for self . iter. advance |elt| {
607
+ match elt {
608
+ & Some ( ref bucket) => return Some ( & bucket. key) ,
609
+ & None => { } ,
610
+ }
611
+ }
612
+ None
613
+ }
614
+ }
615
+
616
+
558
617
/// An implementation of a hash set using the underlying representation of a
559
618
/// HashMap where the value is ( ) . As with the `HashMap ` type , a `HashSet `
560
619
/// requires that the elements implement the `Eq` and `Hash` traits.
561
620
pub struct HashSet < T > {
562
621
priv map: HashMap < T , ( ) >
563
622
}
564
623
565
- impl < T : Hash + Eq > BaseIter < T > for HashSet < T > {
566
- /// Visit all values in order
567
- fn each ( & self , f : & fn ( & T ) -> bool ) -> bool { self . map . each_key ( f) }
568
- fn size_hint ( & self ) -> Option < uint > { Some ( self . len ( ) ) }
569
- }
570
-
571
624
impl <T : Hash + Eq > Eq for HashSet < T > {
572
625
fn eq( & self , other: & HashSet < T > ) -> bool { self . map == other. map }
573
626
fn ne( & self , other: & HashSet < T > ) -> bool { self . map != other. map }
@@ -601,12 +654,12 @@ impl<T:Hash + Eq> Set<T> for HashSet<T> {
601
654
/// Return true if the set has no elements in common with `other`.
602
655
/// This is equivalent to checking for an empty intersection.
603
656
fn is_disjoint( & self , other: & HashSet < T > ) -> bool {
604
- old_iter :: all ( self , |v| !other. contains ( v) )
657
+ self . iter ( ) . all( |v| !other. contains( v) )
605
658
}
606
659
607
660
/// Return true if the set is a subset of another
608
661
fn is_subset( & self , other: & HashSet < T > ) -> bool {
609
- old_iter :: all ( self , |v| other. contains ( v) )
662
+ self . iter ( ) . all( |v| other. contains( v) )
610
663
}
611
664
612
665
/// Return true if the set is a superset of another
@@ -616,7 +669,7 @@ impl<T:Hash + Eq> Set<T> for HashSet<T> {
616
669
617
670
/// Visit the values representing the difference
618
671
fn difference( & self , other: & HashSet < T > , f: & fn( & T ) -> bool) -> bool {
619
- self . each ( |v| other. contains ( v) || f ( v) )
672
+ self . iter ( ) . advance ( |v| other. contains( v) || f( v) )
620
673
}
621
674
622
675
/// Visit the values representing the symmetric difference
@@ -628,12 +681,12 @@ impl<T:Hash + Eq> Set<T> for HashSet<T> {
628
681
629
682
/// Visit the values representing the intersection
630
683
fn intersection( & self , other: & HashSet < T > , f: & fn( & T ) -> bool) -> bool {
631
- self . each ( |v| !other. contains ( v) || f ( v) )
684
+ self . iter ( ) . advance ( |v| !other. contains( v) || f( v) )
632
685
}
633
686
634
687
/// Visit the values representing the union
635
688
fn union ( & self , other: & HashSet < T > , f: & fn( & T ) -> bool) -> bool {
636
- self . each ( f) && other. each ( |v| self . contains ( v) || f ( v) )
689
+ self . iter ( ) . advance ( f) && other. iter ( ) . advance ( |v| self . contains( v) || f( v) )
637
690
}
638
691
}
639
692
@@ -664,6 +717,18 @@ impl<T:Hash + Eq> HashSet<T> {
664
717
pub fn contains_equiv < Q : Hash + Equiv < T > > ( & self , value: & Q ) -> bool {
665
718
self . map. contains_key_equiv( value)
666
719
}
720
+
721
+ /// Visit all elements in arbitrary order
722
+ /// FIXME: #6978: Remove when all callers are converted
723
+ pub fn each( & self , f: & fn( & T ) -> bool ) -> bool {
724
+ self . iter( ) . advance( f)
725
+ }
726
+
727
+ /// An iterator visiting all elements in arbitrary order.
728
+ /// Iterator element type is &'a T.
729
+ pub fn iter<' a>( & ' a self ) -> HashSetIterator <' a, T > {
730
+ HashSetIterator { iter : self . map. buckets. iter( ) }
731
+ }
667
732
}
668
733
669
734
#[ cfg( test) ]
@@ -808,7 +873,7 @@ mod test_map {
808
873
assert ! ( m. insert( i, i* 2 ) ) ;
809
874
}
810
875
let mut observed = 0 ;
811
- for m. each | k, v| {
876
+ for m. iter ( ) . advance | ( k, v) | {
812
877
assert_eq ! ( * v, * k * 2 ) ;
813
878
observed |= ( 1 << * k) ;
814
879
}
@@ -885,6 +950,7 @@ mod test_set {
885
950
use super :: * ;
886
951
use container:: { Container , Map , Set } ;
887
952
use vec;
953
+ use uint;
888
954
889
955
#[ test]
890
956
fn test_disjoint ( ) {
@@ -937,6 +1003,19 @@ mod test_set {
937
1003
assert ! ( b. is_superset( & a) ) ;
938
1004
}
939
1005
1006
+ #[ test]
1007
+ fn test_iterate ( ) {
1008
+ let mut a = HashSet :: new ( ) ;
1009
+ for uint:: range( 0 , 32 ) |i| {
1010
+ assert ! ( a. insert( i) ) ;
1011
+ }
1012
+ let mut observed = 0 ;
1013
+ for a. iter( ) . advance |k| {
1014
+ observed |= ( 1 << * k) ;
1015
+ }
1016
+ assert_eq ! ( observed, 0xFFFF_FFFF ) ;
1017
+ }
1018
+
940
1019
#[ test]
941
1020
fn test_intersection ( ) {
942
1021
let mut a = HashSet :: new ( ) ;
0 commit comments