use croaring::Bitmap;
pub (in crate) struct U32IdAllocator {
_next_id: u32,
_unused_ids: Bitmap,
}
impl U32IdAllocator {
pub (in crate) fn new() -> Self {
return Self {
_next_id: 0,
_unused_ids: Bitmap::create(),
};
}
pub (in crate) fn new_start_at(start_id: u32) -> Self {
return Self {
_next_id: start_id,
_unused_ids: Bitmap::create(),
};
}
pub fn next_id(&mut self) -> u32 {
if self._unused_ids.is_empty() {
if self._next_id + 1 == std::u32::MAX {
panic!("ID Space was exhausted");
}
let next_id = self._next_id;
self._next_id += 1;
return next_id;
}
let reuse_id = self._unused_ids.minimum().unwrap();
self._unused_ids.remove(reuse_id);
return reuse_id;
}
pub fn free_id(&mut self, id: u32) {
self._unused_ids.add(id);
}
}