1use core::mem::MaybeUninit;
5
6use crate::map::KevyMap;
7
8pub struct Iter<'a, K, V> {
10 metadata: &'a [u8],
11 slots: &'a [MaybeUninit<(K, V)>],
12 pos: usize,
13}
14
15impl<'a, K, V> Iter<'a, K, V> {
16 pub(crate) fn new(metadata: &'a [u8], slots: &'a [MaybeUninit<(K, V)>]) -> Self {
23 let real_len = slots.len();
24 let metadata = &metadata[..real_len];
25 Self { metadata, slots, pos: 0 }
26 }
27
28 pub(crate) fn with_start(
33 metadata: &'a [u8],
34 slots: &'a [MaybeUninit<(K, V)>],
35 start: usize,
36 ) -> Self {
37 let real_len = slots.len();
38 let metadata = &metadata[..real_len];
39 Self { metadata, slots, pos: start.min(real_len) }
40 }
41}
42
43impl<'a, K, V> Iterator for Iter<'a, K, V> {
44 type Item = (&'a K, &'a V);
45 fn next(&mut self) -> Option<Self::Item> {
46 while self.pos < self.metadata.len() {
47 let i = self.pos;
48 self.pos += 1;
49 if self.metadata[i] & 0x80 == 0 {
50 let kv = unsafe { self.slots[i].assume_init_ref() };
53 return Some((&kv.0, &kv.1));
54 }
55 }
56 None
57 }
58}
59
60impl<'a, K, V> IntoIterator for &'a KevyMap<K, V> {
61 type Item = (&'a K, &'a V);
62 type IntoIter = Iter<'a, K, V>;
63 fn into_iter(self) -> Self::IntoIter {
64 self.iter()
65 }
66}
67
68pub struct IterMut<'a, K, V> {
71 metadata: &'a [u8],
72 slots: &'a mut [MaybeUninit<(K, V)>],
73 pos: usize,
74}
75
76impl<'a, K, V> IterMut<'a, K, V> {
77 pub(crate) fn new(metadata: &'a [u8], slots: &'a mut [MaybeUninit<(K, V)>]) -> Self {
80 let metadata = &metadata[..slots.len()];
81 Self { metadata, slots, pos: 0 }
82 }
83}
84
85impl<'a, K, V> Iterator for IterMut<'a, K, V> {
86 type Item = (&'a K, &'a mut V);
87 fn next(&mut self) -> Option<Self::Item> {
88 while self.pos < self.metadata.len() {
89 let i = self.pos;
90 self.pos += 1;
91 if self.metadata[i] & 0x80 == 0 {
92 let kv = unsafe { &mut *self.slots.as_mut_ptr().add(i).cast::<(K, V)>() };
96 return Some((&kv.0, &mut kv.1));
97 }
98 }
99 None
100 }
101}
102
103impl<'a, K, V> IntoIterator for &'a mut KevyMap<K, V> {
104 type Item = (&'a K, &'a mut V);
105 type IntoIter = IterMut<'a, K, V>;
106 fn into_iter(self) -> Self::IntoIter {
107 self.iter_mut()
108 }
109}
110
111pub struct Keys<'a, K, V>(Iter<'a, K, V>);
113
114impl<'a, K, V> Keys<'a, K, V> {
115 pub(crate) fn new(inner: Iter<'a, K, V>) -> Self {
116 Self(inner)
117 }
118}
119
120impl<'a, K, V> Iterator for Keys<'a, K, V> {
121 type Item = &'a K;
122 fn next(&mut self) -> Option<Self::Item> {
123 self.0.next().map(|(k, _)| k)
124 }
125}
126
127pub struct Values<'a, K, V>(Iter<'a, K, V>);
129
130impl<'a, K, V> Values<'a, K, V> {
131 pub(crate) fn new(inner: Iter<'a, K, V>) -> Self {
132 Self(inner)
133 }
134}
135
136impl<'a, K, V> Iterator for Values<'a, K, V> {
137 type Item = &'a V;
138 fn next(&mut self) -> Option<Self::Item> {
139 self.0.next().map(|(_, v)| v)
140 }
141}