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