Skip to content

Commit 27d4d51

Browse files
committed
Simplify RangeInclusive::next[_back]
`match`ing on an `Option<Ordering>` seems cause some confusion for LLVM; switching to just using comparison operators removes a few jumps from the simple `for` loops I was trying.
1 parent 4f93357 commit 27d4d51

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

src/libcore/iter/range.rs

+12-16
Original file line numberDiff line numberDiff line change
@@ -331,19 +331,17 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
331331

332332
#[inline]
333333
fn next(&mut self) -> Option<A> {
334-
use cmp::Ordering::*;
335-
336-
match self.start.partial_cmp(&self.end) {
337-
Some(Less) => {
334+
if self.start <= self.end {
335+
if self.start < self.end {
338336
let n = self.start.add_one();
339337
Some(mem::replace(&mut self.start, n))
340-
},
341-
Some(Equal) => {
338+
} else {
342339
let last = self.start.replace_one();
343340
self.end.replace_zero();
344341
Some(last)
345-
},
346-
_ => None,
342+
}
343+
} else {
344+
None
347345
}
348346
}
349347

@@ -425,19 +423,17 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
425423
impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
426424
#[inline]
427425
fn next_back(&mut self) -> Option<A> {
428-
use cmp::Ordering::*;
429-
430-
match self.start.partial_cmp(&self.end) {
431-
Some(Less) => {
426+
if self.start <= self.end {
427+
if self.start < self.end {
432428
let n = self.end.sub_one();
433429
Some(mem::replace(&mut self.end, n))
434-
},
435-
Some(Equal) => {
430+
} else {
436431
let last = self.end.replace_zero();
437432
self.start.replace_one();
438433
Some(last)
439-
},
440-
_ => None,
434+
}
435+
} else {
436+
None
441437
}
442438
}
443439

src/libcore/tests/iter.rs

+19
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,18 @@ fn test_range_inclusive_exhaustion() {
13321332
assert_eq!(r.next_back(), Some(10));
13331333
assert_eq!(r, 1..=0);
13341334

1335+
let mut r = 10..=12;
1336+
assert_eq!(r.next(), Some(10));
1337+
assert_eq!(r.next(), Some(11));
1338+
assert_eq!(r.next(), Some(12));
1339+
assert_eq!(r, 1..=0);
1340+
1341+
let mut r = 10..=12;
1342+
assert_eq!(r.next_back(), Some(12));
1343+
assert_eq!(r.next_back(), Some(11));
1344+
assert_eq!(r.next_back(), Some(10));
1345+
assert_eq!(r, 1..=0);
1346+
13351347
let mut r = 10..=12;
13361348
assert_eq!(r.nth(2), Some(12));
13371349
assert_eq!(r, 1..=0);
@@ -1340,6 +1352,13 @@ fn test_range_inclusive_exhaustion() {
13401352
assert_eq!(r.nth(5), None);
13411353
assert_eq!(r, 1..=0);
13421354

1355+
let mut r = 100..=10;
1356+
assert_eq!(r.next(), None);
1357+
assert_eq!(r, 100..=10);
1358+
1359+
let mut r = 100..=10;
1360+
assert_eq!(r.next_back(), None);
1361+
assert_eq!(r, 100..=10);
13431362
}
13441363

13451364
#[test]

0 commit comments

Comments
 (0)