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