about summary refs log tree commit diff
path: root/src/libstd/iterator.rs
diff options
context:
space:
mode:
authorblake2-ppc <blake2-ppc>2013-08-30 20:00:07 +0200
committerblake2-ppc <blake2-ppc>2013-08-30 20:06:26 +0200
commited607dd24aa1e041e4077b356e6bfa88c56b7fcf (patch)
tree3ba47f3c26658e8966eb24ae4348fff9733ceaf6 /src/libstd/iterator.rs
parent4b2cc22031d56a4846bc0ad4e65e19892db734c4 (diff)
downloadrust-ed607dd24aa1e041e4077b356e6bfa88c56b7fcf.tar.gz
rust-ed607dd24aa1e041e4077b356e6bfa88c56b7fcf.zip
std::iterator: Implement .next_back() for Zip
Let Zip be double-ended when both its children have the ExactSizeHint
trait.
Diffstat (limited to 'src/libstd/iterator.rs')
-rw-r--r--src/libstd/iterator.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/libstd/iterator.rs b/src/libstd/iterator.rs
index 19596421cb2..58ebb35846d 100644
--- a/src/libstd/iterator.rs
+++ b/src/libstd/iterator.rs
@@ -936,6 +936,29 @@ impl<A, B, T: Iterator<A>, U: Iterator<B>> Iterator<(A, B)> for Zip<T, U> {
     }
 }
 
+impl<A, B,
+     T: DoubleEndedIterator<A> + ExactSizeHint,
+     U: DoubleEndedIterator<B> + ExactSizeHint> DoubleEndedIterator<(A, B)>
+for Zip<T, U> {
+    #[inline]
+    fn next_back(&mut self) -> Option<(A, B)> {
+        let (a_sz, _) = self.a.size_hint();
+        let (b_sz, _) = self.b.size_hint();
+        if a_sz < b_sz {
+            for _ in range(0, b_sz - a_sz) { self.b.next_back(); }
+        } else if a_sz > b_sz {
+            for _ in range(0, a_sz - b_sz) { self.a.next_back(); }
+        }
+        let (a_sz, _) = self.a.size_hint();
+        let (b_sz, _) = self.b.size_hint();
+        assert!(a_sz == b_sz);
+        match (self.a.next_back(), self.b.next_back()) {
+            (Some(x), Some(y)) => Some((x, y)),
+            _ => None
+        }
+    }
+}
+
 impl<A, B, T: RandomAccessIterator<A>, U: RandomAccessIterator<B>>
 RandomAccessIterator<(A, B)> for Zip<T, U> {
     #[inline]