rollup merge of #22166: dcrewi/iter-impls-for-windows
- DoubleEndedIterator - ExactSizeIterator - RandomAccessIterator
This commit is contained in:
commit
adcda46011
@ -2508,6 +2508,18 @@ mod tests {
|
||||
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]
|
||||
|
@ -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])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user