use std::marker::PhantomData;
use bitvec::vec::BitVec;
use crate::internal::arena::ArenaId;
pub(crate) struct IndexedSet<Id> {
bits: BitVec,
_marker: PhantomData<fn(Id) -> Id>,
}
impl<Id> Default for IndexedSet<Id> {
fn default() -> Self {
Self {
bits: BitVec::new(),
_marker: PhantomData,
}
}
}
impl<Id: ArenaId> IndexedSet<Id> {
pub fn insert(&mut self, id: Id) -> bool {
let idx = id.to_usize();
if idx >= self.bits.len() {
self.bits.resize(idx + 1, false);
}
!unsafe { self.bits.replace_unchecked(idx, true) }
}
pub fn contains(&self, id: Id) -> bool {
self.bits.get(id.to_usize()).is_some_and(|b| *b)
}
}