Skip to content

Commit 0fce6f0

Browse files
committed
Override size_hint for all Iterators and add ExactSizeIterator where applicable (#1734)
After #1697 I looked at all other Iterators from Bevy and added overrides for `size_hint` where it wasn't done. Also implemented `ExactSizeIterator` where applicable.
1 parent b060e16 commit 0fce6f0

File tree

8 files changed

+55
-0
lines changed

8 files changed

+55
-0
lines changed

crates/bevy_reflect/src/list.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,15 @@ impl<'a> Iterator for ListIter<'a> {
149149
self.index += 1;
150150
value
151151
}
152+
153+
fn size_hint(&self) -> (usize, Option<usize>) {
154+
let size = self.list.len();
155+
(size, Some(size))
156+
}
152157
}
153158

159+
impl<'a> ExactSizeIterator for ListIter<'a> {}
160+
154161
#[inline]
155162
pub fn list_apply<L: List>(a: &mut L, b: &dyn Reflect) {
156163
if let ReflectRef::List(list_value) = b.reflect_ref() {

crates/bevy_reflect/src/map.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,15 @@ impl<'a> Iterator for MapIter<'a> {
167167
self.index += 1;
168168
value
169169
}
170+
171+
fn size_hint(&self) -> (usize, Option<usize>) {
172+
let size = self.map.len();
173+
(size, Some(size))
174+
}
170175
}
171176

177+
impl<'a> ExactSizeIterator for MapIter<'a> {}
178+
172179
#[inline]
173180
pub fn map_partial_eq<M: Map>(a: &M, b: &dyn Reflect) -> Option<bool> {
174181
let map = if let ReflectRef::Map(map) = b.reflect_ref() {

crates/bevy_reflect/src/struct_trait.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,15 @@ impl<'a> Iterator for FieldIter<'a> {
3737
self.index += 1;
3838
value
3939
}
40+
41+
fn size_hint(&self) -> (usize, Option<usize>) {
42+
let size = self.struct_val.field_len();
43+
(size, Some(size))
44+
}
4045
}
4146

47+
impl<'a> ExactSizeIterator for FieldIter<'a> {}
48+
4249
pub trait GetField {
4350
fn get_field<T: Reflect>(&self, name: &str) -> Option<&T>;
4451
fn get_field_mut<T: Reflect>(&mut self, name: &str) -> Option<&mut T>;

crates/bevy_reflect/src/tuple.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,15 @@ impl<'a> Iterator for TupleFieldIter<'a> {
3232
self.index += 1;
3333
value
3434
}
35+
36+
fn size_hint(&self) -> (usize, Option<usize>) {
37+
let size = self.tuple.field_len();
38+
(size, Some(size))
39+
}
3540
}
3641

42+
impl<'a> ExactSizeIterator for TupleFieldIter<'a> {}
43+
3744
pub trait GetTupleField {
3845
fn get_field<T: Reflect>(&self, index: usize) -> Option<&T>;
3946
fn get_field_mut<T: Reflect>(&mut self, index: usize) -> Option<&mut T>;

crates/bevy_reflect/src/tuple_struct.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,15 @@ impl<'a> Iterator for TupleStructFieldIter<'a> {
3232
self.index += 1;
3333
value
3434
}
35+
36+
fn size_hint(&self) -> (usize, Option<usize>) {
37+
let size = self.tuple_struct.field_len();
38+
(size, Some(size))
39+
}
3540
}
3641

42+
impl<'a> ExactSizeIterator for TupleStructFieldIter<'a> {}
43+
3744
pub trait GetTupleStructField {
3845
fn get_field<T: Reflect>(&self, index: usize) -> Option<&T>;
3946
fn get_field_mut<T: Reflect>(&mut self, index: usize) -> Option<&mut T>;

crates/bevy_render/src/renderer/render_resource/render_resource.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,15 @@ impl<'a> Iterator for RenderResourceIterator<'a> {
118118
Some(render_resource)
119119
}
120120
}
121+
122+
fn size_hint(&self) -> (usize, Option<usize>) {
123+
let size = self.render_resources.render_resources_len();
124+
(size, Some(size))
125+
}
121126
}
122127

128+
impl<'a> ExactSizeIterator for RenderResourceIterator<'a> {}
129+
123130
#[macro_export]
124131
macro_rules! impl_render_resource_bytes {
125132
($ty:ident) => {

crates/bevy_render/src/shader/shader.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,17 @@ impl<'a> Iterator for ShaderStagesIterator<'a> {
228228
self.state += 1;
229229
ret
230230
}
231+
232+
fn size_hint(&self) -> (usize, Option<usize>) {
233+
if self.shader_stages.fragment.is_some() {
234+
return (2, Some(2));
235+
}
236+
(1, Some(1))
237+
}
231238
}
232239

240+
impl<'a> ExactSizeIterator for ShaderStagesIterator<'a> {}
241+
233242
impl ShaderStages {
234243
pub fn new(vertex_shader: Handle<Shader>) -> Self {
235244
ShaderStages {

crates/bevy_render/src/shader/shader_defs.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ impl<'a> Iterator for ShaderDefIterator<'a> {
4949
}
5050
}
5151
}
52+
53+
fn size_hint(&self) -> (usize, Option<usize>) {
54+
(0, Some(self.shader_defs.shader_defs_len()))
55+
}
5256
}
5357

5458
impl ShaderDef for bool {

0 commit comments

Comments
 (0)