dynamis-world 0.6.0

GPU-driven physics engine
Documentation
pub(crate) struct IdSpace {
    free: Vec<u32>,
    generations: Vec<u32>,
}

impl IdSpace {
    pub(crate) const fn new() -> Self {
        Self {
            free: Vec::new(),
            generations: Vec::new(),
        }
    }

    pub(crate) fn acquire(&mut self) -> (u32, u32) {
        let id = match self.free.pop() {
            Some(id) => id,
            None => {
                self.generations.push(1);
                (self.generations.len() - 1) as u32
            }
        };
        self.generations[id as usize] += 1;
        (id, self.generations[id as usize])
    }

    pub(crate) fn release(&mut self, id: u32) {
        self.generations[id as usize] += 1;
        self.free.push(id);
    }

    pub(crate) fn generation(&self, id: u32) -> u32 {
        self.generations[id as usize]
    }

    pub(crate) fn len(&self) -> usize {
        self.generations.len()
    }
}