18
18
use container:: { Container , Mutable , Map , Set } ;
19
19
use cmp:: { Eq , Equiv } ;
20
20
use hash:: Hash ;
21
- use iterator:: { Iterator , IteratorUtil } ;
21
+ use old_iter:: BaseIter ;
22
+ use old_iter;
23
+ use iterator:: IteratorUtil ;
22
24
use option:: { None , Option , Some } ;
23
25
use rand:: RngUtil ;
24
26
use rand;
25
27
use uint;
26
28
use vec;
27
- use vec:: { ImmutableVector , MutableVector } ;
29
+ use vec:: ImmutableVector ;
28
30
use kinds:: Copy ;
29
31
use util:: { replace, unreachable} ;
30
32
@@ -309,17 +311,24 @@ impl<K:Hash + Eq,V> Map<K, V> for HashMap<K, V> {
309
311
310
312
/// Visit all key-value pairs
311
313
fn each < ' a > ( & ' a self , blk : & fn ( & K , & ' a V ) -> bool ) -> bool {
312
- self . iter ( ) . advance ( |( k, v) | blk ( k, v) )
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 ;
313
322
}
314
323
315
324
/// Visit all keys
316
325
fn each_key( & self , blk: & fn( k: & K ) -> bool ) -> bool {
317
- self . iter ( ) . advance ( | ( k, _) | blk ( k) )
326
+ self . each ( | k, _| blk( k) )
318
327
}
319
328
320
329
/// Visit all values
321
330
fn each_value < ' a > ( & ' a self, blk: & fn( v: & ' a V ) -> bool ) -> bool {
322
- self . iter ( ) . advance ( | ( _, v) | blk ( v) )
331
+ self . each ( | _, v| blk( v) )
323
332
}
324
333
325
334
/// Iterate over the map and mutate the contained values
@@ -515,19 +524,6 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
515
524
TableFull | FoundHole ( _) => None ,
516
525
}
517
526
}
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
- }
531
527
}
532
528
533
529
impl < K : Hash + Eq , V : Copy > HashMap < K , V > {
@@ -546,7 +542,7 @@ impl<K:Hash + Eq,V:Eq> Eq for HashMap<K, V> {
546
542
fn eq ( & self , other : & HashMap < K , V > ) -> bool {
547
543
if self . len ( ) != other. len ( ) { return false ; }
548
544
549
- for self . iter ( ) . advance | ( key, value) | {
545
+ for self . each | key, value| {
550
546
match other. find ( key) {
551
547
None => return false ,
552
548
Some ( v) => if value != v { return false } ,
@@ -559,68 +555,19 @@ impl<K:Hash + Eq,V:Eq> Eq for HashMap<K, V> {
559
555
fn ne ( & self , other : & HashMap < K , V > ) -> bool { !self . eq ( other) }
560
556
}
561
557
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
-
617
558
/// An implementation of a hash set using the underlying representation of a
618
559
/// HashMap where the value is (). As with the `HashMap` type, a `HashSet`
619
560
/// requires that the elements implement the `Eq` and `Hash` traits.
620
561
pub struct HashSet < T > {
621
562
priv map: HashMap < T , ( ) >
622
563
}
623
564
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
+
624
571
impl < T : Hash + Eq > Eq for HashSet < T > {
625
572
fn eq ( & self , other : & HashSet < T > ) -> bool { self . map == other. map }
626
573
fn ne ( & self , other : & HashSet < T > ) -> bool { self . map != other. map }
@@ -654,12 +601,12 @@ impl<T:Hash + Eq> Set<T> for HashSet<T> {
654
601
/// Return true if the set has no elements in common with `other`.
655
602
/// This is equivalent to checking for an empty intersection.
656
603
fn is_disjoint ( & self , other : & HashSet < T > ) -> bool {
657
- self . iter ( ) . all( |v| !other. contains( v) )
604
+ old_iter :: all ( self , |v| !other. contains ( v) )
658
605
}
659
606
660
607
/// Return true if the set is a subset of another
661
608
fn is_subset ( & self , other : & HashSet < T > ) -> bool {
662
- self . iter ( ) . all( |v| other. contains( v) )
609
+ old_iter :: all ( self , |v| other. contains ( v) )
663
610
}
664
611
665
612
/// Return true if the set is a superset of another
@@ -669,7 +616,7 @@ impl<T:Hash + Eq> Set<T> for HashSet<T> {
669
616
670
617
/// Visit the values representing the difference
671
618
fn difference ( & self , other : & HashSet < T > , f : & fn ( & T ) -> bool ) -> bool {
672
- self . iter ( ) . advance ( |v| other. contains( v) || f( v) )
619
+ self . each ( |v| other. contains ( v) || f ( v) )
673
620
}
674
621
675
622
/// Visit the values representing the symmetric difference
@@ -681,12 +628,12 @@ impl<T:Hash + Eq> Set<T> for HashSet<T> {
681
628
682
629
/// Visit the values representing the intersection
683
630
fn intersection ( & self , other : & HashSet < T > , f : & fn ( & T ) -> bool ) -> bool {
684
- self . iter ( ) . advance ( |v| !other. contains( v) || f( v) )
631
+ self . each ( |v| !other. contains ( v) || f ( v) )
685
632
}
686
633
687
634
/// Visit the values representing the union
688
635
fn union ( & self , other : & HashSet < T > , f : & fn ( & T ) -> bool ) -> bool {
689
- self . iter ( ) . advance ( f) && other. iter ( ) . advance ( |v| self . contains( v) || f( v) )
636
+ self . each ( f) && other. each ( |v| self . contains ( v) || f ( v) )
690
637
}
691
638
}
692
639
@@ -717,18 +664,6 @@ impl<T:Hash + Eq> HashSet<T> {
717
664
pub fn contains_equiv < Q : Hash + Equiv < T > > ( & self , value : & Q ) -> bool {
718
665
self . map . contains_key_equiv ( value)
719
666
}
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
- }
732
667
}
733
668
734
669
#[ cfg( test) ]
@@ -873,7 +808,7 @@ mod test_map {
873
808
assert ! ( m. insert( i, i* 2 ) ) ;
874
809
}
875
810
let mut observed = 0 ;
876
- for m. iter ( ) . advance | ( k, v) | {
811
+ for m. each | k, v| {
877
812
assert_eq ! ( * v, * k * 2 ) ;
878
813
observed |= ( 1 << * k) ;
879
814
}
@@ -950,7 +885,6 @@ mod test_set {
950
885
use super :: * ;
951
886
use container:: { Container , Map , Set } ;
952
887
use vec;
953
- use uint;
954
888
955
889
#[ test]
956
890
fn test_disjoint ( ) {
@@ -1003,19 +937,6 @@ mod test_set {
1003
937
assert ! ( b. is_superset( & a) ) ;
1004
938
}
1005
939
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
-
1019
940
#[ test]
1020
941
fn test_intersection ( ) {
1021
942
let mut a = HashSet :: new ( ) ;
0 commit comments