From db0a13b9865510ec07f7597e11009eabc2676afc Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Mon, 1 Jul 2013 12:30:14 +0200 Subject: [PATCH] Switch over to new range_rev semantics; fix #5270. --- src/libextra/smallintmap.rs | 4 ++-- src/libstd/num/int_macros.rs | 7 ++++--- src/libstd/num/uint_macros.rs | 7 ++++--- src/libstd/run.rs | 2 +- src/libstd/trie.rs | 2 +- src/test/run-pass/num-range-rev.rs | 18 +++++++++--------- 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/libextra/smallintmap.rs b/src/libextra/smallintmap.rs index d952374ee5c..329d3a454b4 100644 --- a/src/libextra/smallintmap.rs +++ b/src/libextra/smallintmap.rs @@ -159,8 +159,8 @@ impl SmallIntMap { /// 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 => () } } diff --git a/src/libstd/num/int_macros.rs b/src/libstd/num/int_macros.rs index 4fd30be80e6..cef32b5c7e4 100644 --- a/src/libstd/num/int_macros.rs +++ b/src/libstd/num/int_macros.rs @@ -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| { diff --git a/src/libstd/num/uint_macros.rs b/src/libstd/num/uint_macros.rs index 09397ecfd77..54c1327fa93 100644 --- a/src/libstd/num/uint_macros.rs +++ b/src/libstd/num/uint_macros.rs @@ -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| { diff --git a/src/libstd/run.rs b/src/libstd/run.rs index 17dc604a178..883870db1e6 100644 --- a/src/libstd/run.rs +++ b/src/libstd/run.rs @@ -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); } diff --git a/src/libstd/trie.rs b/src/libstd/trie.rs index 8ce02d59ab1..50552fd7547 100644 --- a/src/libstd/trie.rs +++ b/src/libstd/trie.rs @@ -261,7 +261,7 @@ impl TrieNode { 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 => () diff --git a/src/test/run-pass/num-range-rev.rs b/src/test/run-pass/num-range-rev.rs index e65c793a7b4..7262339e431 100644 --- a/src/test/run-pass/num-range-rev.rs +++ b/src/test/run-pass/num-range-rev.rs @@ -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