Skip to main content

safe_bump/
iter.rs

1use crate::Idx;
2
3/// Iterator yielding `(Idx<T>, &T)` pairs in allocation order.
4///
5/// Created by [`Arena::iter_indexed`](crate::Arena::iter_indexed).
6pub struct IterIndexed<'a, T> {
7    inner: std::iter::Enumerate<std::slice::Iter<'a, T>>,
8}
9
10impl<'a, T> IterIndexed<'a, T> {
11    /// Creates a new indexed iterator from an enumerated slice iterator.
12    #[must_use]
13    pub const fn new(inner: std::iter::Enumerate<std::slice::Iter<'a, T>>) -> Self {
14        Self { inner }
15    }
16}
17
18impl<'a, T> Iterator for IterIndexed<'a, T> {
19    type Item = (Idx<T>, &'a T);
20
21    fn next(&mut self) -> Option<Self::Item> {
22        self.inner.next().map(|(i, v)| (Idx::from_raw(i), v))
23    }
24
25    fn size_hint(&self) -> (usize, Option<usize>) {
26        self.inner.size_hint()
27    }
28}
29
30impl<T> ExactSizeIterator for IterIndexed<'_, T> {}
31
32/// Mutable iterator yielding `(Idx<T>, &mut T)` pairs in allocation order.
33///
34/// Created by [`Arena::iter_indexed_mut`](crate::Arena::iter_indexed_mut).
35pub struct IterIndexedMut<'a, T> {
36    inner: std::iter::Enumerate<std::slice::IterMut<'a, T>>,
37}
38
39impl<'a, T> IterIndexedMut<'a, T> {
40    /// Creates a new mutable indexed iterator from an enumerated slice
41    /// iterator.
42    #[must_use]
43    pub const fn new(inner: std::iter::Enumerate<std::slice::IterMut<'a, T>>) -> Self {
44        Self { inner }
45    }
46}
47
48impl<'a, T> Iterator for IterIndexedMut<'a, T> {
49    type Item = (Idx<T>, &'a mut T);
50
51    fn next(&mut self) -> Option<Self::Item> {
52        self.inner.next().map(|(i, v)| (Idx::from_raw(i), v))
53    }
54
55    fn size_hint(&self) -> (usize, Option<usize>) {
56        self.inner.size_hint()
57    }
58}
59
60impl<T> ExactSizeIterator for IterIndexedMut<'_, T> {}