use std::collections::{ hash_map::{ Iter, IterMut, Values, ValuesMut }, HashMap };
pub type RID = u64;
#[derive(Debug, Clone, Default)]
pub struct RIDHolder<T> {
data: HashMap<RID, T>,
highest: RID,
vacant: Vec<RID>
}
impl <T> RIDHolder<T> {
pub fn new() -> Self {
RIDHolder {
data: HashMap::new(),
highest: 0,
vacant: Vec::new()
}
}
pub fn from_vec(slice: Vec<T>) -> Self {
let highest: RID = (slice.len() - 1) as RID;
RIDHolder {
data: slice.into_iter().enumerate().map(|(rid, item)| (rid as RID, item)).collect(),
highest,
vacant: Vec::new()
}
}
pub fn push(&mut self, item: T) -> RID {
let rid: RID = match self.vacant.pop() {
Some(id) => id,
None => {
let id: RID = self.highest;
self.highest += 1;
id
}
};
self.data.insert(rid, item);
rid
}
#[inline]
pub fn retrieve(&self, rid: RID) -> Option<&T> {
self.data.get(&rid)
}
#[inline]
pub fn modify(&mut self, rid: RID) -> Option<&mut T> {
self.data.get_mut(&rid)
}
pub fn take(&mut self, rid: RID) -> Option<T> {
match self.data.remove(&rid) {
None => None,
Some(item) => {
self.vacant.push(rid);
Some(item)
}
}
}
#[inline]
pub fn iter(&self) -> Values<RID, T> {
self.data.values()
}
#[inline]
pub fn iter_mut(&mut self) -> ValuesMut<RID, T> {
self.data.values_mut()
}
#[inline]
pub fn iter_enumerated(&self) -> Iter<RID, T> {
self.data.iter()
}
#[inline]
pub fn iter_mut_enumerated(&mut self) -> IterMut<RID, T> {
self.data.iter_mut()
}
#[inline]
pub fn len(&self) -> usize {
self.data.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
}