@@ -18,7 +18,7 @@ implementing the `Iterator` trait.
18
18
*/
19
19
20
20
use cmp;
21
- use num:: { Zero , One , Integer , Saturating } ;
21
+ use num:: { Zero , One , Integer , CheckedAdd , Saturating } ;
22
22
use option:: { Option , Some , None } ;
23
23
use ops:: { Add , Mul , Sub } ;
24
24
use cmp:: Ord ;
@@ -817,7 +817,7 @@ impl<A, T: Iterator<A>, U: Iterator<A>> Iterator<A> for Chain<T, U> {
817
817
let lower = a_lower. saturating_add ( b_lower) ;
818
818
819
819
let upper = match ( a_upper, b_upper) {
820
- ( Some ( x) , Some ( y) ) => Some ( x . saturating_add ( y ) ) ,
820
+ ( Some ( x) , Some ( y) ) => x . checked_add ( & y ) ,
821
821
_ => None
822
822
} ;
823
823
@@ -1094,22 +1094,34 @@ impl<A, T: Iterator<A>> Iterator<A> for Peekable<A, T> {
1094
1094
if self . peeked . is_some ( ) { self . peeked . take ( ) }
1095
1095
else { self . iter . next ( ) }
1096
1096
}
1097
+
1098
+ #[ inline]
1099
+ fn size_hint ( & self ) -> ( uint , Option < uint > ) {
1100
+ let ( lo, hi) = self . iter . size_hint ( ) ;
1101
+ if self . peeked . is_some ( ) {
1102
+ let lo = lo. saturating_add ( 1 ) ;
1103
+ let hi = match hi {
1104
+ Some ( x) => x. checked_add ( & 1 ) ,
1105
+ None => None
1106
+ } ;
1107
+ ( lo, hi)
1108
+ } else {
1109
+ ( lo, hi)
1110
+ }
1111
+ }
1097
1112
}
1098
1113
1099
1114
impl < ' self , A , T : Iterator < A > > Peekable < A , T > {
1100
1115
/// Return a reference to the next element of the iterator with out advancing it,
1101
1116
/// or None if the iterator is exhausted.
1102
1117
#[ inline]
1103
1118
pub fn peek ( & ' self mut self ) -> Option < & ' self A > {
1119
+ if self . peeked . is_none ( ) {
1120
+ self . peeked = self . iter . next ( ) ;
1121
+ }
1104
1122
match self . peeked {
1105
1123
Some ( ref value) => Some ( value) ,
1106
- None => {
1107
- self . peeked = self . iter . next ( ) ;
1108
- match self . peeked {
1109
- Some ( ref value) => Some ( value) ,
1110
- None => None ,
1111
- }
1112
- } ,
1124
+ None => None ,
1113
1125
}
1114
1126
}
1115
1127
}
@@ -1355,7 +1367,7 @@ impl<'self, A, T: Iterator<A>, B, U: Iterator<B>> Iterator<B> for
1355
1367
let ( blo, bhi) = self . backiter . map_default ( ( 0 , Some ( 0 ) ) , |it| it. size_hint ( ) ) ;
1356
1368
let lo = flo. saturating_add ( blo) ;
1357
1369
match ( self . iter . size_hint ( ) , fhi, bhi) {
1358
- ( ( 0 , Some ( 0 ) ) , Some ( a) , Some ( b) ) => ( lo, Some ( a . saturating_add ( b ) ) ) ,
1370
+ ( ( 0 , Some ( 0 ) ) , Some ( a) , Some ( b) ) => ( lo, a . checked_add ( & b ) ) ,
1359
1371
_ => ( lo, None )
1360
1372
}
1361
1373
}
@@ -1461,6 +1473,12 @@ impl<'self, A, St> Iterator<A> for Unfoldr<'self, A, St> {
1461
1473
fn next ( & mut self ) -> Option < A > {
1462
1474
( self . f ) ( & mut self . state )
1463
1475
}
1476
+
1477
+ #[ inline]
1478
+ fn size_hint ( & self ) -> ( uint , Option < uint > ) {
1479
+ // no possible known bounds at this point
1480
+ ( 0 , None )
1481
+ }
1464
1482
}
1465
1483
1466
1484
/// An infinite iterator starting at `start` and advancing by `step` with each
@@ -1504,6 +1522,9 @@ impl<A: Add<A, A> + Ord + Clone> Iterator<A> for Range<A> {
1504
1522
None
1505
1523
}
1506
1524
}
1525
+
1526
+ // FIXME: #8606 Implement size_hint() on Range
1527
+ // Blocked on #8605 Need numeric trait for converting to `Option<uint>`
1507
1528
}
1508
1529
1509
1530
impl < A : Sub < A , A > + Integer + Ord + Clone > DoubleEndedIterator < A > for Range < A > {
0 commit comments