use std::collections::HashMap;
use std::hash::Hash;
#[derive(Debug)]
pub struct InverseSupply<V>
where
V: Eq + Hash,
{
inverse_map: HashMap<V, usize>,
}
impl<V> Default for InverseSupply<V>
where
V: Eq + Hash,
{
fn default() -> Self {
Self::new()
}
}
impl<V> InverseSupply<V>
where
V: Eq + Hash,
{
pub fn new() -> Self {
Self {
inverse_map: HashMap::new(),
}
}
pub fn with_capacity(capacity: usize) -> Self {
Self {
inverse_map: HashMap::with_capacity(capacity),
}
}
#[inline]
pub fn get(&self, value: &V) -> Option<usize> {
self.inverse_map.get(value).copied()
}
#[inline]
pub fn insert(&mut self, value: V, entity_idx: usize) -> Option<usize> {
self.inverse_map.insert(value, entity_idx)
}
#[inline]
pub fn remove(&mut self, value: &V) -> Option<usize> {
self.inverse_map.remove(value)
}
#[inline]
pub fn update(&mut self, old_value: Option<&V>, new_value: V, entity_idx: usize) {
if let Some(old) = old_value {
self.remove(old);
}
self.insert(new_value, entity_idx);
}
#[inline]
pub fn clear(&mut self) {
self.inverse_map.clear();
}
#[inline]
pub fn len(&self) -> usize {
self.inverse_map.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.inverse_map.is_empty()
}
#[inline]
pub fn iter(&self) -> impl Iterator<Item = (&V, &usize)> {
self.inverse_map.iter()
}
}