]> git.lizzy.rs Git - rust.git/commitdiff
implement missing iterator traits for slice::Windows
authorDavid Creswick <dcrewi@gyrae.net>
Wed, 11 Feb 2015 03:32:00 +0000 (21:32 -0600)
committerDavid Creswick <dcrewi@gyrae.net>
Wed, 11 Feb 2015 23:03:48 +0000 (17:03 -0600)
- DoubleEndedIterator
- ExactSizeIterator
- RandomAccessIterator

src/libcollections/slice.rs
src/libcore/slice.rs

index 679754be7490ee35edc70196650968529b6662aa..b3f398b9cdf498fa6809e171b3a53ec634df960a 100644 (file)
@@ -2508,6 +2508,18 @@ fn test_windowsator() {
         let wins: &[&[_]] = &[&[1,2,3], &[2,3,4]];
         assert_eq!(v.windows(3).collect::<Vec<_>>(), wins);
         assert!(v.windows(6).next().is_none());
+
+        let wins: &[&[_]] = &[&[3,4], &[2,3], &[1,2]];
+        assert_eq!(v.windows(2).rev().collect::<Vec<&[_]>>(), wins);
+        let mut it = v.windows(2);
+        assert_eq!(it.indexable(), 3);
+        let win: &[_] = &[1,2];
+        assert_eq!(it.idx(0).unwrap(), win);
+        let win: &[_] = &[2,3];
+        assert_eq!(it.idx(1).unwrap(), win);
+        let win: &[_] = &[3,4];
+        assert_eq!(it.idx(2).unwrap(), win);
+        assert_eq!(it.idx(3), None);
     }
 
     #[test]
index 459addb09fd721ad78b4dbf1504c86b6f367214a..061531ac1010b051418b1d67fad2438af3a6482b 100644 (file)
@@ -1179,8 +1179,42 @@ fn size_hint(&self) -> (uint, Option<uint>) {
         if self.size > self.v.len() {
             (0, Some(0))
         } else {
-            let x = self.v.len() - self.size;
-            (x.saturating_add(1), x.checked_add(1))
+            let size = self.v.len() - self.size + 1;
+            (size, Some(size))
+        }
+    }
+}
+
+#[stable(feature = "rust1", since = "1.0.0")]
+impl<'a, T> DoubleEndedIterator for Windows<'a, T> {
+    #[inline]
+    fn next_back(&mut self) -> Option<&'a [T]> {
+        if self.size > self.v.len() {
+            None
+        } else {
+            let ret = Some(&self.v[self.v.len()-self.size..]);
+            self.v = &self.v[..self.v.len()-1];
+            ret
+        }
+    }
+}
+
+#[stable(feature = "rust1", since = "1.0.0")]
+impl<'a, T> ExactSizeIterator for Windows<'a, T> {}
+
+#[unstable(feature = "core", reason = "trait is experimental")]
+impl<'a, T> RandomAccessIterator for Windows<'a, T> {
+    #[inline]
+    fn indexable(&self) -> uint {
+        self.size_hint().0
+    }
+
+    #[inline]
+    fn idx(&mut self, index: uint) -> Option<&'a [T]> {
+        if index + self.size > self.v.len() {
+            None
+        } else {
+            Some(&self.v[index .. index+self.size])
         }
     }
 }