From 02d8db5bfca3a43f978a7f13b192f2d592ba6b0b Mon Sep 17 00:00:00 2001 From: Alexis Beingessner Date: Wed, 24 Jun 2015 22:49:02 -0700 Subject: [PATCH] fix vec size_hint --- vec.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/vec.md b/vec.md index a2fecf8..9f7250c 100644 --- a/vec.md +++ b/vec.md @@ -496,7 +496,8 @@ impl Iterator for IntoIter { } fn size_hint(&self) -> (usize, Option) { - let len = self.end as usize - self.start as usize; + let len = (self.end as usize - self.start as usize) + / mem::size_of::(); (len, Some(len)) } } @@ -949,7 +950,10 @@ impl RawValIter { ``` Now we have a different bug. Instead of our iterators not running at all, our -iterators now run *forever*. We need to do the same trick in our iterator impls: +iterators now run *forever*. We need to do the same trick in our iterator impls. +Also, our size_hint computation code will divide by 0 for ZSTs. Since we'll +basically be treating the two pointers as if they point to bytes, we'll just +map size 0 to divide by 1. ``` impl Iterator for RawValIter { @@ -971,7 +975,9 @@ impl Iterator for RawValIter { } fn size_hint(&self) -> (usize, Option) { - let len = self.end as usize - self.start as usize; + let elem_size = mem::size_of::(); + let len = (self.end as usize - self.start as usize) + / if elem_size == 0 { 1 } else { elem_size }; (len, Some(len)) } } @@ -1018,6 +1024,10 @@ use std::mem; use std::ops::{Deref, DerefMut}; use std::marker::PhantomData; + + + + struct RawVec { ptr: Unique, cap: usize, @@ -1079,6 +1089,10 @@ impl Drop for RawVec { } } + + + + pub struct Vec { buf: RawVec, len: usize, @@ -1231,7 +1245,9 @@ impl Iterator for RawValIter { } fn size_hint(&self) -> (usize, Option) { - let len = self.end as usize - self.start as usize; + let elem_size = mem::size_of::(); + let len = (self.end as usize - self.start as usize) + / if elem_size == 0 { 1 } else { elem_size }; (len, Some(len)) } }