Skip to content

Commit a9143a8

Browse files
committed
fix vec size_hint
1 parent fa6fff5 commit a9143a8

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

vec.md

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,8 @@ impl<T> Iterator for IntoIter<T> {
496496
}
497497

498498
fn size_hint(&self) -> (usize, Option<usize>) {
499-
let len = self.end as usize - self.start as usize;
499+
let len = (self.end as usize - self.start as usize)
500+
/ mem::size_of::<T>();
500501
(len, Some(len))
501502
}
502503
}
@@ -949,7 +950,10 @@ impl<T> RawValIter<T> {
949950
```
950951

951952
Now we have a different bug. Instead of our iterators not running at all, our
952-
iterators now run *forever*. We need to do the same trick in our iterator impls:
953+
iterators now run *forever*. We need to do the same trick in our iterator impls.
954+
Also, our size_hint computation code will divide by 0 for ZSTs. Since we'll
955+
basically be treating the two pointers as if they point to bytes, we'll just
956+
map size 0 to divide by 1.
953957

954958
```
955959
impl<T> Iterator for RawValIter<T> {
@@ -971,7 +975,9 @@ impl<T> Iterator for RawValIter<T> {
971975
}
972976
973977
fn size_hint(&self) -> (usize, Option<usize>) {
974-
let len = self.end as usize - self.start as usize;
978+
let elem_size = mem::size_of::<T>();
979+
let len = (self.end as usize - self.start as usize)
980+
/ if elem_size == 0 { 1 } else { elem_size };
975981
(len, Some(len))
976982
}
977983
}
@@ -1018,6 +1024,10 @@ use std::mem;
10181024
use std::ops::{Deref, DerefMut};
10191025
use std::marker::PhantomData;
10201026

1027+
1028+
1029+
1030+
10211031
struct RawVec<T> {
10221032
ptr: Unique<T>,
10231033
cap: usize,
@@ -1079,6 +1089,10 @@ impl<T> Drop for RawVec<T> {
10791089
}
10801090
}
10811091

1092+
1093+
1094+
1095+
10821096
pub struct Vec<T> {
10831097
buf: RawVec<T>,
10841098
len: usize,
@@ -1231,7 +1245,9 @@ impl<T> Iterator for RawValIter<T> {
12311245
}
12321246

12331247
fn size_hint(&self) -> (usize, Option<usize>) {
1234-
let len = self.end as usize - self.start as usize;
1248+
let elem_size = mem::size_of::<T>();
1249+
let len = (self.end as usize - self.start as usize)
1250+
/ if elem_size == 0 { 1 } else { elem_size };
12351251
(len, Some(len))
12361252
}
12371253
}

0 commit comments

Comments
 (0)