@@ -14,6 +14,7 @@ use prelude::*;
14
14
use iterator:: { IteratorUtil , FromIterator , Extendable } ;
15
15
use uint;
16
16
use util:: { swap, replace} ;
17
+ use vec;
17
18
18
19
// FIXME: #5244: need to manually update the TrieNode constructor
19
20
static SHIFT : uint = 4 ;
@@ -146,6 +147,15 @@ impl<T> TrieMap<T> {
146
147
pub fn each_value_reverse ( & self , f : & fn ( & T ) -> bool ) -> bool {
147
148
self . each_reverse ( |_, v| f ( v) )
148
149
}
150
+
151
+ /// Get an iterator over the key-value pairs in the map
152
+ pub fn iter < ' a > ( & ' a self ) -> TrieMapIterator < ' a , T > {
153
+ TrieMapIterator {
154
+ stack : ~[ self . root . children . iter ( ) ] ,
155
+ remaining_min : self . length ,
156
+ remaining_max : self . length
157
+ }
158
+ }
149
159
}
150
160
151
161
impl < T , Iter : Iterator < ( uint , T ) > > FromIterator < ( uint , T ) , Iter > for TrieMap < T > {
@@ -217,6 +227,12 @@ impl TrieSet {
217
227
pub fn each_reverse ( & self , f : & fn ( & uint ) -> bool ) -> bool {
218
228
self . map . each_key_reverse ( f)
219
229
}
230
+
231
+ /// Get an iterator over the values in the set
232
+ #[ inline]
233
+ pub fn iter < ' a > ( & ' a self ) -> TrieSetIterator < ' a > {
234
+ TrieSetIterator { iter : self . map . iter ( ) }
235
+ }
220
236
}
221
237
222
238
impl < Iter : Iterator < uint > > FromIterator < uint , Iter > for TrieSet {
@@ -366,6 +382,61 @@ fn remove<T>(count: &mut uint, child: &mut Child<T>, key: uint,
366
382
return ret;
367
383
}
368
384
385
+ /// Forward iterator over a map
386
+ pub struct TrieMapIterator < ' self , T > {
387
+ priv stack : ~[ vec:: VecIterator < ' self , Child < T > > ] ,
388
+ priv remaining_min : uint ,
389
+ priv remaining_max : uint
390
+ }
391
+
392
+ impl < ' self , T > Iterator < ( uint , & ' self T ) > for TrieMapIterator < ' self , T > {
393
+ fn next ( & mut self ) -> Option < ( uint , & ' self T ) > {
394
+ while !self . stack . is_empty ( ) {
395
+ match self . stack [ self . stack . len ( ) - 1 ] . next ( ) {
396
+ None => {
397
+ self . stack . pop ( ) ;
398
+ }
399
+ Some ( ref child) => {
400
+ match * * child {
401
+ Internal ( ref node) => {
402
+ self . stack . push ( node. children . iter ( ) ) ;
403
+ }
404
+ External ( key, ref value) => {
405
+ self . remaining_max -= 1 ;
406
+ if self . remaining_min > 0 {
407
+ self . remaining_min -= 1 ;
408
+ }
409
+ return Some ( ( key, value) ) ;
410
+ }
411
+ Nothing => { }
412
+ }
413
+ }
414
+ }
415
+ }
416
+ return None ;
417
+ }
418
+
419
+ #[ inline]
420
+ fn size_hint ( & self ) -> ( uint , Option < uint > ) {
421
+ ( self . remaining_min , Some ( self . remaining_max ) )
422
+ }
423
+ }
424
+
425
+ /// Forward iterator over a set
426
+ pub struct TrieSetIterator < ' self > {
427
+ priv iter : TrieMapIterator < ' self , ( ) >
428
+ }
429
+
430
+ impl < ' self > Iterator < uint > for TrieSetIterator < ' self > {
431
+ fn next ( & mut self ) -> Option < uint > {
432
+ do self . iter . next ( ) . map |& ( key, _) | { key }
433
+ }
434
+
435
+ fn size_hint ( & self ) -> ( uint , Option < uint > ) {
436
+ self . iter . size_hint ( )
437
+ }
438
+ }
439
+
369
440
#[ cfg( test) ]
370
441
pub fn check_integrity < T > ( trie : & TrieNode < T > ) {
371
442
assert ! ( trie. count != 0 ) ;
@@ -553,6 +624,29 @@ mod test_map {
553
624
assert_eq ! ( map. find( & k) , Some ( & v) ) ;
554
625
}
555
626
}
627
+
628
+ #[ test]
629
+ fn test_iteration ( ) {
630
+ let empty_map : TrieMap < uint > = TrieMap :: new ( ) ;
631
+ assert_eq ! ( empty_map. iter( ) . next( ) , None ) ;
632
+
633
+ let first = uint:: max_value - 10000 ;
634
+ let last = uint:: max_value;
635
+
636
+ let mut map = TrieMap :: new ( ) ;
637
+ do uint:: range_rev ( last, first) |x| {
638
+ map. insert ( x, x / 2 ) ;
639
+ true
640
+ } ;
641
+
642
+ let mut i = 0 ;
643
+ for ( k, & v) in map. iter ( ) {
644
+ assert_eq ! ( k, first + i) ;
645
+ assert_eq ! ( v, k / 2 ) ;
646
+ i += 1 ;
647
+ }
648
+ assert_eq ! ( i, last - first) ;
649
+ }
556
650
}
557
651
558
652
#[ cfg( test) ]
0 commit comments