Skip to content

Commit 1f961c7

Browse files
committed
fix range_step{,_inclusive} with negative step
1 parent a2231dc commit 1f961c7

File tree

1 file changed

+10
-16
lines changed

1 file changed

+10
-16
lines changed

src/libstd/iter.rs

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1857,7 +1857,7 @@ pub fn range_step<A: CheckedAdd + Ord + Clone + Zero>(start: A, stop: A, step: A
18571857
impl<A: CheckedAdd + Ord + Clone> Iterator<A> for RangeStep<A> {
18581858
#[inline]
18591859
fn next(&mut self) -> Option<A> {
1860-
if (self.rev && self.state > self.stop) || self.state < self.stop {
1860+
if (self.rev && self.state > self.stop) || (!self.rev && self.state < self.stop) {
18611861
let result = self.state.clone();
18621862
match self.state.checked_add(&self.step) {
18631863
Some(x) => self.state = x,
@@ -1891,22 +1891,14 @@ pub fn range_step_inclusive<A: CheckedAdd + Ord + Clone + Zero>(start: A, stop:
18911891
impl<A: CheckedAdd + Ord + Clone + Eq> Iterator<A> for RangeStepInclusive<A> {
18921892
#[inline]
18931893
fn next(&mut self) -> Option<A> {
1894-
if !self.done {
1895-
if (self.rev && self.state > self.stop) || self.state < self.stop {
1896-
let result = self.state.clone();
1897-
match self.state.checked_add(&self.step) {
1898-
Some(x) => self.state = x,
1899-
None => self.done = true
1900-
}
1901-
Some(result)
1902-
} else {
1903-
if self.state == self.stop {
1904-
self.done = true;
1905-
Some(self.state.clone())
1906-
} else {
1907-
None
1908-
}
1894+
if !self.done && ((self.rev && self.state >= self.stop) ||
1895+
(!self.rev && self.state <= self.stop)) {
1896+
let result = self.state.clone();
1897+
match self.state.checked_add(&self.step) {
1898+
Some(x) => self.state = x,
1899+
None => self.done = true
19091900
}
1901+
Some(result)
19101902
} else {
19111903
None
19121904
}
@@ -2726,13 +2718,15 @@ mod tests {
27262718
fn test_range_step() {
27272719
assert_eq!(range_step(0i, 20, 5).collect::<~[int]>(), ~[0, 5, 10, 15]);
27282720
assert_eq!(range_step(20i, 0, -5).collect::<~[int]>(), ~[20, 15, 10, 5]);
2721+
assert_eq!(range_step(20i, 0, -6).collect::<~[int]>(), ~[20, 14, 8, 2]);
27292722
assert_eq!(range_step(200u8, 255, 50).collect::<~[u8]>(), ~[200u8, 250]);
27302723
}
27312724

27322725
#[test]
27332726
fn test_range_step_inclusive() {
27342727
assert_eq!(range_step_inclusive(0i, 20, 5).collect::<~[int]>(), ~[0, 5, 10, 15, 20]);
27352728
assert_eq!(range_step_inclusive(20i, 0, -5).collect::<~[int]>(), ~[20, 15, 10, 5, 0]);
2729+
assert_eq!(range_step_inclusive(20i, 0, -6).collect::<~[int]>(), ~[20, 14, 8, 2]);
27362730
assert_eq!(range_step_inclusive(200u8, 255, 50).collect::<~[u8]>(), ~[200u8, 250]);
27372731
}
27382732

0 commit comments

Comments
 (0)