about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorPalmer Cox <p@lmercox.com>2013-11-30 19:54:28 -0500
committerPalmer Cox <p@lmercox.com>2013-11-30 19:54:28 -0500
commit2a8dfc3f22e9f2482719fe89d8c8f2aabae8d754 (patch)
tree54d1bcadc5475a1927678e527126a403c009844f /src/libstd
parentf2a01ea27734c9b20389f75d2b0c0da34f4ba5b7 (diff)
downloadrust-2a8dfc3f22e9f2482719fe89d8c8f2aabae8d754.tar.gz
rust-2a8dfc3f22e9f2482719fe89d8c8f2aabae8d754.zip
Implement DoubleEndedIterator for MutChunkIter.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/vec.rs29
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];