diff options
| author | Palmer Cox <p@lmercox.com> | 2013-11-30 19:54:28 -0500 |
|---|---|---|
| committer | Palmer Cox <p@lmercox.com> | 2013-11-30 19:54:28 -0500 |
| commit | 2a8dfc3f22e9f2482719fe89d8c8f2aabae8d754 (patch) | |
| tree | 54d1bcadc5475a1927678e527126a403c009844f /src/libstd | |
| parent | f2a01ea27734c9b20389f75d2b0c0da34f4ba5b7 (diff) | |
| download | rust-2a8dfc3f22e9f2482719fe89d8c8f2aabae8d754.tar.gz rust-2a8dfc3f22e9f2482719fe89d8c8f2aabae8d754.zip | |
Implement DoubleEndedIterator for MutChunkIter.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/vec.rs | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index d7b1f188314..45667bdad2e 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -2611,6 +2611,23 @@ impl<'self, T> Iterator<&'self mut [T]> for MutChunkIter<'self, T> { } } +impl<'self, T> DoubleEndedIterator<&'self mut [T]> for MutChunkIter<'self, T> { + #[inline] + fn next_back(&mut self) -> Option<&'self mut [T]> { + if self.remaining == 0 { + None + } else { + let remainder = self.remaining % self.chunk_size; + let sz = if remainder != 0 { remainder } else { self.chunk_size }; + let tmp = util::replace(&mut self.v, &mut []); + let (head, tail) = tmp.mut_split(self.remaining - sz); + self.v = head; + self.remaining -= sz; + Some(tail) + } + } +} + /// An iterator that moves out of a vector. #[deriving(Clone)] pub struct MoveIterator<T> { @@ -4034,6 +4051,18 @@ mod tests { } #[test] + fn test_mut_chunks_invert() { + let mut v = [0u8, 1, 2, 3, 4, 5, 6]; + for (i, chunk) in v.mut_chunks(3).invert().enumerate() { + for x in chunk.mut_iter() { + *x = i as u8; + } + } + let result = [2u8, 2, 2, 1, 1, 1, 0]; + assert_eq!(v, result); + } + + #[test] #[should_fail] fn test_mut_chunks_0() { let mut v = [1, 2, 3, 4]; |
