about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorDavid Creswick <dcrewi@gyrae.net>2015-02-10 21:32:00 -0600
committerDavid Creswick <dcrewi@gyrae.net>2015-02-11 17:03:48 -0600
commitcf475e6b107224e7c6dc7c6c16e4626abb1c9a86 (patch)
tree31e5a23503f2ce81d36a661a420afda59c578d73 /src/libcore
parenta954663db66fc8efb1889beaf7bd1771ecbb9b21 (diff)
downloadrust-cf475e6b107224e7c6dc7c6c16e4626abb1c9a86.tar.gz
rust-cf475e6b107224e7c6dc7c6c16e4626abb1c9a86.zip
implement missing iterator traits for slice::Windows
- DoubleEndedIterator
- ExactSizeIterator
- RandomAccessIterator
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/slice.rs38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs
index 459addb09fd..061531ac101 100644
--- a/src/libcore/slice.rs
+++ b/src/libcore/slice.rs
@@ -1179,8 +1179,42 @@ impl<'a, T> Iterator for Windows<'a, T> {
         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])
         }
     }
 }