#[derive(Debug)] pub(crate) struct IdMap { storage: Vec>, } impl IdMap { pub fn insert(&mut self, item: T) -> usize { if let Some(idx) = self.storage.iter().position(|i| i.is_none()) { self.storage[idx] = Some(item); idx } else { let idx = self.storage.len(); self.storage.push(Some(item)); idx } } pub fn remove(&mut self, idx: usize) -> Option { if let Some(elt) = self.storage.get_mut(idx) { elt.take() } else { None } } pub fn values(&self) -> impl Iterator { self.storage.iter().flatten() } } impl Default for IdMap { fn default() -> Self { IdMap { storage: vec![] } } }