xref: /wasmtime-44.0.1/cranelift/entity/src/map.rs (revision e4e9cabe)
1 //! Densely numbered entity references as mapping keys.
2 
3 use crate::EntityRef;
4 use crate::iter::{Iter, IterMut};
5 use crate::keys::Keys;
6 use alloc::vec::Vec;
7 use core::cmp::min;
8 use core::fmt;
9 use core::marker::PhantomData;
10 use core::ops::{Index, IndexMut};
11 use core::slice;
12 #[cfg(feature = "enable-serde")]
13 use serde::{
14     Deserialize, Serialize,
15     de::{Deserializer, SeqAccess, Visitor},
16     ser::{SerializeSeq, Serializer},
17 };
18 
19 /// A mapping `K -> V` for densely indexed entity references.
20 ///
21 /// The `SecondaryMap` data structure uses the dense index space to implement a map with a vector.
22 /// Unlike `PrimaryMap`, an `SecondaryMap` can't be used to allocate entity references. It is used
23 /// to associate secondary information with entities.
24 ///
25 /// The map does not track if an entry for a key has been inserted or not. Instead it behaves as if
26 /// all keys have a default entry from the beginning.
27 #[derive(Clone, Hash)]
28 pub struct SecondaryMap<K, V>
29 where
30     K: EntityRef,
31     V: Clone,
32 {
33     elems: Vec<V>,
34     default: V,
35     unused: PhantomData<K>,
36 }
37 
38 /// Shared `SecondaryMap` implementation for all value types.
39 impl<K, V> SecondaryMap<K, V>
40 where
41     K: EntityRef,
42     V: Clone,
43 {
44     /// Create a new empty map.
45     pub fn new() -> Self
46     where
47         V: Default,
48     {
49         Self {
50             elems: Vec::new(),
51             default: Default::default(),
52             unused: PhantomData,
53         }
54     }
55 
56     /// Create a new, empty map with the specified capacity.
57     ///
58     /// The map will be able to hold exactly `capacity` elements without reallocating.
59     pub fn with_capacity(capacity: usize) -> Self
60     where
61         V: Default,
62     {
63         Self {
64             elems: Vec::with_capacity(capacity),
65             default: Default::default(),
66             unused: PhantomData,
67         }
68     }
69 
70     /// Create a new empty map with a specified default value.
71     ///
72     /// This constructor does not require V to implement Default.
73     pub fn with_default(default: V) -> Self {
74         Self {
75             elems: Vec::new(),
76             default,
77             unused: PhantomData,
78         }
79     }
80 
81     /// Returns the number of elements the map can hold without reallocating.
82     pub fn capacity(&self) -> usize {
83         self.elems.capacity()
84     }
85 
86     /// Get the element at `k` if it exists.
87     #[inline(always)]
88     pub fn get(&self, k: K) -> Option<&V> {
89         self.elems.get(k.index())
90     }
91 
92     /// Is this map completely empty?
93     #[inline(always)]
94     pub fn is_empty(&self) -> bool {
95         self.elems.is_empty()
96     }
97 
98     /// Remove all entries from this map.
99     #[inline(always)]
100     pub fn clear(&mut self) {
101         self.elems.clear()
102     }
103 
104     /// Iterate over all the keys and values in this map.
105     pub fn iter(&self) -> Iter<'_, K, V> {
106         Iter::new(self.elems.iter())
107     }
108 
109     /// Iterate over all the keys and values in this map, mutable edition.
110     pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
111         IterMut::new(self.elems.iter_mut())
112     }
113 
114     /// Iterate over all the keys in this map.
115     pub fn keys(&self) -> Keys<K> {
116         Keys::with_len(self.elems.len())
117     }
118 
119     /// Iterate over all the values in this map.
120     pub fn values(&self) -> slice::Iter<'_, V> {
121         self.elems.iter()
122     }
123 
124     /// Iterate over all the values in this map, mutable edition.
125     pub fn values_mut(&mut self) -> slice::IterMut<'_, V> {
126         self.elems.iter_mut()
127     }
128 
129     /// Resize the map to have `n` entries by adding default entries as needed.
130     pub fn resize(&mut self, n: usize) {
131         self.elems.resize(n, self.default.clone());
132     }
133 
134     /// Slow path for `index_mut` which resizes the vector.
135     #[cold]
136     fn resize_for_index_mut(&mut self, i: usize) -> &mut V {
137         self.elems.resize(i + 1, self.default.clone());
138         &mut self.elems[i]
139     }
140 }
141 
142 impl<K, V> Default for SecondaryMap<K, V>
143 where
144     K: EntityRef,
145     V: Clone + Default,
146 {
147     fn default() -> SecondaryMap<K, V> {
148         SecondaryMap::new()
149     }
150 }
151 
152 impl<K, V> FromIterator<(K, V)> for SecondaryMap<K, V>
153 where
154     K: EntityRef,
155     V: Clone + Default,
156 {
157     fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
158         let iter = iter.into_iter();
159         let (min, max) = iter.size_hint();
160         let cap = max.unwrap_or_else(|| 2 * min);
161         let mut map = Self::with_capacity(cap);
162         for (k, v) in iter {
163             map[k] = v;
164         }
165         map
166     }
167 }
168 
169 /// Immutable indexing into an `SecondaryMap`.
170 ///
171 /// All keys are permitted. Untouched entries have the default value.
172 impl<K, V> Index<K> for SecondaryMap<K, V>
173 where
174     K: EntityRef,
175     V: Clone,
176 {
177     type Output = V;
178 
179     #[inline(always)]
180     fn index(&self, k: K) -> &V {
181         self.elems.get(k.index()).unwrap_or(&self.default)
182     }
183 }
184 
185 /// Mutable indexing into an `SecondaryMap`.
186 ///
187 /// The map grows as needed to accommodate new keys.
188 impl<K, V> IndexMut<K> for SecondaryMap<K, V>
189 where
190     K: EntityRef,
191     V: Clone,
192 {
193     #[inline(always)]
194     fn index_mut(&mut self, k: K) -> &mut V {
195         let i = k.index();
196         if i >= self.elems.len() {
197             return self.resize_for_index_mut(i);
198         }
199         &mut self.elems[i]
200     }
201 }
202 
203 impl<K, V> PartialEq for SecondaryMap<K, V>
204 where
205     K: EntityRef,
206     V: Clone + PartialEq,
207 {
208     fn eq(&self, other: &Self) -> bool {
209         let min_size = min(self.elems.len(), other.elems.len());
210         self.default == other.default
211             && self.elems[..min_size] == other.elems[..min_size]
212             && self.elems[min_size..].iter().all(|e| *e == self.default)
213             && other.elems[min_size..].iter().all(|e| *e == other.default)
214     }
215 }
216 
217 impl<K, V> Eq for SecondaryMap<K, V>
218 where
219     K: EntityRef,
220     V: Clone + PartialEq + Eq,
221 {
222 }
223 
224 #[cfg(feature = "enable-serde")]
225 impl<K, V> Serialize for SecondaryMap<K, V>
226 where
227     K: EntityRef,
228     V: Clone + PartialEq + Serialize,
229 {
230     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
231     where
232         S: Serializer,
233     {
234         // TODO: bincode encodes option as "byte for Some/None" and then optionally the content
235         // TODO: we can actually optimize it by encoding manually bitmask, then elements
236         let mut elems_cnt = self.elems.len();
237         while elems_cnt > 0 && self.elems[elems_cnt - 1] == self.default {
238             elems_cnt -= 1;
239         }
240         let mut seq = serializer.serialize_seq(Some(1 + elems_cnt))?;
241         seq.serialize_element(&Some(self.default.clone()))?;
242         for e in self.elems.iter().take(elems_cnt) {
243             let some_e = Some(e);
244             seq.serialize_element(if *e == self.default { &None } else { &some_e })?;
245         }
246         seq.end()
247     }
248 }
249 
250 #[cfg(feature = "enable-serde")]
251 impl<'de, K, V> Deserialize<'de> for SecondaryMap<K, V>
252 where
253     K: EntityRef,
254     V: Clone + Deserialize<'de>,
255 {
256     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
257     where
258         D: Deserializer<'de>,
259     {
260         use alloc::fmt;
261         struct SecondaryMapVisitor<K, V> {
262             unused: PhantomData<fn(K) -> V>,
263         }
264 
265         impl<'de, K, V> Visitor<'de> for SecondaryMapVisitor<K, V>
266         where
267             K: EntityRef,
268             V: Clone + Deserialize<'de>,
269         {
270             type Value = SecondaryMap<K, V>;
271 
272             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
273                 formatter.write_str("struct SecondaryMap")
274             }
275 
276             fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
277             where
278                 A: SeqAccess<'de>,
279             {
280                 match seq.next_element()? {
281                     Some(Some(default_val)) => {
282                         let default_val: V = default_val; // compiler can't infer the type
283                         let mut m = SecondaryMap::with_default(default_val.clone());
284                         let mut idx = 0;
285                         while let Some(val) = seq.next_element()? {
286                             let val: Option<_> = val; // compiler can't infer the type
287                             m[K::new(idx)] = val.unwrap_or_else(|| default_val.clone());
288                             idx += 1;
289                         }
290                         Ok(m)
291                     }
292                     _ => Err(serde::de::Error::custom("Default value required")),
293                 }
294             }
295         }
296 
297         deserializer.deserialize_seq(SecondaryMapVisitor {
298             unused: PhantomData {},
299         })
300     }
301 }
302 
303 impl<K: EntityRef + fmt::Debug, V: fmt::Debug + Clone> fmt::Debug for SecondaryMap<K, V> {
304     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
305         f.debug_struct("SecondaryMap")
306             .field("elems", &self.elems)
307             .field("default", &self.default)
308             .finish()
309     }
310 }
311 
312 #[cfg(test)]
313 mod tests {
314     use super::*;
315 
316     // `EntityRef` impl for testing.
317     #[derive(Clone, Copy, Debug, PartialEq, Eq)]
318     struct E(u32);
319 
320     impl EntityRef for E {
321         fn new(i: usize) -> Self {
322             E(i as u32)
323         }
324         fn index(self) -> usize {
325             self.0 as usize
326         }
327     }
328 
329     #[test]
330     fn basic() {
331         let r0 = E(0);
332         let r1 = E(1);
333         let r2 = E(2);
334         let mut m = SecondaryMap::new();
335 
336         let v: Vec<E> = m.keys().collect();
337         assert_eq!(v, []);
338 
339         m[r2] = 3;
340         m[r1] = 5;
341 
342         assert_eq!(m[r1], 5);
343         assert_eq!(m[r2], 3);
344 
345         let v: Vec<E> = m.keys().collect();
346         assert_eq!(v, [r0, r1, r2]);
347 
348         let shared = &m;
349         assert_eq!(shared[r0], 0);
350         assert_eq!(shared[r1], 5);
351         assert_eq!(shared[r2], 3);
352     }
353 }
354