@@ -39,24 +39,28 @@ struct Node<T> {
39
39
pub struct ForwardIterator < ' self , T > {
40
40
priv list : & ' self List < T > ,
41
41
priv next : & ' self Link < T > ,
42
+ priv nelem : uint ,
42
43
}
43
44
44
45
/// List reverse iterator
45
46
pub struct ReverseIterator < ' self , T > {
46
47
priv list : & ' self List < T > ,
47
48
priv next : Rawlink < T > ,
49
+ priv nelem : uint ,
48
50
}
49
51
50
52
/// List mutable iterator
51
53
pub struct MutForwardIterator < ' self , T > {
52
54
priv list : & ' self mut List < T > ,
53
55
priv curs : Rawlink < T > ,
56
+ priv nelem : uint ,
54
57
}
55
58
56
59
/// List mutable reverse iterator
57
60
pub struct MutReverseIterator < ' self , T > {
58
61
priv list : & ' self mut List < T > ,
59
62
priv next : Rawlink < T > ,
63
+ priv nelem : uint ,
60
64
}
61
65
62
66
/// List consuming iterator
@@ -287,22 +291,22 @@ impl<T> List<T> {
287
291
288
292
/// Provide a forward iterator
289
293
pub fn iter < ' a > ( & ' a self ) -> ForwardIterator < ' a , T > {
290
- ForwardIterator { list : self , next : & self . list_head }
294
+ ForwardIterator { nelem : self . len ( ) , list : self , next : & self . list_head }
291
295
}
292
296
293
297
/// Provide a reverse iterator
294
298
pub fn rev_iter < ' a > ( & ' a self ) -> ReverseIterator < ' a , T > {
295
- ReverseIterator { list : self , next : self . list_tail }
299
+ ReverseIterator { nelem : self . len ( ) , list : self , next : self . list_tail }
296
300
}
297
301
298
302
/// Provide a forward iterator with mutable references
299
303
pub fn mut_iter < ' a > ( & ' a mut self ) -> MutForwardIterator < ' a , T > {
300
- MutForwardIterator { list : self , curs : None }
304
+ MutForwardIterator { nelem : self . len ( ) , list : self , curs : None }
301
305
}
302
306
303
307
/// Provide a reverse iterator with mutable references
304
308
pub fn mut_rev_iter < ' a > ( & ' a mut self ) -> MutReverseIterator < ' a , T > {
305
- MutReverseIterator { list : self , next : self . list_tail }
309
+ MutReverseIterator { nelem : self . len ( ) , list : self , next : self . list_tail }
306
310
}
307
311
308
312
@@ -332,14 +336,15 @@ impl<'self, A> Iterator<&'self A> for ForwardIterator<'self, A> {
332
336
match * self . next {
333
337
None => None ,
334
338
Some ( ref next) => {
339
+ self . nelem -= 1 ;
335
340
self . next = & next. next ;
336
341
Some ( & next. value )
337
342
}
338
343
}
339
344
}
340
345
341
346
fn size_hint ( & self ) -> ( uint , Option < uint > ) {
342
- ( 0 , Some ( self . list . length ) )
347
+ ( self . nelem , Some ( self . nelem ) )
343
348
}
344
349
}
345
350
@@ -353,6 +358,7 @@ impl<'self, A> Iterator<&'self mut A> for MutForwardIterator<'self, A> {
353
358
match self . list . list_head {
354
359
None => None ,
355
360
Some ( ref mut head) => {
361
+ self . nelem -= 1 ;
356
362
self . curs = rawlink ( & mut * * head) ;
357
363
Some ( & mut head. value )
358
364
}
@@ -362,6 +368,7 @@ impl<'self, A> Iterator<&'self mut A> for MutForwardIterator<'self, A> {
362
368
match resolve_rawlink ( rcurs) . next {
363
369
None => None ,
364
370
Some ( ref mut head) => {
371
+ self . nelem -= 1 ;
365
372
self . curs = rawlink ( & mut * * head) ;
366
373
Some ( & mut head. value )
367
374
}
@@ -371,7 +378,7 @@ impl<'self, A> Iterator<&'self mut A> for MutForwardIterator<'self, A> {
371
378
}
372
379
373
380
fn size_hint ( & self ) -> ( uint , Option < uint > ) {
374
- ( 0 , Some ( self . list . length ) )
381
+ ( self . nelem , Some ( self . nelem ) )
375
382
}
376
383
}
377
384
@@ -381,6 +388,7 @@ impl<'self, A> Iterator<&'self A> for ReverseIterator<'self, A> {
381
388
match self . next {
382
389
None => None ,
383
390
Some ( rnext) => {
391
+ self . nelem -= 1 ;
384
392
let prev = resolve_rawlink ( rnext) ;
385
393
self . next = prev. prev ;
386
394
Some ( & prev. value )
@@ -389,7 +397,7 @@ impl<'self, A> Iterator<&'self A> for ReverseIterator<'self, A> {
389
397
}
390
398
391
399
fn size_hint ( & self ) -> ( uint , Option < uint > ) {
392
- ( 0 , Some ( self . list . length ) )
400
+ ( self . nelem , Some ( self . nelem ) )
393
401
}
394
402
}
395
403
@@ -399,6 +407,7 @@ impl<'self, A> Iterator<&'self mut A> for MutReverseIterator<'self, A> {
399
407
match self . next {
400
408
None => None ,
401
409
Some ( rnext) => {
410
+ self . nelem -= 1 ;
402
411
let prev = resolve_rawlink ( rnext) ;
403
412
self . next = prev. prev ;
404
413
Some ( & mut prev. value )
@@ -407,7 +416,7 @@ impl<'self, A> Iterator<&'self mut A> for MutReverseIterator<'self, A> {
407
416
}
408
417
409
418
fn size_hint ( & self ) -> ( uint , Option < uint > ) {
410
- ( 0 , Some ( self . list . length ) )
419
+ ( self . nelem , Some ( self . nelem ) )
411
420
}
412
421
}
413
422
@@ -628,7 +637,9 @@ fn test_iterator() {
628
637
assert_eq ! ( n. iter( ) . next( ) , None ) ;
629
638
n. push_front( 4 ) ;
630
639
let mut it = n. iter( ) ;
640
+ assert_eq ! ( it. size_hint( ) , ( 1 , Some ( 1 ) ) ) ;
631
641
assert_eq ! ( it. next( ) . unwrap( ) , & 4 ) ;
642
+ assert_eq ! ( it. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
632
643
assert_eq ! ( it. next( ) , None ) ;
633
644
}
634
645
@@ -642,7 +653,9 @@ fn test_rev_iter() {
642
653
assert_eq ! ( n. rev_iter( ) . next( ) , None ) ;
643
654
n. push_front( 4 ) ;
644
655
let mut it = n. rev_iter( ) ;
656
+ assert_eq ! ( it. size_hint( ) , ( 1 , Some ( 1 ) ) ) ;
645
657
assert_eq ! ( it. next( ) . unwrap( ) , & 4 ) ;
658
+ assert_eq ! ( it. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
646
659
assert_eq ! ( it. next( ) , None ) ;
647
660
}
648
661
@@ -659,7 +672,9 @@ fn test_mut_iter() {
659
672
assert ! ( n. mut_iter( ) . next( ) . is_none( ) ) ;
660
673
n. push_front( 4 ) ;
661
674
let mut it = n. mut_iter( ) ;
675
+ assert_eq ! ( it. size_hint( ) , ( 1 , Some ( 1 ) ) ) ;
662
676
assert ! ( it. next( ) . is_some( ) ) ;
677
+ assert_eq ! ( it. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
663
678
assert ! ( it. next( ) . is_none( ) ) ;
664
679
}
665
680
0 commit comments