goud_engine/ecs/sparse_set/
iter.rs1use super::super::Entity;
8use super::core::SparseSet;
9
10#[derive(Debug)]
18pub struct SparseSetIter<'a, T> {
19 pub(super) dense: std::slice::Iter<'a, Entity>,
20 pub(super) values: std::slice::Iter<'a, T>,
21}
22
23impl<'a, T> Iterator for SparseSetIter<'a, T> {
24 type Item = (Entity, &'a T);
25
26 #[inline]
27 fn next(&mut self) -> Option<Self::Item> {
28 let entity = *self.dense.next()?;
29 let value = self.values.next()?;
30 Some((entity, value))
31 }
32
33 #[inline]
34 fn size_hint(&self) -> (usize, Option<usize>) {
35 self.dense.size_hint()
36 }
37}
38
39impl<T> ExactSizeIterator for SparseSetIter<'_, T> {
40 #[inline]
41 fn len(&self) -> usize {
42 self.dense.len()
43 }
44}
45
46impl<T> std::iter::FusedIterator for SparseSetIter<'_, T> {}
47
48#[derive(Debug)]
52pub struct SparseSetIterMut<'a, T> {
53 pub(super) dense: std::slice::Iter<'a, Entity>,
54 pub(super) values: std::slice::IterMut<'a, T>,
55}
56
57impl<'a, T> Iterator for SparseSetIterMut<'a, T> {
58 type Item = (Entity, &'a mut T);
59
60 #[inline]
61 fn next(&mut self) -> Option<Self::Item> {
62 let entity = *self.dense.next()?;
63 let value = self.values.next()?;
64 Some((entity, value))
65 }
66
67 #[inline]
68 fn size_hint(&self) -> (usize, Option<usize>) {
69 self.dense.size_hint()
70 }
71}
72
73impl<T> ExactSizeIterator for SparseSetIterMut<'_, T> {
74 #[inline]
75 fn len(&self) -> usize {
76 self.dense.len()
77 }
78}
79
80impl<T> std::iter::FusedIterator for SparseSetIterMut<'_, T> {}
81
82impl<'a, T> IntoIterator for &'a SparseSet<T> {
87 type Item = (Entity, &'a T);
88 type IntoIter = SparseSetIter<'a, T>;
89
90 fn into_iter(self) -> Self::IntoIter {
91 self.iter()
92 }
93}
94
95impl<'a, T> IntoIterator for &'a mut SparseSet<T> {
96 type Item = (Entity, &'a mut T);
97 type IntoIter = SparseSetIterMut<'a, T>;
98
99 fn into_iter(self) -> Self::IntoIter {
100 self.iter_mut()
101 }
102}