diff options
| author | bors <bors@rust-lang.org> | 2013-04-19 22:12:52 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-04-19 22:12:52 -0700 |
| commit | e67f1c0fd229ab9f106c17f3b690dc6059eaeef0 (patch) | |
| tree | 7027a88f7b8c7a1064dd36e91c36a4f5b8861b15 | |
| parent | 047ba2642f39baa60c13aa0318ddcb09d9ca5301 (diff) | |
| parent | a1a9326c6d71cb7f3b678f4047a1e958318dd337 (diff) | |
| download | rust-e67f1c0fd229ab9f106c17f3b690dc6059eaeef0.tar.gz rust-e67f1c0fd229ab9f106c17f3b690dc6059eaeef0.zip | |
auto merge of #5968 : gifnksm/rust/windowed, r=brson
vec::windowed fails if given window size is greater than vector length + 1.
```rust
for vec::windowed(7, &[1,2,3,4,5,6]) |vs| { fail!(); } // => do nothing
for vec::windowed(8, &[1,2,3,4,5,6]) |vs| { fail!(); } // => assertion failure in vec::slice
```
| -rw-r--r-- | src/libcore/vec.rs | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs index efb11271af6..3f049fc3851 100644 --- a/src/libcore/vec.rs +++ b/src/libcore/vec.rs @@ -1542,6 +1542,7 @@ pub fn each_permutation<T:Copy>(v: &[T], put: &fn(ts: &[T]) -> bool) { #[cfg(stage0)] // XXX: lifetimes! pub fn windowed<T>(n: uint, v: &[T], it: &fn(&[T]) -> bool) { assert!(1u <= n); + if n > v.len() { return; } for uint::range(0, v.len() - n + 1) |i| { if !it(v.slice(i, i+n)) { return } } @@ -1551,6 +1552,7 @@ pub fn windowed<T>(n: uint, v: &[T], it: &fn(&[T]) -> bool) { #[cfg(stage3)] pub fn windowed<'r, T>(n: uint, v: &'r [T], it: &fn(&'r [T]) -> bool) { assert!(1u <= n); + if n > v.len() { return; } for uint::range(0, v.len() - n + 1) |i| { if !it(v.slice(i, i + n)) { return } } @@ -3910,6 +3912,7 @@ mod tests { t(3, &[&[1,2,3],&[2,3,4],&[3,4,5],&[4,5,6]]); t(4, &[&[1,2,3,4],&[2,3,4,5],&[3,4,5,6]]); t(7, &[]); + t(8, &[]); } #[test] |
