about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-04-19 22:12:52 -0700
committerbors <bors@rust-lang.org>2013-04-19 22:12:52 -0700
commite67f1c0fd229ab9f106c17f3b690dc6059eaeef0 (patch)
tree7027a88f7b8c7a1064dd36e91c36a4f5b8861b15
parent047ba2642f39baa60c13aa0318ddcb09d9ca5301 (diff)
parenta1a9326c6d71cb7f3b678f4047a1e958318dd337 (diff)
downloadrust-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.rs3
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]