Skip to content

Commit adcda46

Browse files
committed
rollup merge of #22166: dcrewi/iter-impls-for-windows
- DoubleEndedIterator - ExactSizeIterator - RandomAccessIterator
2 parents a105636 + cf475e6 commit adcda46

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

src/libcollections/slice.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2508,6 +2508,18 @@ mod tests {
25082508
let wins: &[&[_]] = &[&[1,2,3], &[2,3,4]];
25092509
assert_eq!(v.windows(3).collect::<Vec<_>>(), wins);
25102510
assert!(v.windows(6).next().is_none());
2511+
2512+
let wins: &[&[_]] = &[&[3,4], &[2,3], &[1,2]];
2513+
assert_eq!(v.windows(2).rev().collect::<Vec<&[_]>>(), wins);
2514+
let mut it = v.windows(2);
2515+
assert_eq!(it.indexable(), 3);
2516+
let win: &[_] = &[1,2];
2517+
assert_eq!(it.idx(0).unwrap(), win);
2518+
let win: &[_] = &[2,3];
2519+
assert_eq!(it.idx(1).unwrap(), win);
2520+
let win: &[_] = &[3,4];
2521+
assert_eq!(it.idx(2).unwrap(), win);
2522+
assert_eq!(it.idx(3), None);
25112523
}
25122524

25132525
#[test]

src/libcore/slice.rs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,8 +1179,42 @@ impl<'a, T> Iterator for Windows<'a, T> {
11791179
if self.size > self.v.len() {
11801180
(0, Some(0))
11811181
} else {
1182-
let x = self.v.len() - self.size;
1183-
(x.saturating_add(1), x.checked_add(1))
1182+
let size = self.v.len() - self.size + 1;
1183+
(size, Some(size))
1184+
}
1185+
}
1186+
}
1187+
1188+
#[stable(feature = "rust1", since = "1.0.0")]
1189+
impl<'a, T> DoubleEndedIterator for Windows<'a, T> {
1190+
#[inline]
1191+
fn next_back(&mut self) -> Option<&'a [T]> {
1192+
if self.size > self.v.len() {
1193+
None
1194+
} else {
1195+
let ret = Some(&self.v[self.v.len()-self.size..]);
1196+
self.v = &self.v[..self.v.len()-1];
1197+
ret
1198+
}
1199+
}
1200+
}
1201+
1202+
#[stable(feature = "rust1", since = "1.0.0")]
1203+
impl<'a, T> ExactSizeIterator for Windows<'a, T> {}
1204+
1205+
#[unstable(feature = "core", reason = "trait is experimental")]
1206+
impl<'a, T> RandomAccessIterator for Windows<'a, T> {
1207+
#[inline]
1208+
fn indexable(&self) -> uint {
1209+
self.size_hint().0
1210+
}
1211+
1212+
#[inline]
1213+
fn idx(&mut self, index: uint) -> Option<&'a [T]> {
1214+
if index + self.size > self.v.len() {
1215+
None
1216+
} else {
1217+
Some(&self.v[index .. index+self.size])
11841218
}
11851219
}
11861220
}

0 commit comments

Comments
 (0)