use crate::error::OutOfMemory;
use core::{fmt, ops::Index};
use cranelift_entity::{EntityRef, SecondaryMap as Inner};
pub struct SecondaryMap<K, V>
where
K: EntityRef,
V: Clone,
{
inner: Inner<K, V>,
}
impl<K, V> fmt::Debug for SecondaryMap<K, V>
where
K: EntityRef + fmt::Debug,
V: fmt::Debug + Clone,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(&self.inner, f)
}
}
impl<K, V> SecondaryMap<K, V>
where
K: EntityRef,
V: Clone,
{
pub fn new() -> Self
where
V: Default,
{
Self {
inner: Inner::new(),
}
}
pub fn with_capacity(capacity: usize) -> Result<Self, OutOfMemory>
where
V: Default,
{
Ok(Self {
inner: Inner::try_with_capacity(capacity)?,
})
}
pub fn with_default(default: V) -> Self {
Self {
inner: Inner::with_default(default),
}
}
pub fn capacity(&self) -> usize {
self.inner.capacity()
}
pub fn get(&self, k: K) -> Option<&V> {
self.inner.get(k)
}
pub fn get_mut(&mut self, k: K) -> Option<&mut V> {
self.inner.get_mut(k)
}
pub fn insert(&mut self, k: K, v: V) -> Result<Option<V>, OutOfMemory> {
self.inner.try_insert(k, v)
}
pub fn remove(&mut self, k: K) -> Option<V> {
self.inner.remove(k)
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn clear(&mut self) {
self.inner.clear()
}
pub fn iter(&self) -> cranelift_entity::Iter<'_, K, V> {
self.inner.iter()
}
pub fn iter_mut(&mut self) -> cranelift_entity::IterMut<'_, K, V> {
self.inner.iter_mut()
}
pub fn keys(&self) -> cranelift_entity::Keys<K> {
self.inner.keys()
}
pub fn values(&self) -> core::slice::Iter<'_, V> {
self.inner.values()
}
pub fn values_mut(&mut self) -> core::slice::IterMut<'_, V> {
self.inner.values_mut()
}
pub fn resize(&mut self, n: usize) -> Result<(), OutOfMemory> {
self.inner.try_resize(n)
}
}
impl<K, V> Default for SecondaryMap<K, V>
where
K: EntityRef,
V: Clone + Default,
{
fn default() -> SecondaryMap<K, V> {
SecondaryMap::new()
}
}
impl<K, V> Index<K> for SecondaryMap<K, V>
where
K: EntityRef,
V: Clone,
{
type Output = V;
fn index(&self, k: K) -> &V {
&self.inner[k]
}
}