From 6ee8fee730b5a0ae20ee0968d87a1597908a62ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Br=C3=BCschweiler?= Date: Wed, 3 Jul 2013 14:56:26 +0200 Subject: [PATCH] vec: Fix size_hint() of reverse iterators Fixes #7558 --- src/libstd/vec.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index 02eadaed5e893..f12e00bfa0a43 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -2125,7 +2125,12 @@ macro_rules! iterator { #[inline] fn size_hint(&self) -> (Option, Option) { - 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) } } @@ -3404,6 +3409,16 @@ mod tests { assert!(it.next().is_none()); } + #[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::*;