use std::collections::HashMap;
use crate::handle::Handle;
pub trait Resource {
type Handle: Handle;
}
pub struct ResourceMap<T: Resource> {
map: HashMap<<T::Handle as Handle>::Raw, T>,
names: HashMap<String, <T::Handle as Handle>::Raw>,
next: T::Handle,
}
impl<T: Resource> ResourceMap<T> {
pub fn new() -> ResourceMap<T> {
ResourceMap {
map: HashMap::new(),
names: HashMap::new(),
next: <T::Handle as Default>::default(),
}
}
pub fn insert(&mut self, name: Option<&str>, resource: T) -> T::Handle {
self.next = self.next.next();
let raw = self.next.id();
let id = <T::Handle as Handle>::create(raw);
self.map.insert(raw, resource);
if let Some(name) = name {
self.names.insert(name.to_string(), raw);
}
id
}
pub fn get(&self, id: T::Handle) -> Option<&T> {
let raw = <T::Handle as Handle>::id(&id);
self.map.get(&raw)
}
pub fn get_mut(&mut self, id: T::Handle) -> Option<&mut T> {
let raw = <T::Handle as Handle>::id(&id);
self.map.get_mut(&raw)
}
pub fn find_id(&self, name: &str) -> Option<T::Handle> {
self.names.get(name).map(|id| <T::Handle as Handle>::create(*id))
}
pub fn remove(&mut self, id: T::Handle) -> Option<T> {
let raw = <T::Handle as Handle>::id(&id);
self.map.remove(&raw)
}
}