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 29f54bd10fb..d10a5541e41 100644 --- a/src/libstd/iterator.rs +++ b/src/libstd/iterator.rs @@ -18,9 +18,9 @@ */ 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 @@ fn next(&mut self) -> Option { } } +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 @@ fn test_random_access_cycle() { 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 9842a570d7e..b692bedebfd 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 @@ fn test_int_from_str_overflow() { 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 @@ fn test_ranges() { 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 @@ fn test_ranges() { 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 a2874c96703..29b8f29d87d 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 @@ pub fn to_str_radix37() { 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 @@ pub fn test_ranges() { 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 @@ pub fn test_ranges() { 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 ef3d881c5fe..694aa672af7 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 @@ mod rustrt { 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 a5efae542a1..5ef5526e516 100644 --- a/src/libstd/trie.rs +++ b/src/libstd/trie.rs @@ -282,13 +282,14 @@ fn each<'a>(&'a self, f: &fn(&uint, &'a T) -> bool) -> bool { } 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 @@ fn test_each() { 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 @@ fn test_each_reverse() { 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 @@ fn test_iteration() { 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 cf160ca31c6..6475012e009 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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 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 { -- 2.44.0