diff options
| author | David Creswick <dcrewi@gyrae.net> | 2015-02-10 21:32:00 -0600 |
|---|---|---|
| committer | David Creswick <dcrewi@gyrae.net> | 2015-02-11 17:03:48 -0600 |
| commit | cf475e6b107224e7c6dc7c6c16e4626abb1c9a86 (patch) | |
| tree | 31e5a23503f2ce81d36a661a420afda59c578d73 /src/libcore | |
| parent | a954663db66fc8efb1889beaf7bd1771ecbb9b21 (diff) | |
| download | rust-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.rs | 38 |
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]) } } } |
