Skip to content

Commit 6ee8fee

Browse files
committed
vec: Fix size_hint() of reverse iterators
Fixes #7558
1 parent 025dc6e commit 6ee8fee

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

src/libstd/vec.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2125,7 +2125,12 @@ macro_rules! iterator {
21252125

21262126
#[inline]
21272127
fn size_hint(&self) -> (Option<uint>, Option<uint>) {
2128-
let exact = Some(((self.end as uint) - (self.ptr as uint)) / size_of::<$elem>());
2128+
let diff = if $step > 0 {
2129+
(self.end as uint) - (self.ptr as uint)
2130+
} else {
2131+
(self.ptr as uint) - (self.end as uint)
2132+
};
2133+
let exact = Some(diff / size_of::<$elem>());
21292134
(exact, exact)
21302135
}
21312136
}
@@ -3404,6 +3409,16 @@ mod tests {
34043409
assert!(it.next().is_none());
34053410
}
34063411

3412+
#[test]
3413+
fn test_iter_size_hints() {
3414+
use iterator::*;
3415+
let mut xs = [1, 2, 5, 10, 11];
3416+
assert_eq!(xs.iter().size_hint(), (Some(5), Some(5)));
3417+
assert_eq!(xs.rev_iter().size_hint(), (Some(5), Some(5)));
3418+
assert_eq!(xs.mut_iter().size_hint(), (Some(5), Some(5)));
3419+
assert_eq!(xs.mut_rev_iter().size_hint(), (Some(5), Some(5)));
3420+
}
3421+
34073422
#[test]
34083423
fn test_mut_iterator() {
34093424
use iterator::*;

0 commit comments

Comments
 (0)