Skip to content

Commit c5e4c09

Browse files
author
blake2-ppc
committed
---
yaml --- r: 64279 b: refs/heads/snap-stage3 c: 89a0c99 h: refs/heads/master i: 64277: df8e946 64275: 80f25c4 64271: 0254655 v: v3
1 parent 7a55a3e commit c5e4c09

File tree

2 files changed

+34
-40
lines changed

2 files changed

+34
-40
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: 2d28d645422c1617be58c8ca7ad9a457264ca850
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: c6e7890e1312412ecf70490b3f00f674fb027f8a
4+
refs/heads/snap-stage3: 89a0c99dbee1c1327e8f8a8e5127127e2b3de88e
55
refs/heads/try: 7b78b52e602bb3ea8174f9b2006bff3315f03ef9
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b

branches/snap-stage3/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)