Skip to main content

goud_engine/ecs/sparse_set/
iter.rs

1//! Iterator types for [`SparseSet`].
2//!
3//! Provides immutable and mutable iterators over `(Entity, &T)` and
4//! `(Entity, &mut T)` pairs, as well as `IntoIterator` implementations
5//! for `&SparseSet<T>` and `&mut SparseSet<T>`.
6
7use super::super::Entity;
8use super::core::SparseSet;
9
10// =============================================================================
11// Iterator Types
12// =============================================================================
13
14/// An iterator over `(Entity, &T)` pairs in a sparse set.
15///
16/// Created by [`SparseSet::iter()`].
17#[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/// A mutable iterator over `(Entity, &mut T)` pairs in a sparse set.
49///
50/// Created by [`SparseSet::iter_mut()`].
51#[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
82// =============================================================================
83// IntoIterator Implementations
84// =============================================================================
85
86impl<'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}