From cf475e6b107224e7c6dc7c6c16e4626abb1c9a86 Mon Sep 17 00:00:00 2001 From: David Creswick Date: Tue, 10 Feb 2015 21:32:00 -0600 Subject: [PATCH] implement missing iterator traits for slice::Windows - DoubleEndedIterator - ExactSizeIterator - RandomAccessIterator --- src/libcollections/slice.rs | 12 ++++++++++++ src/libcore/slice.rs | 38 +++++++++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/libcollections/slice.rs b/src/libcollections/slice.rs index 679754be749..b3f398b9cdf 100644 --- a/src/libcollections/slice.rs +++ b/src/libcollections/slice.rs @@ -2508,6 +2508,18 @@ mod tests { let wins: &[&[_]] = &[&[1,2,3], &[2,3,4]]; assert_eq!(v.windows(3).collect::>(), wins); assert!(v.windows(6).next().is_none()); + + let wins: &[&[_]] = &[&[3,4], &[2,3], &[1,2]]; + assert_eq!(v.windows(2).rev().collect::>(), 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] 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]) } } }