diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2013-07-03 22:07:20 -0700 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2013-07-03 22:07:20 -0700 |
| commit | dd4f6bb2a2e0fe4f2f417b99301b44d12567c243 (patch) | |
| tree | dfa5907db6778091778954e643896429b922cc4c /src/libstd | |
| parent | 23da3802917f62308342b57649273943e40076d2 (diff) | |
| parent | 6ee8fee730b5a0ae20ee0968d87a1597908a62ba (diff) | |
| download | rust-dd4f6bb2a2e0fe4f2f417b99301b44d12567c243.tar.gz rust-dd4f6bb2a2e0fe4f2f417b99301b44d12567c243.zip | |
Merge pull request #7565 from Blei/fix-rev-size-hint
vec: Fix size_hint() of reverse iterators
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/vec.rs | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index fb9c47b4373..1014ff48b1d 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -2025,7 +2025,12 @@ macro_rules! iterator { #[inline] fn size_hint(&self) -> (Option<uint>, Option<uint>) { - let exact = Some(((self.end as uint) - (self.ptr as uint)) / size_of::<$elem>()); + let diff = if $step > 0 { + (self.end as uint) - (self.ptr as uint) + } else { + (self.ptr as uint) - (self.end as uint) + }; + let exact = Some(diff / size_of::<$elem>()); (exact, exact) } } @@ -2978,6 +2983,16 @@ mod tests { } #[test] + fn test_iter_size_hints() { + use iterator::*; + let mut xs = [1, 2, 5, 10, 11]; + assert_eq!(xs.iter().size_hint(), (Some(5), Some(5))); + assert_eq!(xs.rev_iter().size_hint(), (Some(5), Some(5))); + assert_eq!(xs.mut_iter().size_hint(), (Some(5), Some(5))); + assert_eq!(xs.mut_rev_iter().size_hint(), (Some(5), Some(5))); + } + + #[test] fn test_mut_iterator() { use iterator::*; let mut xs = [1, 2, 3, 4, 5]; |
