13
13
//! `TotalOrd`.
14
14
15
15
16
- use std:: num;
17
16
use std:: util:: { swap, replace} ;
18
17
use std:: iterator:: { FromIterator , Extendable } ;
19
18
@@ -152,7 +151,7 @@ impl<K: TotalOrd, V> TreeMap<K, V> {
152
151
153
152
/// Visit all key-value pairs in reverse order
154
153
pub fn each_reverse < ' a > ( & ' a self , f : & fn ( & ' a K , & ' a V ) -> bool ) -> bool {
155
- each_reverse ( & self . root , f )
154
+ self . rev_iter ( ) . advance ( | ( k , v ) | f ( k , v ) )
156
155
}
157
156
158
157
/// Visit all keys in reverse order
@@ -176,6 +175,12 @@ impl<K: TotalOrd, V> TreeMap<K, V> {
176
175
}
177
176
}
178
177
178
+ /// Get a lazy reverse iterator over the key-value pairs in the map.
179
+ /// Requires that it be frozen (immutable).
180
+ pub fn rev_iter < ' a > ( & ' a self ) -> TreeMapRevIterator < ' a , K , V > {
181
+ TreeMapRevIterator { iter : self . iter ( ) }
182
+ }
183
+
179
184
/// Get a lazy iterator that should be initialized using
180
185
/// `iter_traverse_left`/`iter_traverse_right`/`iter_traverse_complete`.
181
186
fn iter_for_traversal < ' a > ( & ' a self ) -> TreeMapIterator < ' a , K , V > {
@@ -254,20 +259,18 @@ pub struct TreeMapIterator<'self, K, V> {
254
259
priv remaining_max : uint
255
260
}
256
261
257
- impl < ' self , K , V > Iterator < ( & ' self K , & ' self V ) > for TreeMapIterator < ' self , K , V > {
258
- /// Advance the iterator to the next node (in order) and return a
259
- /// tuple with a reference to the key and value. If there are no
260
- /// more nodes, return `None`.
261
- fn next ( & mut self ) -> Option < ( & ' self K , & ' self V ) > {
262
+ impl < ' self , K , V > TreeMapIterator < ' self , K , V > {
263
+ #[ inline( always) ]
264
+ fn next_ ( & mut self , forward : bool ) -> Option < ( & ' self K , & ' self V ) > {
262
265
while !self . stack . is_empty ( ) || self . node . is_some ( ) {
263
266
match * self . node {
264
267
Some ( ref x) => {
265
268
self . stack . push ( x) ;
266
- self . node = & x. left ;
269
+ self . node = if forward { & x. left } else { & x . right } ;
267
270
}
268
271
None => {
269
272
let res = self . stack . pop ( ) ;
270
- self . node = & res. right ;
273
+ self . node = if forward { & res. right } else { & res . left } ;
271
274
self . remaining_max -= 1 ;
272
275
if self . remaining_min > 0 {
273
276
self . remaining_min -= 1 ;
@@ -278,13 +281,41 @@ impl<'self, K, V> Iterator<(&'self K, &'self V)> for TreeMapIterator<'self, K, V
278
281
}
279
282
None
280
283
}
284
+ }
285
+
286
+ impl < ' self , K , V > Iterator < ( & ' self K , & ' self V ) > for TreeMapIterator < ' self , K , V > {
287
+ /// Advance the iterator to the next node (in order) and return a
288
+ /// tuple with a reference to the key and value. If there are no
289
+ /// more nodes, return `None`.
290
+ fn next ( & mut self ) -> Option < ( & ' self K , & ' self V ) > {
291
+ self . next_ ( true )
292
+ }
281
293
282
294
#[ inline]
283
295
fn size_hint ( & self ) -> ( uint , Option < uint > ) {
284
296
( self . remaining_min , Some ( self . remaining_max ) )
285
297
}
286
298
}
287
299
300
+ /// Lazy backward iterator over a map
301
+ pub struct TreeMapRevIterator < ' self , K , V > {
302
+ priv iter : TreeMapIterator < ' self , K , V > ,
303
+ }
304
+
305
+ impl < ' self , K , V > Iterator < ( & ' self K , & ' self V ) > for TreeMapRevIterator < ' self , K , V > {
306
+ /// Advance the iterator to the next node (in order) and return a
307
+ /// tuple with a reference to the key and value. If there are no
308
+ /// more nodes, return `None`.
309
+ fn next ( & mut self ) -> Option < ( & ' self K , & ' self V ) > {
310
+ self . iter . next_ ( false )
311
+ }
312
+
313
+ #[ inline]
314
+ fn size_hint ( & self ) -> ( uint , Option < uint > ) {
315
+ self . iter . size_hint ( )
316
+ }
317
+ }
318
+
288
319
/// iter_traverse_left, iter_traverse_right and iter_traverse_complete are used to
289
320
/// initialize TreeMapIterator pointing to element inside tree structure.
290
321
///
@@ -382,6 +413,14 @@ impl<'self, T> Iterator<&'self T> for TreeSetIterator<'self, T> {
382
413
}
383
414
}
384
415
416
+ impl < ' self , T > Iterator < & ' self T > for TreeSetRevIterator < ' self , T > {
417
+ /// Advance the iterator to the next node (in order). If there are no more nodes, return `None`.
418
+ #[ inline]
419
+ fn next ( & mut self ) -> Option < & ' self T > {
420
+ do self . iter . next ( ) . map |& ( value, _) | { value }
421
+ }
422
+ }
423
+
385
424
/// A implementation of the `Set` trait on top of the `TreeMap` container. The
386
425
/// only requirement is that the type of the elements contained ascribes to the
387
426
/// `TotalOrd` trait.
@@ -492,6 +531,13 @@ impl<T: TotalOrd> TreeSet<T> {
492
531
TreeSetIterator { iter : self . map . iter ( ) }
493
532
}
494
533
534
+ /// Get a lazy iterator over the values in the set.
535
+ /// Requires that it be frozen (immutable).
536
+ #[ inline]
537
+ pub fn rev_iter < ' a > ( & ' a self ) -> TreeSetRevIterator < ' a , T > {
538
+ TreeSetRevIterator { iter : self . map . rev_iter ( ) }
539
+ }
540
+
495
541
/// Get a lazy iterator pointing to the first value not less than `v` (greater or equal).
496
542
/// If all elements in the set are less than `v` empty iterator is returned.
497
543
#[ inline]
@@ -540,6 +586,11 @@ pub struct TreeSetIterator<'self, T> {
540
586
priv iter : TreeMapIterator < ' self , T , ( ) >
541
587
}
542
588
589
+ /// Lazy backward iterator over a set
590
+ pub struct TreeSetRevIterator < ' self , T > {
591
+ priv iter : TreeMapRevIterator < ' self , T , ( ) >
592
+ }
593
+
543
594
// Encapsulate an iterator and hold its latest value until stepped forward
544
595
struct Focus < A , T > {
545
596
priv iter : T ,
@@ -691,18 +742,6 @@ impl<K: TotalOrd, V> TreeNode<K, V> {
691
742
}
692
743
}
693
744
694
- fn each < ' r , K : TotalOrd , V > ( node : & ' r Option < ~TreeNode < K , V > > ,
695
- f : & fn ( & ' r K , & ' r V ) -> bool ) -> bool {
696
- node. iter ( ) . advance ( |x| each ( & x. left , |k, v| f ( k, v) ) && f ( & x. key , & x. value ) &&
697
- each ( & x. right , |k, v| f ( k, v) ) )
698
- }
699
-
700
- fn each_reverse < ' r , K : TotalOrd , V > ( node : & ' r Option < ~TreeNode < K , V > > ,
701
- f : & fn ( & ' r K , & ' r V ) -> bool ) -> bool {
702
- node. iter ( ) . advance ( |x| each_reverse ( & x. right , |k, v| f ( k, v) ) && f ( & x. key , & x. value ) &&
703
- each_reverse ( & x. left , |k, v| f ( k, v) ) )
704
- }
705
-
706
745
fn mutate_values < ' r , K : TotalOrd , V > ( node : & ' r mut Option < ~TreeNode < K , V > > ,
707
746
f : & fn ( & ' r K , & ' r mut V ) -> bool )
708
747
-> bool {
0 commit comments