From 8964fcc5ac9cefcc55ea071142c3c81d623a52be Mon Sep 17 00:00:00 2001 From: Kevin Ballard Date: Tue, 6 Aug 2013 22:34:22 -0700 Subject: [PATCH] Implement DoubleEndedIterator on Range Range is now invertable as long as its element type conforms to Integer. Remove int::range_rev() et al in favor of range().invert(). --- src/libstd/iterator.rs | 35 ++++++++++++++++++++++--- src/libstd/num/int_macros.rs | 18 +------------ src/libstd/num/uint_macros.rs | 17 +----------- src/libstd/run.rs | 6 ++--- src/libstd/trie.rs | 26 +++++++++--------- src/test/bench/core-map.rs | 15 +++++------ src/test/run-fail/assert-eq-macro-fail | Bin 0 -> 104051 bytes src/test/run-pass/num-range-rev.rs | 4 +-- 8 files changed, 56 insertions(+), 65 deletions(-) create mode 100755 src/test/run-fail/assert-eq-macro-fail diff --git a/src/libstd/iterator.rs b/src/libstd/iterator.rs index 29f54bd10fba..d10a5541e41a 100644 --- a/src/libstd/iterator.rs +++ b/src/libstd/iterator.rs @@ -18,9 +18,9 @@ implementing the `Iterator` trait. */ use cmp; -use num::{Zero, One, Saturating}; +use num::{Zero, One, Integer, Saturating}; use option::{Option, Some, None}; -use ops::{Add, Mul}; +use ops::{Add, Mul, Sub}; use cmp::Ord; use clone::Clone; use uint; @@ -1531,7 +1531,7 @@ pub fn range + Ord + Clone + One>(start: A, stop: A) -> Range { Range{state: start, stop: stop, one: One::one()} } -impl + Ord + Clone + One> Iterator for Range { +impl + Ord + Clone> Iterator for Range { #[inline] fn next(&mut self) -> Option { if self.state < self.stop { @@ -1544,6 +1544,22 @@ impl + Ord + Clone + One> Iterator for Range { } } +impl + Integer + Ord + Clone> DoubleEndedIterator for Range { + #[inline] + fn next_back(&mut self) -> Option { + if self.stop > self.state { + // Integer doesn't technically define this rule, but we're going to assume that every + // Integer is reachable from every other one by adding or subtracting enough Ones. This + // seems like a reasonable-enough rule that every Integer should conform to, even if it + // can't be statically checked. + self.stop = self.stop - self.one; + Some(self.stop.clone()) + } else { + None + } + } +} + impl + Clone> Iterator for Counter { #[inline] fn next(&mut self) -> Option { @@ -2121,4 +2137,17 @@ mod tests { check_randacc_iter(xs.iter().cycle().take_(27), 27); check_randacc_iter(empty.iter().cycle(), 0); } + + #[test] + fn test_double_ended_range() { + assert_eq!(range(11i, 14).invert().collect::<~[int]>(), ~[13i, 12, 11]); + for _ in range(10i, 0).invert() { + fail!("unreachable"); + } + + assert_eq!(range(11u, 14).invert().collect::<~[uint]>(), ~[13u, 12, 11]); + for _ in range(10u, 0).invert() { + fail!("unreachable"); + } + } } diff --git a/src/libstd/num/int_macros.rs b/src/libstd/num/int_macros.rs index 9842a570d7ea..b692bedebfd5 100644 --- a/src/libstd/num/int_macros.rs +++ b/src/libstd/num/int_macros.rs @@ -124,14 +124,6 @@ pub fn range_step_inclusive(start: $T, last: $T, step: $T, it: &fn($T) -> bool) range_step_core(start, last, step, Closed, it) } - -#[inline] -/// Iterate over the range (`hi`..`lo`] -pub fn range_rev(hi: $T, lo: $T, it: &fn($T) -> bool) -> bool { - if hi == min_value { return true; } - range_step_inclusive(hi-1, lo, -1 as $T, it) -} - impl Num for $T {} #[cfg(not(test))] @@ -889,10 +881,6 @@ mod tests { fn test_ranges() { let mut l = ~[]; - do range_rev(14,11) |i| { - l.push(i); - true - }; do range_step(20,26,2) |i| { l.push(i); true @@ -917,8 +905,7 @@ mod tests { l.push(i); true }; - assert_eq!(l, ~[13,12,11, - 20,22,24, + assert_eq!(l, ~[20,22,24, 36,34,32, max_value-2, max_value-3,max_value-1, @@ -926,9 +913,6 @@ mod tests { min_value+3,min_value+1]); // None of the `fail`s should execute. - do range_rev(0,10) |_i| { - fail!(~"unreachable"); - }; do range_step(10,0,1) |_i| { fail!(~"unreachable"); }; diff --git a/src/libstd/num/uint_macros.rs b/src/libstd/num/uint_macros.rs index a2874c967039..29b8f29d87d3 100644 --- a/src/libstd/num/uint_macros.rs +++ b/src/libstd/num/uint_macros.rs @@ -125,13 +125,6 @@ pub fn range_step_inclusive(start: $T, last: $T, step: $T_SIGNED, it: &fn($T) -> range_step_core(start, last, step, Closed, it) } -#[inline] -/// Iterate over the range (`hi`..`lo`] -pub fn range_rev(hi: $T, lo: $T, it: &fn($T) -> bool) -> bool { - if hi == min_value { return true; } - range_step_inclusive(hi-1, lo, -1 as $T_SIGNED, it) -} - impl Num for $T {} #[cfg(not(test))] @@ -654,10 +647,6 @@ mod tests { pub fn test_ranges() { let mut l = ~[]; - do range_rev(14,11) |i| { - l.push(i); - true - }; do range_step(20,26,2) |i| { l.push(i); true @@ -683,8 +672,7 @@ mod tests { true }; - assert_eq!(l, ~[13,12,11, - 20,22,24, + assert_eq!(l, ~[20,22,24, 36,34,32, max_value-2, max_value-3,max_value-1, @@ -692,9 +680,6 @@ mod tests { min_value+3,min_value+1]); // None of the `fail`s should execute. - do range_rev(0,0) |_i| { - fail!("unreachable"); - }; do range_step(10,0,1) |_i| { fail!("unreachable"); }; diff --git a/src/libstd/run.rs b/src/libstd/run.rs index ef3d881c5fea..694aa672af7b 100644 --- a/src/libstd/run.rs +++ b/src/libstd/run.rs @@ -632,7 +632,6 @@ fn spawn_process_os(prog: &str, args: &[~str], use libc::funcs::posix88::unistd::{fork, dup2, close, chdir, execvp}; use libc::funcs::bsd44::getdtablesize; - use int; mod rustrt { use libc::c_void; @@ -665,10 +664,9 @@ fn spawn_process_os(prog: &str, args: &[~str], fail!("failure in dup3(err_fd, 2): %s", os::last_os_error()); } // close all other fds - do int::range_rev(getdtablesize() as int, 3) |fd| { + for fd in range(3, getdtablesize()).invert() { close(fd as c_int); - true - }; + } do with_dirp(dir) |dirp| { if !dirp.is_null() && chdir(dirp) == -1 { diff --git a/src/libstd/trie.rs b/src/libstd/trie.rs index a5efae542a1f..5ef5526e5162 100644 --- a/src/libstd/trie.rs +++ b/src/libstd/trie.rs @@ -282,13 +282,14 @@ impl TrieNode { } fn each_reverse<'a>(&'a self, f: &fn(&uint, &'a T) -> bool) -> bool { - do uint::range_rev(self.children.len(), 0) |idx| { - match self.children[idx] { - Internal(ref x) => x.each_reverse(|i,t| f(i,t)), - External(k, ref v) => f(&k, v), - Nothing => true + for elt in self.children.rev_iter() { + match *elt { + 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 => () } } + true } fn mutate_values<'a>(&'a mut self, f: &fn(&uint, &mut T) -> bool) -> bool { @@ -539,10 +540,9 @@ mod test_map { fn test_each_break() { let mut m = TrieMap::new(); - do uint::range_rev(uint::max_value, uint::max_value - 10000) |x| { + for x in range(uint::max_value - 10000, uint::max_value).invert() { m.insert(x, x / 2); - true - }; + } let mut n = uint::max_value - 10000; do m.each |k, v| { @@ -580,10 +580,9 @@ mod test_map { fn test_each_reverse_break() { let mut m = TrieMap::new(); - do uint::range_rev(uint::max_value, uint::max_value - 10000) |x| { + for x in range(uint::max_value - 10000, uint::max_value).invert() { m.insert(x, x / 2); - true - }; + } let mut n = uint::max_value - 1; do m.each_reverse |k, v| { @@ -634,10 +633,9 @@ mod test_map { let last = uint::max_value; let mut map = TrieMap::new(); - do uint::range_rev(last, first) |x| { + for x in range(first, last).invert() { map.insert(x, x / 2); - true - }; + } let mut i = 0; for (k, &v) in map.iter() { diff --git a/src/test/bench/core-map.rs b/src/test/bench/core-map.rs index cf160ca31c6f..6475012e0097 100644 --- a/src/test/bench/core-map.rs +++ b/src/test/bench/core-map.rs @@ -53,24 +53,21 @@ fn descending>(map: &mut M, n_keys: uint) { io::println(" Descending integers:"); do timed("insert") { - do uint::range_rev(n_keys, 0) |i| { + for i in range(0, n_keys).invert() { map.insert(i, i + 1); - true - }; + } } do timed("search") { - do uint::range_rev(n_keys, 0) |i| { + for i in range(0, n_keys).invert() { assert_eq!(map.find(&i).unwrap(), &(i + 1)); - true - }; + } } do timed("remove") { - do uint::range_rev(n_keys, 0) |i| { + for i in range(0, n_keys) { assert!(map.remove(&i)); - true - }; + } } } diff --git a/src/test/run-fail/assert-eq-macro-fail b/src/test/run-fail/assert-eq-macro-fail new file mode 100755 index 0000000000000000000000000000000000000000..2841756d4a0e10e1d852b1e651e62f7903f954ac GIT binary patch literal 104051 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 literal 0 HcmV?d00001 diff --git a/src/test/run-pass/num-range-rev.rs b/src/test/run-pass/num-range-rev.rs index 5eecbe7e03af..ea7d4a651f75 100644 --- a/src/test/run-pass/num-range-rev.rs +++ b/src/test/run-pass/num-range-rev.rs @@ -20,11 +20,11 @@ fn int_range(lo: int, hi: int, it: &fn(int) -> bool) -> bool { } fn uint_range_rev(hi: uint, lo: uint, it: &fn(uint) -> bool) -> bool { - uint::range_rev(hi, lo, it) + range(lo, hi).invert().advance(it) } fn int_range_rev(hi: int, lo: int, it: &fn(int) -> bool) -> bool { - int::range_rev(hi, lo, it) + range(lo, hi).invert().advance(it) } fn int_range_step(a: int, b: int, step: int, it: &fn(int) -> bool) -> bool {