diff --git a/src/libstd/iterator.rs b/src/libstd/iterator.rs index 19596421cb28..58ebb35846da 100644 --- a/src/libstd/iterator.rs +++ b/src/libstd/iterator.rs @@ -936,6 +936,29 @@ impl, U: Iterator> Iterator<(A, B)> for Zip { } } +impl + ExactSizeHint, + U: DoubleEndedIterator + ExactSizeHint> DoubleEndedIterator<(A, B)> +for Zip { + #[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, U: RandomAccessIterator> RandomAccessIterator<(A, B)> for Zip { #[inline]