xref: /wasmtime-44.0.1/cranelift/entity/src/map.rs (revision 416691c8)
1747ad3c4Slazypassion //! Densely numbered entity references as mapping keys.
2747ad3c4Slazypassion 
390ac295eSAlex Crichton use crate::EntityRef;
4747ad3c4Slazypassion use crate::iter::{Iter, IterMut};
5747ad3c4Slazypassion use crate::keys::Keys;
6bb8fa40eSbjorn3 use alloc::vec::Vec;
7a1f6457eSJoshua Nelson use core::cmp::min;
818b42ef4SSimon Larsson use core::fmt;
9747ad3c4Slazypassion use core::marker::PhantomData;
10747ad3c4Slazypassion use core::ops::{Index, IndexMut};
11747ad3c4Slazypassion use core::slice;
12d3815a03SArtur Jamro #[cfg(feature = "enable-serde")]
13d3815a03SArtur Jamro use serde::{
1490ac295eSAlex Crichton     Deserialize, Serialize,
15d3815a03SArtur Jamro     de::{Deserializer, SeqAccess, Visitor},
16d3815a03SArtur Jamro     ser::{SerializeSeq, Serializer},
17d3815a03SArtur Jamro };
18813c44a4SNick Fitzgerald use wasmtime_core::{alloc::PanicOnOom as _, error::OutOfMemory};
19747ad3c4Slazypassion 
20747ad3c4Slazypassion /// A mapping `K -> V` for densely indexed entity references.
21747ad3c4Slazypassion ///
22747ad3c4Slazypassion /// The `SecondaryMap` data structure uses the dense index space to implement a map with a vector.
23747ad3c4Slazypassion /// Unlike `PrimaryMap`, an `SecondaryMap` can't be used to allocate entity references. It is used
24747ad3c4Slazypassion /// to associate secondary information with entities.
25747ad3c4Slazypassion ///
26747ad3c4Slazypassion /// The map does not track if an entry for a key has been inserted or not. Instead it behaves as if
27747ad3c4Slazypassion /// all keys have a default entry from the beginning.
2818b42ef4SSimon Larsson #[derive(Clone, Hash)]
29747ad3c4Slazypassion pub struct SecondaryMap<K, V>
30747ad3c4Slazypassion where
31747ad3c4Slazypassion     K: EntityRef,
32747ad3c4Slazypassion     V: Clone,
33747ad3c4Slazypassion {
34747ad3c4Slazypassion     elems: Vec<V>,
35747ad3c4Slazypassion     default: V,
36747ad3c4Slazypassion     unused: PhantomData<K>,
37747ad3c4Slazypassion }
38747ad3c4Slazypassion 
39747ad3c4Slazypassion /// Shared `SecondaryMap` implementation for all value types.
40747ad3c4Slazypassion impl<K, V> SecondaryMap<K, V>
41747ad3c4Slazypassion where
42747ad3c4Slazypassion     K: EntityRef,
43747ad3c4Slazypassion     V: Clone,
44747ad3c4Slazypassion {
45747ad3c4Slazypassion     /// Create a new empty map.
new() -> Self where V: Default,46747ad3c4Slazypassion     pub fn new() -> Self
47747ad3c4Slazypassion     where
48747ad3c4Slazypassion         V: Default,
49747ad3c4Slazypassion     {
50747ad3c4Slazypassion         Self {
51747ad3c4Slazypassion             elems: Vec::new(),
52747ad3c4Slazypassion             default: Default::default(),
53747ad3c4Slazypassion             unused: PhantomData,
54747ad3c4Slazypassion         }
55747ad3c4Slazypassion     }
56747ad3c4Slazypassion 
574b085b9cSSean Stangl     /// Create a new, empty map with the specified capacity.
584b085b9cSSean Stangl     ///
594b085b9cSSean Stangl     /// The map will be able to hold exactly `capacity` elements without reallocating.
with_capacity(capacity: usize) -> Self where V: Default,604b085b9cSSean Stangl     pub fn with_capacity(capacity: usize) -> Self
614b085b9cSSean Stangl     where
624b085b9cSSean Stangl         V: Default,
634b085b9cSSean Stangl     {
644b085b9cSSean Stangl         Self {
654b085b9cSSean Stangl             elems: Vec::with_capacity(capacity),
664b085b9cSSean Stangl             default: Default::default(),
674b085b9cSSean Stangl             unused: PhantomData,
684b085b9cSSean Stangl         }
694b085b9cSSean Stangl     }
704b085b9cSSean Stangl 
7163ecb815SNick Fitzgerald     /// Like `with_capacity` but returns an error on allocation failure.
try_with_capacity(capacity: usize) -> Result<Self, OutOfMemory> where V: Default,7263ecb815SNick Fitzgerald     pub fn try_with_capacity(capacity: usize) -> Result<Self, OutOfMemory>
7363ecb815SNick Fitzgerald     where
7463ecb815SNick Fitzgerald         V: Default,
7563ecb815SNick Fitzgerald     {
7663ecb815SNick Fitzgerald         let mut elems = Vec::new();
7763ecb815SNick Fitzgerald         elems
7863ecb815SNick Fitzgerald             .try_reserve(capacity)
7963ecb815SNick Fitzgerald             .map_err(|_| OutOfMemory::new(core::mem::size_of::<V>().saturating_mul(capacity)))?;
8063ecb815SNick Fitzgerald         Ok(Self {
8163ecb815SNick Fitzgerald             elems,
8263ecb815SNick Fitzgerald             default: Default::default(),
8363ecb815SNick Fitzgerald             unused: PhantomData,
8463ecb815SNick Fitzgerald         })
8563ecb815SNick Fitzgerald     }
8663ecb815SNick Fitzgerald 
87747ad3c4Slazypassion     /// Create a new empty map with a specified default value.
88747ad3c4Slazypassion     ///
89747ad3c4Slazypassion     /// This constructor does not require V to implement Default.
with_default(default: V) -> Self90747ad3c4Slazypassion     pub fn with_default(default: V) -> Self {
91747ad3c4Slazypassion         Self {
92747ad3c4Slazypassion             elems: Vec::new(),
93747ad3c4Slazypassion             default,
94747ad3c4Slazypassion             unused: PhantomData,
95747ad3c4Slazypassion         }
96747ad3c4Slazypassion     }
97747ad3c4Slazypassion 
984b085b9cSSean Stangl     /// Returns the number of elements the map can hold without reallocating.
capacity(&self) -> usize994b085b9cSSean Stangl     pub fn capacity(&self) -> usize {
1004b085b9cSSean Stangl         self.elems.capacity()
1014b085b9cSSean Stangl     }
1024b085b9cSSean Stangl 
103747ad3c4Slazypassion     /// Get the element at `k` if it exists.
10492a01c81Sjulian-seward1     #[inline(always)]
get(&self, k: K) -> Option<&V>105747ad3c4Slazypassion     pub fn get(&self, k: K) -> Option<&V> {
106747ad3c4Slazypassion         self.elems.get(k.index())
107747ad3c4Slazypassion     }
108747ad3c4Slazypassion 
10963ecb815SNick Fitzgerald     /// Get the element at `k` mutably, if it exists.
get_mut(&mut self, k: K) -> Option<&mut V>11063ecb815SNick Fitzgerald     pub fn get_mut(&mut self, k: K) -> Option<&mut V> {
11163ecb815SNick Fitzgerald         self.elems.get_mut(k.index())
11263ecb815SNick Fitzgerald     }
11363ecb815SNick Fitzgerald 
11463ecb815SNick Fitzgerald     /// Insert the given key-value pair, returning the old value if it exists.
insert(&mut self, k: K, v: V) -> Option<V>11563ecb815SNick Fitzgerald     pub fn insert(&mut self, k: K, v: V) -> Option<V> {
116813c44a4SNick Fitzgerald         self.try_insert(k, v).panic_on_oom()
11763ecb815SNick Fitzgerald     }
11863ecb815SNick Fitzgerald 
11963ecb815SNick Fitzgerald     /// Like `insert` but returns an error on allocation failure.
try_insert(&mut self, k: K, v: V) -> Result<Option<V>, OutOfMemory>12063ecb815SNick Fitzgerald     pub fn try_insert(&mut self, k: K, v: V) -> Result<Option<V>, OutOfMemory> {
12163ecb815SNick Fitzgerald         let i = k.index();
12263ecb815SNick Fitzgerald         if i < self.elems.len() {
12363ecb815SNick Fitzgerald             Ok(Some(core::mem::replace(&mut self.elems[i], v)))
12463ecb815SNick Fitzgerald         } else {
12563ecb815SNick Fitzgerald             self.try_resize(i + 1)?;
12663ecb815SNick Fitzgerald             self.elems[i] = v;
12763ecb815SNick Fitzgerald             Ok(None)
12863ecb815SNick Fitzgerald         }
12963ecb815SNick Fitzgerald     }
13063ecb815SNick Fitzgerald 
13119de564cSNick Fitzgerald     /// Remove the element at `k`, if it exists, replacing it with the default
13219de564cSNick Fitzgerald     /// value.
remove(&mut self, k: K) -> Option<V>13319de564cSNick Fitzgerald     pub fn remove(&mut self, k: K) -> Option<V> {
13419de564cSNick Fitzgerald         let i = k.index();
13519de564cSNick Fitzgerald         if i < self.elems.len() {
13619de564cSNick Fitzgerald             let default = self.default.clone();
13719de564cSNick Fitzgerald             Some(core::mem::replace(&mut self.elems[i], default))
13819de564cSNick Fitzgerald         } else {
13919de564cSNick Fitzgerald             None
14019de564cSNick Fitzgerald         }
14119de564cSNick Fitzgerald     }
14219de564cSNick Fitzgerald 
143747ad3c4Slazypassion     /// Is this map completely empty?
14492a01c81Sjulian-seward1     #[inline(always)]
is_empty(&self) -> bool145747ad3c4Slazypassion     pub fn is_empty(&self) -> bool {
146747ad3c4Slazypassion         self.elems.is_empty()
147747ad3c4Slazypassion     }
148747ad3c4Slazypassion 
149747ad3c4Slazypassion     /// Remove all entries from this map.
15092a01c81Sjulian-seward1     #[inline(always)]
clear(&mut self)151747ad3c4Slazypassion     pub fn clear(&mut self) {
152747ad3c4Slazypassion         self.elems.clear()
153747ad3c4Slazypassion     }
154747ad3c4Slazypassion 
155747ad3c4Slazypassion     /// Iterate over all the keys and values in this map.
iter(&self) -> Iter<'_, K, V>1568a42768fSAlex Crichton     pub fn iter(&self) -> Iter<'_, K, V> {
157747ad3c4Slazypassion         Iter::new(self.elems.iter())
158747ad3c4Slazypassion     }
159747ad3c4Slazypassion 
160747ad3c4Slazypassion     /// Iterate over all the keys and values in this map, mutable edition.
iter_mut(&mut self) -> IterMut<'_, K, V>1618a42768fSAlex Crichton     pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
162747ad3c4Slazypassion         IterMut::new(self.elems.iter_mut())
163747ad3c4Slazypassion     }
164747ad3c4Slazypassion 
165747ad3c4Slazypassion     /// Iterate over all the keys in this map.
keys(&self) -> Keys<K>166747ad3c4Slazypassion     pub fn keys(&self) -> Keys<K> {
167747ad3c4Slazypassion         Keys::with_len(self.elems.len())
168747ad3c4Slazypassion     }
169747ad3c4Slazypassion 
170747ad3c4Slazypassion     /// Iterate over all the values in this map.
values(&self) -> slice::Iter<'_, V>1718a42768fSAlex Crichton     pub fn values(&self) -> slice::Iter<'_, V> {
172747ad3c4Slazypassion         self.elems.iter()
173747ad3c4Slazypassion     }
174747ad3c4Slazypassion 
175747ad3c4Slazypassion     /// Iterate over all the values in this map, mutable edition.
values_mut(&mut self) -> slice::IterMut<'_, V>1768a42768fSAlex Crichton     pub fn values_mut(&mut self) -> slice::IterMut<'_, V> {
177747ad3c4Slazypassion         self.elems.iter_mut()
178747ad3c4Slazypassion     }
179747ad3c4Slazypassion 
180747ad3c4Slazypassion     /// Resize the map to have `n` entries by adding default entries as needed.
resize(&mut self, n: usize)181747ad3c4Slazypassion     pub fn resize(&mut self, n: usize) {
182747ad3c4Slazypassion         self.elems.resize(n, self.default.clone());
183747ad3c4Slazypassion     }
18476664fc7SAmanieu d'Antras 
18563ecb815SNick Fitzgerald     /// Like `resize` but returns an error on allocation failure.
try_resize(&mut self, n: usize) -> Result<(), OutOfMemory>18663ecb815SNick Fitzgerald     pub fn try_resize(&mut self, n: usize) -> Result<(), OutOfMemory> {
18763ecb815SNick Fitzgerald         if self.elems.capacity() < n {
18863ecb815SNick Fitzgerald             self.elems
18963ecb815SNick Fitzgerald                 .try_reserve(n - self.elems.len())
19063ecb815SNick Fitzgerald                 .map_err(|_| OutOfMemory::new(core::mem::size_of::<V>().saturating_mul(n)))?;
19163ecb815SNick Fitzgerald         }
19263ecb815SNick Fitzgerald         debug_assert!(self.elems.capacity() >= n);
19363ecb815SNick Fitzgerald         self.elems.resize(n, self.default.clone());
19463ecb815SNick Fitzgerald         Ok(())
19563ecb815SNick Fitzgerald     }
19663ecb815SNick Fitzgerald 
197*416691c8SNick Fitzgerald     /// Get this map's underlying values as a slice.
as_values_slice(&self) -> &[V]198*416691c8SNick Fitzgerald     pub fn as_values_slice(&self) -> &[V] {
199*416691c8SNick Fitzgerald         &self.elems
200*416691c8SNick Fitzgerald     }
201*416691c8SNick Fitzgerald 
202*416691c8SNick Fitzgerald     /// Get this map's default value.
default_value(&self) -> &V203*416691c8SNick Fitzgerald     pub fn default_value(&self) -> &V {
204*416691c8SNick Fitzgerald         &self.default
205*416691c8SNick Fitzgerald     }
206*416691c8SNick Fitzgerald 
20776664fc7SAmanieu d'Antras     /// Slow path for `index_mut` which resizes the vector.
20876664fc7SAmanieu d'Antras     #[cold]
resize_for_index_mut(&mut self, i: usize) -> &mut V20976664fc7SAmanieu d'Antras     fn resize_for_index_mut(&mut self, i: usize) -> &mut V {
21076664fc7SAmanieu d'Antras         self.elems.resize(i + 1, self.default.clone());
21176664fc7SAmanieu d'Antras         &mut self.elems[i]
21276664fc7SAmanieu d'Antras     }
213747ad3c4Slazypassion }
214747ad3c4Slazypassion 
21565eaca35SAlex Crichton impl<K, V> Default for SecondaryMap<K, V>
21665eaca35SAlex Crichton where
21765eaca35SAlex Crichton     K: EntityRef,
21865eaca35SAlex Crichton     V: Clone + Default,
21965eaca35SAlex Crichton {
default() -> SecondaryMap<K, V>22065eaca35SAlex Crichton     fn default() -> SecondaryMap<K, V> {
22165eaca35SAlex Crichton         SecondaryMap::new()
22265eaca35SAlex Crichton     }
22365eaca35SAlex Crichton }
22465eaca35SAlex Crichton 
225282546d4SNick Fitzgerald impl<K, V> From<Vec<V>> for SecondaryMap<K, V>
226282546d4SNick Fitzgerald where
227282546d4SNick Fitzgerald     K: EntityRef,
228282546d4SNick Fitzgerald     V: Clone + Default,
229282546d4SNick Fitzgerald {
from(elems: Vec<V>) -> Self230282546d4SNick Fitzgerald     fn from(elems: Vec<V>) -> Self {
231282546d4SNick Fitzgerald         let default = Default::default();
232282546d4SNick Fitzgerald         Self {
233282546d4SNick Fitzgerald             elems,
234282546d4SNick Fitzgerald             default,
235282546d4SNick Fitzgerald             unused: PhantomData,
236282546d4SNick Fitzgerald         }
237282546d4SNick Fitzgerald     }
238282546d4SNick Fitzgerald }
239282546d4SNick Fitzgerald 
2403c9305c0SNick Fitzgerald impl<K, V> FromIterator<(K, V)> for SecondaryMap<K, V>
2413c9305c0SNick Fitzgerald where
2423c9305c0SNick Fitzgerald     K: EntityRef,
2433c9305c0SNick Fitzgerald     V: Clone + Default,
2443c9305c0SNick Fitzgerald {
from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self2453c9305c0SNick Fitzgerald     fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
2463c9305c0SNick Fitzgerald         let iter = iter.into_iter();
2473c9305c0SNick Fitzgerald         let (min, max) = iter.size_hint();
2483c9305c0SNick Fitzgerald         let cap = max.unwrap_or_else(|| 2 * min);
2493c9305c0SNick Fitzgerald         let mut map = Self::with_capacity(cap);
2503c9305c0SNick Fitzgerald         for (k, v) in iter {
2513c9305c0SNick Fitzgerald             map[k] = v;
2523c9305c0SNick Fitzgerald         }
2533c9305c0SNick Fitzgerald         map
2543c9305c0SNick Fitzgerald     }
2553c9305c0SNick Fitzgerald }
2563c9305c0SNick Fitzgerald 
257747ad3c4Slazypassion /// Immutable indexing into an `SecondaryMap`.
258747ad3c4Slazypassion ///
259747ad3c4Slazypassion /// All keys are permitted. Untouched entries have the default value.
260747ad3c4Slazypassion impl<K, V> Index<K> for SecondaryMap<K, V>
261747ad3c4Slazypassion where
262747ad3c4Slazypassion     K: EntityRef,
263747ad3c4Slazypassion     V: Clone,
264747ad3c4Slazypassion {
265747ad3c4Slazypassion     type Output = V;
266747ad3c4Slazypassion 
26792a01c81Sjulian-seward1     #[inline(always)]
index(&self, k: K) -> &V268747ad3c4Slazypassion     fn index(&self, k: K) -> &V {
26992a01c81Sjulian-seward1         self.elems.get(k.index()).unwrap_or(&self.default)
270747ad3c4Slazypassion     }
271747ad3c4Slazypassion }
272747ad3c4Slazypassion 
273747ad3c4Slazypassion /// Mutable indexing into an `SecondaryMap`.
274747ad3c4Slazypassion ///
275747ad3c4Slazypassion /// The map grows as needed to accommodate new keys.
276747ad3c4Slazypassion impl<K, V> IndexMut<K> for SecondaryMap<K, V>
277747ad3c4Slazypassion where
278747ad3c4Slazypassion     K: EntityRef,
279747ad3c4Slazypassion     V: Clone,
280747ad3c4Slazypassion {
28192a01c81Sjulian-seward1     #[inline(always)]
index_mut(&mut self, k: K) -> &mut V282747ad3c4Slazypassion     fn index_mut(&mut self, k: K) -> &mut V {
283747ad3c4Slazypassion         let i = k.index();
284747ad3c4Slazypassion         if i >= self.elems.len() {
28576664fc7SAmanieu d'Antras             return self.resize_for_index_mut(i);
286747ad3c4Slazypassion         }
287747ad3c4Slazypassion         &mut self.elems[i]
288747ad3c4Slazypassion     }
289747ad3c4Slazypassion }
290747ad3c4Slazypassion 
291d3815a03SArtur Jamro impl<K, V> PartialEq for SecondaryMap<K, V>
292d3815a03SArtur Jamro where
293d3815a03SArtur Jamro     K: EntityRef,
294d3815a03SArtur Jamro     V: Clone + PartialEq,
295d3815a03SArtur Jamro {
eq(&self, other: &Self) -> bool296d3815a03SArtur Jamro     fn eq(&self, other: &Self) -> bool {
297d3815a03SArtur Jamro         let min_size = min(self.elems.len(), other.elems.len());
298d3815a03SArtur Jamro         self.default == other.default
299d3815a03SArtur Jamro             && self.elems[..min_size] == other.elems[..min_size]
300d3815a03SArtur Jamro             && self.elems[min_size..].iter().all(|e| *e == self.default)
301d3815a03SArtur Jamro             && other.elems[min_size..].iter().all(|e| *e == other.default)
302d3815a03SArtur Jamro     }
303d3815a03SArtur Jamro }
304d3815a03SArtur Jamro 
305d3815a03SArtur Jamro impl<K, V> Eq for SecondaryMap<K, V>
306d3815a03SArtur Jamro where
307d3815a03SArtur Jamro     K: EntityRef,
308d3815a03SArtur Jamro     V: Clone + PartialEq + Eq,
309d3815a03SArtur Jamro {
310d3815a03SArtur Jamro }
311d3815a03SArtur Jamro 
312d3815a03SArtur Jamro #[cfg(feature = "enable-serde")]
313d3815a03SArtur Jamro impl<K, V> Serialize for SecondaryMap<K, V>
314d3815a03SArtur Jamro where
315d3815a03SArtur Jamro     K: EntityRef,
316d3815a03SArtur Jamro     V: Clone + PartialEq + Serialize,
317d3815a03SArtur Jamro {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,318d3815a03SArtur Jamro     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
319d3815a03SArtur Jamro     where
320d3815a03SArtur Jamro         S: Serializer,
321d3815a03SArtur Jamro     {
322d3815a03SArtur Jamro         // TODO: bincode encodes option as "byte for Some/None" and then optionally the content
323d3815a03SArtur Jamro         // TODO: we can actually optimize it by encoding manually bitmask, then elements
324d3815a03SArtur Jamro         let mut elems_cnt = self.elems.len();
325d3815a03SArtur Jamro         while elems_cnt > 0 && self.elems[elems_cnt - 1] == self.default {
326d3815a03SArtur Jamro             elems_cnt -= 1;
327d3815a03SArtur Jamro         }
328d3815a03SArtur Jamro         let mut seq = serializer.serialize_seq(Some(1 + elems_cnt))?;
329d3815a03SArtur Jamro         seq.serialize_element(&Some(self.default.clone()))?;
330d3815a03SArtur Jamro         for e in self.elems.iter().take(elems_cnt) {
331d3815a03SArtur Jamro             let some_e = Some(e);
332d3815a03SArtur Jamro             seq.serialize_element(if *e == self.default { &None } else { &some_e })?;
333d3815a03SArtur Jamro         }
334d3815a03SArtur Jamro         seq.end()
335d3815a03SArtur Jamro     }
336d3815a03SArtur Jamro }
337d3815a03SArtur Jamro 
338d3815a03SArtur Jamro #[cfg(feature = "enable-serde")]
339d3815a03SArtur Jamro impl<'de, K, V> Deserialize<'de> for SecondaryMap<K, V>
340d3815a03SArtur Jamro where
341d3815a03SArtur Jamro     K: EntityRef,
342d3815a03SArtur Jamro     V: Clone + Deserialize<'de>,
343d3815a03SArtur Jamro {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,344d3815a03SArtur Jamro     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
345d3815a03SArtur Jamro     where
346d3815a03SArtur Jamro         D: Deserializer<'de>,
347d3815a03SArtur Jamro     {
348a114423dSbjorn3         use alloc::fmt;
349d3815a03SArtur Jamro         struct SecondaryMapVisitor<K, V> {
350d3815a03SArtur Jamro             unused: PhantomData<fn(K) -> V>,
351d3815a03SArtur Jamro         }
352d3815a03SArtur Jamro 
353d3815a03SArtur Jamro         impl<'de, K, V> Visitor<'de> for SecondaryMapVisitor<K, V>
354d3815a03SArtur Jamro         where
355d3815a03SArtur Jamro             K: EntityRef,
356d3815a03SArtur Jamro             V: Clone + Deserialize<'de>,
357d3815a03SArtur Jamro         {
358d3815a03SArtur Jamro             type Value = SecondaryMap<K, V>;
359d3815a03SArtur Jamro 
360d3815a03SArtur Jamro             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
361d3815a03SArtur Jamro                 formatter.write_str("struct SecondaryMap")
362d3815a03SArtur Jamro             }
363d3815a03SArtur Jamro 
364d3815a03SArtur Jamro             fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
365d3815a03SArtur Jamro             where
366d3815a03SArtur Jamro                 A: SeqAccess<'de>,
367d3815a03SArtur Jamro             {
368d3815a03SArtur Jamro                 match seq.next_element()? {
369d3815a03SArtur Jamro                     Some(Some(default_val)) => {
370d3815a03SArtur Jamro                         let default_val: V = default_val; // compiler can't infer the type
371d3815a03SArtur Jamro                         let mut m = SecondaryMap::with_default(default_val.clone());
372d3815a03SArtur Jamro                         let mut idx = 0;
373d3815a03SArtur Jamro                         while let Some(val) = seq.next_element()? {
374d3815a03SArtur Jamro                             let val: Option<_> = val; // compiler can't infer the type
375d3815a03SArtur Jamro                             m[K::new(idx)] = val.unwrap_or_else(|| default_val.clone());
376d3815a03SArtur Jamro                             idx += 1;
377d3815a03SArtur Jamro                         }
378d3815a03SArtur Jamro                         Ok(m)
379d3815a03SArtur Jamro                     }
380d3815a03SArtur Jamro                     _ => Err(serde::de::Error::custom("Default value required")),
381d3815a03SArtur Jamro                 }
382d3815a03SArtur Jamro             }
383d3815a03SArtur Jamro         }
384d3815a03SArtur Jamro 
385d3815a03SArtur Jamro         deserializer.deserialize_seq(SecondaryMapVisitor {
386d3815a03SArtur Jamro             unused: PhantomData {},
387d3815a03SArtur Jamro         })
388d3815a03SArtur Jamro     }
389d3815a03SArtur Jamro }
390d3815a03SArtur Jamro 
39118b42ef4SSimon Larsson impl<K: EntityRef + fmt::Debug, V: fmt::Debug + Clone> fmt::Debug for SecondaryMap<K, V> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result39218b42ef4SSimon Larsson     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
39318b42ef4SSimon Larsson         f.debug_struct("SecondaryMap")
39418b42ef4SSimon Larsson             .field("elems", &self.elems)
39518b42ef4SSimon Larsson             .field("default", &self.default)
39618b42ef4SSimon Larsson             .finish()
39718b42ef4SSimon Larsson     }
39818b42ef4SSimon Larsson }
39918b42ef4SSimon Larsson 
400747ad3c4Slazypassion #[cfg(test)]
401747ad3c4Slazypassion mod tests {
402747ad3c4Slazypassion     use super::*;
403747ad3c4Slazypassion 
404747ad3c4Slazypassion     // `EntityRef` impl for testing.
405747ad3c4Slazypassion     #[derive(Clone, Copy, Debug, PartialEq, Eq)]
406747ad3c4Slazypassion     struct E(u32);
407747ad3c4Slazypassion 
408747ad3c4Slazypassion     impl EntityRef for E {
new(i: usize) -> Self409747ad3c4Slazypassion         fn new(i: usize) -> Self {
410747ad3c4Slazypassion             E(i as u32)
411747ad3c4Slazypassion         }
index(self) -> usize412747ad3c4Slazypassion         fn index(self) -> usize {
413747ad3c4Slazypassion             self.0 as usize
414747ad3c4Slazypassion         }
415747ad3c4Slazypassion     }
416747ad3c4Slazypassion 
417747ad3c4Slazypassion     #[test]
basic()418747ad3c4Slazypassion     fn basic() {
419747ad3c4Slazypassion         let r0 = E(0);
420747ad3c4Slazypassion         let r1 = E(1);
421747ad3c4Slazypassion         let r2 = E(2);
42263ecb815SNick Fitzgerald         let r3 = E(3);
423747ad3c4Slazypassion         let mut m = SecondaryMap::new();
424747ad3c4Slazypassion 
425747ad3c4Slazypassion         let v: Vec<E> = m.keys().collect();
426747ad3c4Slazypassion         assert_eq!(v, []);
427747ad3c4Slazypassion 
428747ad3c4Slazypassion         m[r2] = 3;
429747ad3c4Slazypassion         m[r1] = 5;
430747ad3c4Slazypassion 
431747ad3c4Slazypassion         assert_eq!(m[r1], 5);
432747ad3c4Slazypassion         assert_eq!(m[r2], 3);
433747ad3c4Slazypassion 
43463ecb815SNick Fitzgerald         assert!(m.get(r3).is_none());
43563ecb815SNick Fitzgerald         assert!(m.get_mut(r3).is_none());
43663ecb815SNick Fitzgerald 
43763ecb815SNick Fitzgerald         let old = m.insert(r3, 99);
43863ecb815SNick Fitzgerald         assert!(old.is_none());
43963ecb815SNick Fitzgerald         assert_eq!(m.get(r3), Some(&99));
44063ecb815SNick Fitzgerald         assert_eq!(m[r3], 99);
44163ecb815SNick Fitzgerald 
44263ecb815SNick Fitzgerald         *m.get_mut(r3).unwrap() += 1;
44363ecb815SNick Fitzgerald         assert_eq!(m.get(r3), Some(&100));
44463ecb815SNick Fitzgerald         assert_eq!(m[r3], 100);
44563ecb815SNick Fitzgerald 
44663ecb815SNick Fitzgerald         let old = m.insert(r3, 42);
44763ecb815SNick Fitzgerald         assert_eq!(old, Some(100));
44863ecb815SNick Fitzgerald         assert_eq!(m.get(r3), Some(&42));
44963ecb815SNick Fitzgerald         assert_eq!(m[r3], 42);
45063ecb815SNick Fitzgerald 
45119de564cSNick Fitzgerald         let old = m.remove(r3);
45219de564cSNick Fitzgerald         assert_eq!(old, Some(42));
45319de564cSNick Fitzgerald         assert_eq!(m[r3], 0);
45419de564cSNick Fitzgerald         let old = m.remove(r3);
45519de564cSNick Fitzgerald         assert_eq!(old, Some(0));
45619de564cSNick Fitzgerald         m.resize(3);
45719de564cSNick Fitzgerald         let old = m.remove(r3);
45819de564cSNick Fitzgerald         assert_eq!(old, None);
45919de564cSNick Fitzgerald 
460747ad3c4Slazypassion         let v: Vec<E> = m.keys().collect();
46119de564cSNick Fitzgerald         assert_eq!(v, [r0, r1, r2]);
462747ad3c4Slazypassion 
463747ad3c4Slazypassion         let shared = &m;
464747ad3c4Slazypassion         assert_eq!(shared[r0], 0);
465747ad3c4Slazypassion         assert_eq!(shared[r1], 5);
466747ad3c4Slazypassion         assert_eq!(shared[r2], 3);
467747ad3c4Slazypassion     }
468747ad3c4Slazypassion }
469