From 2a8dfc3f22e9f2482719fe89d8c8f2aabae8d754 Mon Sep 17 00:00:00 2001 From: Palmer Cox Date: Sat, 30 Nov 2013 19:54:28 -0500 Subject: [PATCH] Implement DoubleEndedIterator for MutChunkIter. --- src/libstd/vec.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index d7b1f1883141..45667bdad2ef 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 { @@ -4033,6 +4050,18 @@ mod tests { assert_eq!(v, result); } + #[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() {