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]
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])
}
}
}