use std::marker::PhantomData;
use bitvec::vec::BitVec;
use crate::id::DenseIndex;
pub 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: DenseIndex> IndexedSet<Id> {
#[inline]
pub fn insert(&mut self, id: Id) -> bool {
let idx = id.to_index();
if idx >= self.bits.len() {
self.bits.resize(idx + 1, false);
}
!unsafe { self.bits.replace_unchecked(idx, true) }
}
#[inline]
pub fn contains(&self, id: Id) -> bool {
self.bits.get(id.to_index()).is_some_and(|b| *b)
}
}