about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2013-07-03 22:07:20 -0700
committerDaniel Micay <danielmicay@gmail.com>2013-07-03 22:07:20 -0700
commitdd4f6bb2a2e0fe4f2f417b99301b44d12567c243 (patch)
treedfa5907db6778091778954e643896429b922cc4c /src/libstd
parent23da3802917f62308342b57649273943e40076d2 (diff)
parent6ee8fee730b5a0ae20ee0968d87a1597908a62ba (diff)
downloadrust-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.rs17
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];