use core::panic;
use std::hash::Hash;
use rustc_hash::FxHashMap;
pub struct Registry<ID: Hash + Eq, T> {
items: FxHashMap<ID, T>,
}
impl<ID: Hash + Eq, T> Default for Registry<ID, T> {
fn default() -> Self {
Self {
items: FxHashMap::default(),
}
}
}
impl<ID: Hash + Eq, T> Registry<ID, T> {
pub fn new() -> Self {
Self::default()
}
pub fn insert(&mut self, id: ID, item: T) {
if self.items.insert(id, item).is_some() {
panic!("Item collision in registry.");
}
}
pub fn overwrite(&mut self, id: ID, item: T) {
if self.items.insert(id, item).is_none() {
panic!("Item not found in registry but overwrite was called.");
}
}
pub fn insert_or_overwrite(&mut self, id: ID, item: T) {
self.items.insert(id, item);
}
pub fn remove(&mut self, id: &ID) -> T {
self.items.remove(id).expect("Item not found in registry.")
}
pub fn try_remove(&mut self, id: &ID) -> Option<T> {
self.items.remove(id)
}
pub fn get(&self, id: &ID) -> &T {
self.items.get(id).expect("Item not found in registry.")
}
pub fn try_get(&self, id: &ID) -> Option<&T> {
self.items.get(id)
}
pub fn exists(&self, id: &ID) -> bool {
self.items.contains_key(id)
}
}