Skip to main content

cranelift_entity/
map.rs

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