pub struct ForwardIterator<'self, T> {
priv list: &'self List<T>,
priv next: &'self Link<T>,
+ priv nelem: uint,
}
/// List reverse iterator
pub struct ReverseIterator<'self, T> {
priv list: &'self List<T>,
priv next: Rawlink<T>,
+ priv nelem: uint,
}
/// List mutable iterator
pub struct MutForwardIterator<'self, T> {
priv list: &'self mut List<T>,
priv curs: Rawlink<T>,
+ priv nelem: uint,
}
/// List mutable reverse iterator
pub struct MutReverseIterator<'self, T> {
priv list: &'self mut List<T>,
priv next: Rawlink<T>,
+ priv nelem: uint,
}
/// List consuming iterator
/// Provide a forward iterator
pub fn iter<'a>(&'a self) -> ForwardIterator<'a, T> {
- ForwardIterator{list: self, next: &self.list_head}
+ ForwardIterator{nelem: self.len(), list: self, next: &self.list_head}
}
/// Provide a reverse iterator
pub fn rev_iter<'a>(&'a self) -> ReverseIterator<'a, T> {
- ReverseIterator{list: self, next: self.list_tail}
+ ReverseIterator{nelem: self.len(), list: self, next: self.list_tail}
}
/// Provide a forward iterator with mutable references
pub fn mut_iter<'a>(&'a mut self) -> MutForwardIterator<'a, T> {
- MutForwardIterator{list: self, curs: None}
+ MutForwardIterator{nelem: self.len(), list: self, curs: None}
}
/// Provide a reverse iterator with mutable references
pub fn mut_rev_iter<'a>(&'a mut self) -> MutReverseIterator<'a, T> {
- MutReverseIterator{list: self, next: self.list_tail}
+ MutReverseIterator{nelem: self.len(), list: self, next: self.list_tail}
}
match *self.next {
None => None,
Some(ref next) => {
+ self.nelem -= 1;
self.next = &next.next;
Some(&next.value)
}
}
fn size_hint(&self) -> (uint, Option<uint>) {
- (0, Some(self.list.length))
+ (self.nelem, Some(self.nelem))
}
}
match self.list.list_head {
None => None,
Some(ref mut head) => {
+ self.nelem -= 1;
self.curs = rawlink(&mut **head);
Some(&mut head.value)
}
match resolve_rawlink(rcurs).next {
None => None,
Some(ref mut head) => {
+ self.nelem -= 1;
self.curs = rawlink(&mut **head);
Some(&mut head.value)
}
}
fn size_hint(&self) -> (uint, Option<uint>) {
- (0, Some(self.list.length))
+ (self.nelem, Some(self.nelem))
}
}
match self.next {
None => None,
Some(rnext) => {
+ self.nelem -= 1;
let prev = resolve_rawlink(rnext);
self.next = prev.prev;
Some(&prev.value)
}
fn size_hint(&self) -> (uint, Option<uint>) {
- (0, Some(self.list.length))
+ (self.nelem, Some(self.nelem))
}
}
match self.next {
None => None,
Some(rnext) => {
+ self.nelem -= 1;
let prev = resolve_rawlink(rnext);
self.next = prev.prev;
Some(&mut prev.value)
}
fn size_hint(&self) -> (uint, Option<uint>) {
- (0, Some(self.list.length))
+ (self.nelem, Some(self.nelem))
}
}
assert_eq!(n.iter().next(), None);
n.push_front(4);
let mut it = n.iter();
+ assert_eq!(it.size_hint(), (1, Some(1)));
assert_eq!(it.next().unwrap(), &4);
+ assert_eq!(it.size_hint(), (0, Some(0)));
assert_eq!(it.next(), None);
}
assert_eq!(n.rev_iter().next(), None);
n.push_front(4);
let mut it = n.rev_iter();
+ assert_eq!(it.size_hint(), (1, Some(1)));
assert_eq!(it.next().unwrap(), &4);
+ assert_eq!(it.size_hint(), (0, Some(0)));
assert_eq!(it.next(), None);
}
assert!(n.mut_iter().next().is_none());
n.push_front(4);
let mut it = n.mut_iter();
+ assert_eq!(it.size_hint(), (1, Some(1)));
assert!(it.next().is_some());
+ assert_eq!(it.size_hint(), (0, Some(0)));
assert!(it.next().is_none());
}