Switch over to new range_rev semantics; fix #5270.
This commit is contained in:
parent
3c19f1bca8
commit
db0a13b986
@ -159,8 +159,8 @@ impl<V> SmallIntMap<V> {
|
||||
/// Visit all key-value pairs in reverse order
|
||||
pub fn each_reverse<'a>(&'a self, it: &fn(uint, &'a V) -> bool) -> bool {
|
||||
for uint::range_rev(self.v.len(), 0) |i| {
|
||||
match self.v[i - 1] {
|
||||
Some(ref elt) => if !it(i - 1, elt) { return false; },
|
||||
match self.v[i] {
|
||||
Some(ref elt) => if !it(i, elt) { return false; },
|
||||
None => ()
|
||||
}
|
||||
}
|
||||
|
@ -132,9 +132,10 @@ pub fn range(lo: $T, hi: $T, it: &fn($T) -> bool) -> bool {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
/// Iterate over the range [`hi`..`lo`)
|
||||
/// Iterate over the range (`hi`..`lo`]
|
||||
pub fn range_rev(hi: $T, lo: $T, it: &fn($T) -> bool) -> bool {
|
||||
range_step(hi, lo, -1 as $T, it)
|
||||
if hi == min_value { return true; }
|
||||
range_step_inclusive(hi-1, lo, -1 as $T, it)
|
||||
}
|
||||
|
||||
impl Num for $T {}
|
||||
@ -897,7 +898,7 @@ mod tests {
|
||||
for range(0,3) |i| {
|
||||
l.push(i);
|
||||
}
|
||||
for range_rev(13,10) |i| {
|
||||
for range_rev(14,11) |i| {
|
||||
l.push(i);
|
||||
}
|
||||
for range_step(20,26,2) |i| {
|
||||
|
@ -132,9 +132,10 @@ pub fn range(lo: $T, hi: $T, it: &fn($T) -> bool) -> bool {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
/// Iterate over the range [`hi`..`lo`)
|
||||
/// Iterate over the range (`hi`..`lo`]
|
||||
pub fn range_rev(hi: $T, lo: $T, it: &fn($T) -> bool) -> bool {
|
||||
range_step(hi, lo, -1 as $T_SIGNED, it)
|
||||
if hi == min_value { return true; }
|
||||
range_step_inclusive(hi-1, lo, -1 as $T_SIGNED, it)
|
||||
}
|
||||
|
||||
impl Num for $T {}
|
||||
@ -662,7 +663,7 @@ mod tests {
|
||||
for range(0,3) |i| {
|
||||
l.push(i);
|
||||
}
|
||||
for range_rev(13,10) |i| {
|
||||
for range_rev(14,11) |i| {
|
||||
l.push(i);
|
||||
}
|
||||
for range_step(20,26,2) |i| {
|
||||
|
@ -669,7 +669,7 @@ fn spawn_process_os(prog: &str, args: &[~str],
|
||||
fail!("failure in dup3(err_fd, 2): %s", os::last_os_error());
|
||||
}
|
||||
// close all other fds
|
||||
for int::range_rev(getdtablesize() as int - 1, 2) |fd| {
|
||||
for int::range_rev(getdtablesize() as int, 3) |fd| {
|
||||
close(fd as c_int);
|
||||
}
|
||||
|
||||
|
@ -261,7 +261,7 @@ impl<T> TrieNode<T> {
|
||||
|
||||
fn each_reverse<'a>(&'a self, f: &fn(&uint, &'a T) -> bool) -> bool {
|
||||
for uint::range_rev(self.children.len(), 0) |idx| {
|
||||
match self.children[idx - 1] {
|
||||
match self.children[idx] {
|
||||
Internal(ref x) => if !x.each_reverse(|i,t| f(i,t)) { return false },
|
||||
External(k, ref v) => if !f(&k, v) { return false },
|
||||
Nothing => ()
|
||||
|
@ -40,13 +40,13 @@ pub fn main() {
|
||||
// int and uint have same result for
|
||||
// Sum{100 > i >= 2} == (Sum{1 <= i <= 99} - 1) == n*(n+1)/2 - 1 for n=99
|
||||
let mut sum = 0u;
|
||||
for uint_range_rev(99, 1) |i| {
|
||||
for uint_range_rev(100, 2) |i| {
|
||||
sum += i;
|
||||
}
|
||||
assert_eq!(sum, 4949);
|
||||
|
||||
let mut sum = 0i;
|
||||
for int_range_rev(99, 1) |i| {
|
||||
for int_range_rev(100, 2) |i| {
|
||||
sum += i;
|
||||
}
|
||||
assert_eq!(sum, 4949);
|
||||
@ -55,17 +55,17 @@ pub fn main() {
|
||||
// elements are visited in correct order
|
||||
let primes = [2,3,5,7,11];
|
||||
let mut prod = 1i;
|
||||
for uint_range_rev(4, 0) |i| {
|
||||
for uint_range_rev(5, 0) |i| {
|
||||
println(fmt!("uint 4 downto 0: %u", i));
|
||||
prod *= int::pow(primes[i], i);
|
||||
}
|
||||
assert_eq!(prod, 11*11*11*11*7*7*7*5*5*3);
|
||||
assert_eq!(prod, 11*11*11*11*7*7*7*5*5*3*1);
|
||||
let mut prod = 1i;
|
||||
for int_range_rev(4, 0) |i| {
|
||||
for int_range_rev(5, 0) |i| {
|
||||
println(fmt!("int 4 downto 0: %d", i));
|
||||
prod *= int::pow(primes[i], i as uint);
|
||||
}
|
||||
assert_eq!(prod, 11*11*11*11*7*7*7*5*5*3);
|
||||
assert_eq!(prod, 11*11*11*11*7*7*7*5*5*3*1);
|
||||
|
||||
|
||||
// range and range_rev are symmetric.
|
||||
@ -74,7 +74,7 @@ pub fn main() {
|
||||
sum_up += i;
|
||||
}
|
||||
let mut sum_down = 0u;
|
||||
for uint_range_rev(29, 9) |i| {
|
||||
for uint_range_rev(30, 10) |i| {
|
||||
sum_down += i;
|
||||
}
|
||||
assert_eq!(sum_up, sum_down);
|
||||
@ -84,7 +84,7 @@ pub fn main() {
|
||||
sum_up += i;
|
||||
}
|
||||
let mut sum_down = 0;
|
||||
for int_range_rev(9, -21) |i| {
|
||||
for int_range_rev(10, -20) |i| {
|
||||
sum_down += i;
|
||||
}
|
||||
assert_eq!(sum_up, sum_down);
|
||||
@ -96,7 +96,7 @@ pub fn main() {
|
||||
}
|
||||
|
||||
for uint_range_rev(0, 1) |_| {
|
||||
// fail!("range should be empty when start-1 underflows");
|
||||
fail!("range should be empty when start-1 underflows");
|
||||
}
|
||||
|
||||
// range iterations do not wrap/underflow
|
||||
|
Loading…
x
Reference in New Issue
Block a user