Skip to content

Commit f97e640

Browse files
author
blake2-ppc
committed
dlist: Implement size_hint properly for all iterators
1 parent 824bb44 commit f97e640

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

src/libextra/dlist.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,24 +39,28 @@ struct Node<T> {
3939
pub struct ForwardIterator<'self, T> {
4040
priv list: &'self List<T>,
4141
priv next: &'self Link<T>,
42+
priv nelem: uint,
4243
}
4344

4445
/// List reverse iterator
4546
pub struct ReverseIterator<'self, T> {
4647
priv list: &'self List<T>,
4748
priv next: Rawlink<T>,
49+
priv nelem: uint,
4850
}
4951

5052
/// List mutable iterator
5153
pub struct MutForwardIterator<'self, T> {
5254
priv list: &'self mut List<T>,
5355
priv curs: Rawlink<T>,
56+
priv nelem: uint,
5457
}
5558

5659
/// List mutable reverse iterator
5760
pub struct MutReverseIterator<'self, T> {
5861
priv list: &'self mut List<T>,
5962
priv next: Rawlink<T>,
63+
priv nelem: uint,
6064
}
6165

6266
/// List consuming iterator
@@ -287,22 +291,22 @@ impl<T> List<T> {
287291

288292
/// Provide a forward iterator
289293
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}
291295
}
292296

293297
/// Provide a reverse iterator
294298
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}
296300
}
297301

298302
/// Provide a forward iterator with mutable references
299303
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}
301305
}
302306

303307
/// Provide a reverse iterator with mutable references
304308
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}
306310
}
307311

308312

@@ -332,14 +336,15 @@ impl<'self, A> Iterator<&'self A> for ForwardIterator<'self, A> {
332336
match *self.next {
333337
None => None,
334338
Some(ref next) => {
339+
self.nelem -= 1;
335340
self.next = &next.next;
336341
Some(&next.value)
337342
}
338343
}
339344
}
340345

341346
fn size_hint(&self) -> (uint, Option<uint>) {
342-
(0, Some(self.list.length))
347+
(self.nelem, Some(self.nelem))
343348
}
344349
}
345350

@@ -353,6 +358,7 @@ impl<'self, A> Iterator<&'self mut A> for MutForwardIterator<'self, A> {
353358
match self.list.list_head {
354359
None => None,
355360
Some(ref mut head) => {
361+
self.nelem -= 1;
356362
self.curs = rawlink(&mut **head);
357363
Some(&mut head.value)
358364
}
@@ -362,6 +368,7 @@ impl<'self, A> Iterator<&'self mut A> for MutForwardIterator<'self, A> {
362368
match resolve_rawlink(rcurs).next {
363369
None => None,
364370
Some(ref mut head) => {
371+
self.nelem -= 1;
365372
self.curs = rawlink(&mut **head);
366373
Some(&mut head.value)
367374
}
@@ -371,7 +378,7 @@ impl<'self, A> Iterator<&'self mut A> for MutForwardIterator<'self, A> {
371378
}
372379

373380
fn size_hint(&self) -> (uint, Option<uint>) {
374-
(0, Some(self.list.length))
381+
(self.nelem, Some(self.nelem))
375382
}
376383
}
377384

@@ -381,6 +388,7 @@ impl<'self, A> Iterator<&'self A> for ReverseIterator<'self, A> {
381388
match self.next {
382389
None => None,
383390
Some(rnext) => {
391+
self.nelem -= 1;
384392
let prev = resolve_rawlink(rnext);
385393
self.next = prev.prev;
386394
Some(&prev.value)
@@ -389,7 +397,7 @@ impl<'self, A> Iterator<&'self A> for ReverseIterator<'self, A> {
389397
}
390398

391399
fn size_hint(&self) -> (uint, Option<uint>) {
392-
(0, Some(self.list.length))
400+
(self.nelem, Some(self.nelem))
393401
}
394402
}
395403

@@ -399,6 +407,7 @@ impl<'self, A> Iterator<&'self mut A> for MutReverseIterator<'self, A> {
399407
match self.next {
400408
None => None,
401409
Some(rnext) => {
410+
self.nelem -= 1;
402411
let prev = resolve_rawlink(rnext);
403412
self.next = prev.prev;
404413
Some(&mut prev.value)
@@ -407,7 +416,7 @@ impl<'self, A> Iterator<&'self mut A> for MutReverseIterator<'self, A> {
407416
}
408417

409418
fn size_hint(&self) -> (uint, Option<uint>) {
410-
(0, Some(self.list.length))
419+
(self.nelem, Some(self.nelem))
411420
}
412421
}
413422

@@ -628,7 +637,9 @@ fn test_iterator() {
628637
assert_eq!(n.iter().next(), None);
629638
n.push_front(4);
630639
let mut it = n.iter();
640+
assert_eq!(it.size_hint(), (1, Some(1)));
631641
assert_eq!(it.next().unwrap(), &4);
642+
assert_eq!(it.size_hint(), (0, Some(0)));
632643
assert_eq!(it.next(), None);
633644
}
634645

@@ -642,7 +653,9 @@ fn test_rev_iter() {
642653
assert_eq!(n.rev_iter().next(), None);
643654
n.push_front(4);
644655
let mut it = n.rev_iter();
656+
assert_eq!(it.size_hint(), (1, Some(1)));
645657
assert_eq!(it.next().unwrap(), &4);
658+
assert_eq!(it.size_hint(), (0, Some(0)));
646659
assert_eq!(it.next(), None);
647660
}
648661

@@ -659,7 +672,9 @@ fn test_mut_iter() {
659672
assert!(n.mut_iter().next().is_none());
660673
n.push_front(4);
661674
let mut it = n.mut_iter();
675+
assert_eq!(it.size_hint(), (1, Some(1)));
662676
assert!(it.next().is_some());
677+
assert_eq!(it.size_hint(), (0, Some(0)));
663678
assert!(it.next().is_none());
664679
}
665680

0 commit comments

Comments
 (0)