@@ -496,7 +496,8 @@ impl<T> Iterator for IntoIter<T> {
496
496
}
497
497
498
498
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 >();
500
501
(len , Some (len ))
501
502
}
502
503
}
@@ -949,7 +950,10 @@ impl<T> RawValIter<T> {
949
950
```
950
951
951
952
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.
953
957
954
958
```
955
959
impl<T> Iterator for RawValIter<T> {
@@ -971,7 +975,9 @@ impl<T> Iterator for RawValIter<T> {
971
975
}
972
976
973
977
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 };
975
981
(len, Some(len))
976
982
}
977
983
}
@@ -1018,6 +1024,10 @@ use std::mem;
1018
1024
use std :: ops :: {Deref , DerefMut };
1019
1025
use std :: marker :: PhantomData ;
1020
1026
1027
+
1028
+
1029
+
1030
+
1021
1031
struct RawVec <T > {
1022
1032
ptr : Unique <T >,
1023
1033
cap : usize ,
@@ -1079,6 +1089,10 @@ impl<T> Drop for RawVec<T> {
1079
1089
}
1080
1090
}
1081
1091
1092
+
1093
+
1094
+
1095
+
1082
1096
pub struct Vec <T > {
1083
1097
buf : RawVec <T >,
1084
1098
len : usize ,
@@ -1231,7 +1245,9 @@ impl<T> Iterator for RawValIter<T> {
1231
1245
}
1232
1246
1233
1247
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 };
1235
1251
(len , Some (len ))
1236
1252
}
1237
1253
}
0 commit comments