diff options
| author | blake2-ppc <blake2-ppc> | 2013-08-30 20:00:07 +0200 |
|---|---|---|
| committer | blake2-ppc <blake2-ppc> | 2013-08-30 20:06:26 +0200 |
| commit | ed607dd24aa1e041e4077b356e6bfa88c56b7fcf (patch) | |
| tree | 3ba47f3c26658e8966eb24ae4348fff9733ceaf6 /src/libstd/iterator.rs | |
| parent | 4b2cc22031d56a4846bc0ad4e65e19892db734c4 (diff) | |
| download | rust-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.rs | 23 |
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] |
