use core::{
fmt,
ops::{Index, IndexMut},
};
use cranelift_entity::EntityRef;
use wasmtime_core::error::OutOfMemory;
#[derive(Clone, Hash, PartialEq, Eq)]
pub struct PrimaryMap<K, V>
where
K: EntityRef,
{
inner: cranelift_entity::PrimaryMap<K, V>,
}
impl<K, V> Default for PrimaryMap<K, V>
where
K: EntityRef,
{
fn default() -> Self {
Self {
inner: cranelift_entity::PrimaryMap::default(),
}
}
}
impl<K, V> fmt::Debug for PrimaryMap<K, V>
where
K: EntityRef + fmt::Debug,
V: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(&self.inner, f)
}
}
impl<K, V> PrimaryMap<K, V>
where
K: EntityRef,
{
pub fn new() -> Self {
Self {
inner: cranelift_entity::PrimaryMap::new(),
}
}
pub fn with_capacity(capacity: usize) -> Result<Self, OutOfMemory> {
let mut map = Self::new();
map.reserve(capacity)?;
Ok(map)
}
pub fn is_valid(&self, k: K) -> bool {
self.inner.is_valid(k)
}
pub fn get(&self, k: K) -> Option<&V> {
self.inner.get(k)
}
pub fn get_range(&self, range: core::ops::Range<K>) -> Option<&[V]> {
self.inner.get_range(range)
}
pub fn get_mut(&mut self, k: K) -> Option<&mut V> {
self.inner.get_mut(k)
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn len(&self) -> usize {
self.inner.len()
}
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 as_values_slice(&self) -> &[V] {
self.inner.as_values_slice()
}
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 clear(&mut self) {
self.inner.clear()
}
pub fn next_key(&self) -> K {
self.inner.next_key()
}
pub fn push(&mut self, v: V) -> Result<K, OutOfMemory> {
self.reserve(1)?;
Ok(self.inner.push(v))
}
pub fn last(&self) -> Option<(K, &V)> {
self.inner.last()
}
pub fn last_mut(&mut self) -> Option<(K, &mut V)> {
self.inner.last_mut()
}
pub fn reserve(&mut self, additional: usize) -> Result<(), OutOfMemory> {
self.inner.try_reserve(additional)
}
pub fn reserve_exact(&mut self, additional: usize) -> Result<(), OutOfMemory> {
self.inner.try_reserve_exact(additional)
}
pub fn get_disjoint_mut<const N: usize>(
&mut self,
indices: [K; N],
) -> Result<[&mut V; N], core::slice::GetDisjointMutError> {
self.inner.get_disjoint_mut(indices)
}
pub fn binary_search_values_by_key<'a, B, F>(&'a self, b: &B, f: F) -> Result<K, K>
where
F: FnMut(&'a V) -> B,
B: Ord,
{
self.inner.binary_search_values_by_key(b, f)
}
pub fn get_raw_mut(&mut self, k: K) -> Option<*mut V> {
self.inner.get_raw_mut(k)
}
}
impl<K, V> Index<K> for PrimaryMap<K, V>
where
K: EntityRef,
{
type Output = V;
fn index(&self, k: K) -> &V {
&self.inner[k]
}
}
impl<K, V> IndexMut<K> for PrimaryMap<K, V>
where
K: EntityRef,
{
fn index_mut(&mut self, k: K) -> &mut V {
&mut self.inner[k]
}
}