Skip to content

Commit 89a0c99

Browse files
author
blake2-ppc
committed
dlist: Implement DoubleEndedIterator and use for .iter() and .rev_iter()
1 parent c6e7890 commit 89a0c99

File tree

1 file changed

+33
-39
lines changed

1 file changed

+33
-39
lines changed

src/libextra/dlist.rs

Lines changed: 33 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use std::cast;
2626
use std::cmp;
2727
use std::ptr;
2828
use std::util;
29-
use std::iterator::FromIterator;
29+
use std::iterator::{FromIterator, InvertIterator};
3030

3131
use container::Deque;
3232

@@ -46,17 +46,10 @@ struct Node<T> {
4646
priv value: T,
4747
}
4848

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>>,
6053
priv nelem: uint,
6154
}
6255

@@ -327,13 +320,13 @@ impl<T> DList<T> {
327320

328321

329322
/// 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}
332325
}
333326

334327
/// 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()
337330
}
338331

339332
/// Provide a forward iterator with mutable references
@@ -367,15 +360,18 @@ impl<T: cmp::TotalOrd> DList<T> {
367360
}
368361
}
369362

370-
impl<'self, A> Iterator<&'self A> for ForwardIterator<'self, A> {
363+
impl<'self, A> Iterator<&'self A> for DListIterator<'self, A> {
371364
#[inline]
372365
fn next(&mut self) -> Option<&'self A> {
373-
match *self.next {
366+
if self.nelem == 0 {
367+
return None;
368+
}
369+
match *self.head {
374370
None => None,
375-
Some(ref next) => {
371+
Some(ref head) => {
376372
self.nelem -= 1;
377-
self.next = &next.next;
378-
Some(&next.value)
373+
self.head = &head.next;
374+
Some(&head.value)
379375
}
380376
}
381377
}
@@ -385,6 +381,22 @@ impl<'self, A> Iterator<&'self A> for ForwardIterator<'self, A> {
385381
}
386382
}
387383

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+
388400
// MutForwardIterator is different because it implements ListInsertion,
389401
// and can modify the list during traversal, used in insert_when and merge.
390402
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> {
419431
}
420432
}
421433

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-
440434
impl<'self, A> Iterator<&'self mut A> for MutReverseIterator<'self, A> {
441435
#[inline]
442436
fn next(&mut self) -> Option<&'self mut A> {

0 commit comments

Comments
 (0)