use super::node::Node;
#[derive(Debug, Default)]
pub struct Arena {
slots: Vec<Option<Node>>,
}
impl Arena {
pub fn new() -> Self {
Self::default()
}
pub(crate) fn insert(&mut self, id: u32, node: Node) {
let idx = id as usize;
if idx >= self.slots.len() {
self.slots.resize_with(idx + 1, || None);
}
if self.slots[idx].is_none() {
self.slots[idx] = Some(node);
}
}
pub(crate) fn free(&mut self, id: u32) {
if let Some(slot) = self.slots.get_mut(id as usize) {
*slot = None;
}
}
pub fn get(&self, id: u32) -> Option<&Node> {
self.slots.get(id as usize)?.as_ref()
}
pub(crate) fn get_mut(&mut self, id: u32) -> Option<&mut Node> {
self.slots.get_mut(id as usize)?.as_mut()
}
#[cfg(test)]
pub fn live_count(&self) -> usize {
self.slots.iter().filter(|s| s.is_some()).count()
}
}