Skip to content

Commit dd4f6bb

Browse files
committed
Merge pull request #7565 from Blei/fix-rev-size-hint
vec: Fix size_hint() of reverse iterators
2 parents 23da380 + 6ee8fee commit dd4f6bb

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
@@ -2025,7 +2025,12 @@ macro_rules! iterator {
20252025

20262026
#[inline]
20272027
fn size_hint(&self) -> (Option<uint>, Option<uint>) {
2028-
let exact = Some(((self.end as uint) - (self.ptr as uint)) / size_of::<$elem>());
2028+
let diff = if $step > 0 {
2029+
(self.end as uint) - (self.ptr as uint)
2030+
} else {
2031+
(self.ptr as uint) - (self.end as uint)
2032+
};
2033+
let exact = Some(diff / size_of::<$elem>());
20292034
(exact, exact)
20302035
}
20312036
}
@@ -2977,6 +2982,16 @@ mod tests {
29772982
assert!(it.next().is_none());
29782983
}
29792984

2985+
#[test]
2986+
fn test_iter_size_hints() {
2987+
use iterator::*;
2988+
let mut xs = [1, 2, 5, 10, 11];
2989+
assert_eq!(xs.iter().size_hint(), (Some(5), Some(5)));
2990+
assert_eq!(xs.rev_iter().size_hint(), (Some(5), Some(5)));
2991+
assert_eq!(xs.mut_iter().size_hint(), (Some(5), Some(5)));
2992+
assert_eq!(xs.mut_rev_iter().size_hint(), (Some(5), Some(5)));
2993+
}
2994+
29802995
#[test]
29812996
fn test_mut_iterator() {
29822997
use iterator::*;

0 commit comments

Comments
 (0)