@@ -18,9 +18,9 @@ implementing the `Iterator` trait.
18
18
*/
19
19
20
20
use cmp;
21
- use num:: { Zero , One , Saturating } ;
21
+ use num:: { Zero , One , Integer , Saturating } ;
22
22
use option:: { Option , Some , None } ;
23
- use ops:: { Add , Mul } ;
23
+ use ops:: { Add , Mul , Sub } ;
24
24
use cmp:: Ord ;
25
25
use clone:: Clone ;
26
26
use uint;
@@ -1531,7 +1531,7 @@ pub fn range<A: Add<A, A> + Ord + Clone + One>(start: A, stop: A) -> Range<A> {
1531
1531
Range { state : start, stop : stop, one : One :: one ( ) }
1532
1532
}
1533
1533
1534
- impl < A : Add < A , A > + Ord + Clone + One > Iterator < A > for Range < A > {
1534
+ impl < A : Add < A , A > + Ord + Clone > Iterator < A > for Range < A > {
1535
1535
#[ inline]
1536
1536
fn next ( & mut self ) -> Option < A > {
1537
1537
if self . state < self . stop {
@@ -1544,6 +1544,22 @@ impl<A: Add<A, A> + Ord + Clone + One> Iterator<A> for Range<A> {
1544
1544
}
1545
1545
}
1546
1546
1547
+ impl < A : Sub < A , A > + Integer + Ord + Clone > DoubleEndedIterator < A > for Range < A > {
1548
+ #[ inline]
1549
+ fn next_back ( & mut self ) -> Option < A > {
1550
+ if self . stop > self . state {
1551
+ // Integer doesn't technically define this rule, but we're going to assume that every
1552
+ // Integer is reachable from every other one by adding or subtracting enough Ones. This
1553
+ // seems like a reasonable-enough rule that every Integer should conform to, even if it
1554
+ // can't be statically checked.
1555
+ self . stop = self . stop - self . one ;
1556
+ Some ( self . stop . clone ( ) )
1557
+ } else {
1558
+ None
1559
+ }
1560
+ }
1561
+ }
1562
+
1547
1563
impl < A : Add < A , A > + Clone > Iterator < A > for Counter < A > {
1548
1564
#[ inline]
1549
1565
fn next ( & mut self ) -> Option < A > {
@@ -2121,4 +2137,17 @@ mod tests {
2121
2137
check_randacc_iter ( xs. iter ( ) . cycle ( ) . take_ ( 27 ) , 27 ) ;
2122
2138
check_randacc_iter ( empty. iter ( ) . cycle ( ) , 0 ) ;
2123
2139
}
2140
+
2141
+ #[ test]
2142
+ fn test_double_ended_range ( ) {
2143
+ assert_eq ! ( range( 11 i, 14 ) . invert( ) . collect:: <~[ int] >( ) , ~[ 13 i, 12 , 11 ] ) ;
2144
+ for _ in range ( 10 i, 0 ) . invert ( ) {
2145
+ fail ! ( "unreachable" ) ;
2146
+ }
2147
+
2148
+ assert_eq ! ( range( 11 u, 14 ) . invert( ) . collect:: <~[ uint] >( ) , ~[ 13 u, 12 , 11 ] ) ;
2149
+ for _ in range ( 10 u, 0 ) . invert ( ) {
2150
+ fail ! ( "unreachable" ) ;
2151
+ }
2152
+ }
2124
2153
}
0 commit comments