cranelift_entity/
iter.rs

1//! A double-ended iterator over entity references and entities.
2
3use crate::EntityRef;
4use alloc::vec;
5use core::iter::Enumerate;
6use core::marker::PhantomData;
7use core::slice;
8
9/// Iterate over all keys in order.
10pub struct Iter<'a, K: EntityRef, V>
11where
12    V: 'a,
13{
14    enumerate: Enumerate<slice::Iter<'a, V>>,
15    unused: PhantomData<K>,
16}
17
18impl<'a, K: EntityRef, V> Iter<'a, K, V> {
19    /// Create an `Iter` iterator that visits the `PrimaryMap` keys and values
20    /// of `iter`.
21    pub fn new(iter: slice::Iter<'a, V>) -> Self {
22        Self {
23            enumerate: iter.enumerate(),
24            unused: PhantomData,
25        }
26    }
27}
28
29impl<'a, K: EntityRef, V> Iterator for Iter<'a, K, V> {
30    type Item = (K, &'a V);
31
32    fn next(&mut self) -> Option<Self::Item> {
33        self.enumerate.next().map(|(i, v)| (K::new(i), v))
34    }
35
36    fn size_hint(&self) -> (usize, Option<usize>) {
37        self.enumerate.size_hint()
38    }
39}
40
41impl<'a, K: EntityRef, V> DoubleEndedIterator for Iter<'a, K, V> {
42    fn next_back(&mut self) -> Option<Self::Item> {
43        self.enumerate.next_back().map(|(i, v)| (K::new(i), v))
44    }
45}
46
47impl<'a, K: EntityRef, V> ExactSizeIterator for Iter<'a, K, V> {}
48
49/// Iterate over all keys in order.
50pub struct IterMut<'a, K: EntityRef, V>
51where
52    V: 'a,
53{
54    enumerate: Enumerate<slice::IterMut<'a, V>>,
55    unused: PhantomData<K>,
56}
57
58impl<'a, K: EntityRef, V> IterMut<'a, K, V> {
59    /// Create an `IterMut` iterator that visits the `PrimaryMap` keys and values
60    /// of `iter`.
61    pub fn new(iter: slice::IterMut<'a, V>) -> Self {
62        Self {
63            enumerate: iter.enumerate(),
64            unused: PhantomData,
65        }
66    }
67}
68
69impl<'a, K: EntityRef, V> Iterator for IterMut<'a, K, V> {
70    type Item = (K, &'a mut V);
71
72    fn next(&mut self) -> Option<Self::Item> {
73        self.enumerate.next().map(|(i, v)| (K::new(i), v))
74    }
75
76    fn size_hint(&self) -> (usize, Option<usize>) {
77        self.enumerate.size_hint()
78    }
79}
80
81impl<'a, K: EntityRef, V> DoubleEndedIterator for IterMut<'a, K, V> {
82    fn next_back(&mut self) -> Option<Self::Item> {
83        self.enumerate.next_back().map(|(i, v)| (K::new(i), v))
84    }
85}
86
87impl<'a, K: EntityRef, V> ExactSizeIterator for IterMut<'a, K, V> {}
88
89/// Iterate over all keys in order.
90pub struct IntoIter<K: EntityRef, V> {
91    enumerate: Enumerate<vec::IntoIter<V>>,
92    unused: PhantomData<K>,
93}
94
95impl<K: EntityRef, V> IntoIter<K, V> {
96    /// Create an `IntoIter` iterator that visits the `PrimaryMap` keys and values
97    /// of `iter`.
98    pub fn new(iter: vec::IntoIter<V>) -> Self {
99        Self {
100            enumerate: iter.enumerate(),
101            unused: PhantomData,
102        }
103    }
104}
105
106impl<K: EntityRef, V> Iterator for IntoIter<K, V> {
107    type Item = (K, V);
108
109    fn next(&mut self) -> Option<Self::Item> {
110        self.enumerate.next().map(|(i, v)| (K::new(i), v))
111    }
112
113    fn size_hint(&self) -> (usize, Option<usize>) {
114        self.enumerate.size_hint()
115    }
116}
117
118impl<K: EntityRef, V> DoubleEndedIterator for IntoIter<K, V> {
119    fn next_back(&mut self) -> Option<Self::Item> {
120        self.enumerate.next_back().map(|(i, v)| (K::new(i), v))
121    }
122}
123
124impl<K: EntityRef, V> ExactSizeIterator for IntoIter<K, V> {}