@@ -26,7 +26,7 @@ use std::cast;
26
26
use std:: cmp;
27
27
use std:: ptr;
28
28
use std:: util;
29
- use std:: iterator:: FromIterator ;
29
+ use std:: iterator:: { FromIterator , InvertIterator } ;
30
30
31
31
use container:: Deque ;
32
32
@@ -46,17 +46,10 @@ struct Node<T> {
46
46
priv value : T ,
47
47
}
48
48
49
- /// DList iterator
50
- pub struct ForwardIterator < ' self , T > {
51
- priv list : & ' self DList < T > ,
52
- priv next : & ' self Link < T > ,
53
- priv nelem : uint ,
54
- }
55
-
56
- /// DList reverse iterator
57
- pub struct ReverseIterator < ' self , T > {
58
- priv list : & ' self DList < T > ,
59
- priv next : Rawlink < Node < T > > ,
49
+ /// Double-ended DList iterator
50
+ pub struct DListIterator < ' self , T > {
51
+ priv head : & ' self Link < T > ,
52
+ priv tail : Rawlink < Node < T > > ,
60
53
priv nelem : uint ,
61
54
}
62
55
@@ -327,13 +320,13 @@ impl<T> DList<T> {
327
320
328
321
329
322
/// Provide a forward iterator
330
- pub fn iter < ' a > ( & ' a self ) -> ForwardIterator < ' a , T > {
331
- ForwardIterator { nelem : self . len ( ) , list : self , next : & self . list_head }
323
+ pub fn iter < ' a > ( & ' a self ) -> DListIterator < ' a , T > {
324
+ DListIterator { nelem : self . len ( ) , head : & self . list_head , tail : self . list_tail }
332
325
}
333
326
334
327
/// Provide a reverse iterator
335
- pub fn rev_iter < ' a > ( & ' a self ) -> ReverseIterator < ' a , T > {
336
- ReverseIterator { nelem : self . len ( ) , list : self , next : self . list_tail }
328
+ pub fn rev_iter < ' a > ( & ' a self ) -> InvertIterator < & ' a T , DListIterator < ' a , T > > {
329
+ self . iter ( ) . invert ( )
337
330
}
338
331
339
332
/// Provide a forward iterator with mutable references
@@ -367,15 +360,18 @@ impl<T: cmp::TotalOrd> DList<T> {
367
360
}
368
361
}
369
362
370
- impl < ' self , A > Iterator < & ' self A > for ForwardIterator < ' self , A > {
363
+ impl < ' self , A > Iterator < & ' self A > for DListIterator < ' self , A > {
371
364
#[ inline]
372
365
fn next ( & mut self ) -> Option < & ' self A > {
373
- match * self . next {
366
+ if self . nelem == 0 {
367
+ return None ;
368
+ }
369
+ match * self . head {
374
370
None => None ,
375
- Some ( ref next ) => {
371
+ Some ( ref head ) => {
376
372
self . nelem -= 1 ;
377
- self . next = & next . next ;
378
- Some ( & next . value )
373
+ self . head = & head . next ;
374
+ Some ( & head . value )
379
375
}
380
376
}
381
377
}
@@ -385,6 +381,22 @@ impl<'self, A> Iterator<&'self A> for ForwardIterator<'self, A> {
385
381
}
386
382
}
387
383
384
+ impl < ' self , A > DoubleEndedIterator < & ' self A > for DListIterator < ' self , A > {
385
+ fn next_back ( & mut self ) -> Option < & ' self A > {
386
+ if self . nelem == 0 {
387
+ return None ;
388
+ }
389
+ match self . tail . resolve ( ) {
390
+ None => None ,
391
+ Some ( prev) => {
392
+ self . nelem -= 1 ;
393
+ self . tail = prev. prev ;
394
+ Some ( & prev. value )
395
+ }
396
+ }
397
+ }
398
+ }
399
+
388
400
// MutForwardIterator is different because it implements ListInsertion,
389
401
// and can modify the list during traversal, used in insert_when and merge.
390
402
impl < ' self , A > Iterator < & ' self mut A > for MutForwardIterator < ' self , A > {
@@ -419,24 +431,6 @@ impl<'self, A> Iterator<&'self mut A> for MutForwardIterator<'self, A> {
419
431
}
420
432
}
421
433
422
- impl < ' self , A > Iterator < & ' self A > for ReverseIterator < ' self , A > {
423
- #[ inline]
424
- fn next ( & mut self ) -> Option < & ' self A > {
425
- match self . next . resolve ( ) {
426
- None => None ,
427
- Some ( prev) => {
428
- self . nelem -= 1 ;
429
- self . next = prev. prev ;
430
- Some ( & prev. value )
431
- }
432
- }
433
- }
434
-
435
- fn size_hint ( & self ) -> ( uint , Option < uint > ) {
436
- ( self . nelem , Some ( self . nelem ) )
437
- }
438
- }
439
-
440
434
impl < ' self , A > Iterator < & ' self mut A > for MutReverseIterator < ' self , A > {
441
435
#[ inline]
442
436
fn next ( & mut self ) -> Option < & ' self mut A > {
0 commit comments