From ed607dd24aa1e041e4077b356e6bfa88c56b7fcf Mon Sep 17 00:00:00 2001 From: blake2-ppc Date: Fri, 30 Aug 2013 20:00:07 +0200 Subject: [PATCH] std::iterator: Implement .next_back() for Zip Let Zip be double-ended when both its children have the ExactSizeHint trait. --- src/libstd/iterator.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) 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]