Path: blob/main/crates/environ/src/collections/secondary_map.rs
3073 views
use crate::error::OutOfMemory;1use core::{fmt, ops::Index};2use cranelift_entity::{EntityRef, SecondaryMap as Inner};34/// Like [`cranelift_entity::SecondaryMap`] but all allocation is fallible.5pub struct SecondaryMap<K, V>6where7K: EntityRef,8V: Clone,9{10inner: Inner<K, V>,11}1213impl<K, V> fmt::Debug for SecondaryMap<K, V>14where15K: EntityRef + fmt::Debug,16V: fmt::Debug + Clone,17{18fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {19fmt::Debug::fmt(&self.inner, f)20}21}2223impl<K, V> SecondaryMap<K, V>24where25K: EntityRef,26V: Clone,27{28/// Same as [`cranelift_entity::SecondaryMap::new`].29pub fn new() -> Self30where31V: Default,32{33Self {34inner: Inner::new(),35}36}3738/// Same as [`cranelift_entity::SecondaryMap::try_with_capacity`].39pub fn with_capacity(capacity: usize) -> Result<Self, OutOfMemory>40where41V: Default,42{43Ok(Self {44inner: Inner::try_with_capacity(capacity)?,45})46}4748/// Same as [`cranelift_entity::SecondaryMap::with_default`].49pub fn with_default(default: V) -> Self {50Self {51inner: Inner::with_default(default),52}53}5455/// Same as [`cranelift_entity::SecondaryMap::capacity`].56pub fn capacity(&self) -> usize {57self.inner.capacity()58}5960/// Same as [`cranelift_entity::SecondaryMap::get`].61pub fn get(&self, k: K) -> Option<&V> {62self.inner.get(k)63}6465/// Same as [`cranelift_entity::SecondaryMap::get_mut`].66pub fn get_mut(&mut self, k: K) -> Option<&mut V> {67self.inner.get_mut(k)68}6970/// Same as [`cranelift_entity::SecondaryMap::try_insert`].71pub fn insert(&mut self, k: K, v: V) -> Result<Option<V>, OutOfMemory> {72self.inner.try_insert(k, v)73}7475/// Same as [`cranelift_entity::SecondaryMap::remove`].76pub fn remove(&mut self, k: K) -> Option<V> {77self.inner.remove(k)78}7980/// Same as [`cranelift_entity::SecondaryMap::is_empty`].81pub fn is_empty(&self) -> bool {82self.inner.is_empty()83}8485/// Same as [`cranelift_entity::SecondaryMap::clear`].86pub fn clear(&mut self) {87self.inner.clear()88}8990/// Same as [`cranelift_entity::SecondaryMap::iter`].91pub fn iter(&self) -> cranelift_entity::Iter<'_, K, V> {92self.inner.iter()93}9495/// Same as [`cranelift_entity::SecondaryMap::iter_mut`].96pub fn iter_mut(&mut self) -> cranelift_entity::IterMut<'_, K, V> {97self.inner.iter_mut()98}99100/// Same as [`cranelift_entity::SecondaryMap::keys`].101pub fn keys(&self) -> cranelift_entity::Keys<K> {102self.inner.keys()103}104105/// Same as [`cranelift_entity::SecondaryMap::values`].106pub fn values(&self) -> core::slice::Iter<'_, V> {107self.inner.values()108}109110/// Same as [`cranelift_entity::SecondaryMap::values_mut`].111pub fn values_mut(&mut self) -> core::slice::IterMut<'_, V> {112self.inner.values_mut()113}114115/// Resize the map to have `n` entries by adding default entries as needed.116pub fn resize(&mut self, n: usize) -> Result<(), OutOfMemory> {117self.inner.try_resize(n)118}119}120121impl<K, V> Default for SecondaryMap<K, V>122where123K: EntityRef,124V: Clone + Default,125{126fn default() -> SecondaryMap<K, V> {127SecondaryMap::new()128}129}130131// NB: no `IndexMut` implementation because it requires allocation but the trait132// doesn't allow for fallibility.133impl<K, V> Index<K> for SecondaryMap<K, V>134where135K: EntityRef,136V: Clone,137{138type Output = V;139140fn index(&self, k: K) -> &V {141&self.inner[k]142}143}144145146