1313#[ forbid( deprecated_pattern) ] ;
1414
1515use T = self :: inst:: T ;
16+ use T_SIGNED = self :: inst:: T_SIGNED ;
1617
1718use char;
1819use cmp:: { Eq , Ord } ;
@@ -72,50 +73,36 @@ pub pure fn is_nonnegative(x: T) -> bool { x >= 0 as T }
7273/**
7374 * Iterate over the range [`start`,`start`+`step`..`stop`)
7475 *
75- * Note that `uint` requires separate `range_step` functions for each
76- * direction.
77- *
7876 */
79- pub pure fn range_step_up ( start : T , stop : T , step : T , it : fn ( T ) -> bool ) {
77+ pub pure fn range_step ( start : T , stop : T , step : T_SIGNED , it : fn ( T ) -> bool ) {
8078 let mut i = start;
8179 if step == 0 {
82- fail ~"range_step_up called with step == 0 ";
83- }
84- while i < stop {
85- if !it ( i) { break }
86- i += step;
80+ fail ~"range_step called with step == 0 ";
8781 }
88- }
89-
90- #[ inline( always) ]
91- /**
92- * Iterate over the range [`start`,`start`-`step`..`stop`)
93- *
94- * Note that `uint` requires separate `range_step` functions for each
95- * direction.
96- *
97- */
98- pub pure fn range_step_down ( start : T , stop : T , step : T , it : fn ( T ) -> bool ) {
99- let mut i = start;
100- if step == 0 {
101- fail ~"range_step_down called with step == 0 ";
82+ if step >= 0 {
83+ while i < stop {
84+ if !it ( i) { break }
85+ i += step as T ;
86+ }
10287 }
103- while i > stop {
104- if !it ( i) { break }
105- i -= step;
88+ else {
89+ while i > stop {
90+ if !it ( i) { break }
91+ i -= -step as T ;
92+ }
10693 }
10794}
10895
10996#[ inline( always) ]
11097/// Iterate over the range [`lo`..`hi`)
11198pub pure fn range ( lo : T , hi : T , it : fn ( T ) -> bool ) {
112- range_step_up ( lo, hi, 1 as T , it) ;
99+ range_step ( lo, hi, 1 as T_SIGNED , it) ;
113100}
114101
115102#[ inline( always) ]
116103/// Iterate over the range [`hi`..`lo`)
117104pub pure fn range_rev ( hi : T , lo : T , it : fn ( T ) -> bool ) {
118- range_step_down ( hi, lo, 1 as T , it) ;
105+ range_step ( hi, lo, - 1 as T_SIGNED , it) ;
119106}
120107
121108/// Computes the bitwise complement
@@ -381,10 +368,10 @@ pub fn test_ranges() {
381368 for range_rev( 13 , 10 ) |i| {
382369 l. push ( i) ;
383370 }
384- for range_step_up ( 20 , 26 , 2 ) |i| {
371+ for range_step ( 20 , 26 , 2 ) |i| {
385372 l. push ( i) ;
386373 }
387- for range_step_down ( 36 , 30 , 2 ) |i| {
374+ for range_step ( 36 , 30 , - 2 ) |i| {
388375 l. push ( i) ;
389376 }
390377
@@ -400,21 +387,21 @@ pub fn test_ranges() {
400387 for range_rev( 0 , 0 ) |_i| {
401388 fail ~"unreachable";
402389 }
403- for range_step_up ( 10 , 0 , 1 ) |_i| {
390+ for range_step ( 10 , 0 , 1 ) |_i| {
404391 fail ~"unreachable";
405392 }
406- for range_step_down ( 0 , 10 , 1 ) |_i| {
393+ for range_step ( 0 , 1 , - 10 ) |_i| {
407394 fail ~"unreachable";
408395 }
409396}
410397
411398#[ test]
412399#[ should_fail]
413- fn test_range_step_up_zero_step ( ) {
414- for range_step_up ( 0 , 10 , 0 ) |_i| { }
400+ fn test_range_step_zero_step_up ( ) {
401+ for range_step ( 0 , 10 , 0 ) |_i| { }
415402}
416403#[ test]
417404#[ should_fail]
418- fn test_range_step_down_zero_step ( ) {
419- for range_step_down ( 0 , 10 , 0 ) |_i| { }
405+ fn test_range_step_zero_step_down ( ) {
406+ for range_step ( 0 , - 10 , 0 ) |_i| { }
420407}
0 commit comments