trex 0.2.0

The Rust Entity Component System
Documentation
pub type Id = usize;

pub struct IdPool {
    reserved: Vec<bool>,
    released: Vec<Id>,
}

impl IdPool {
    pub fn new() -> IdPool {
        IdPool {
            reserved: Vec::new(),
            released: Vec::new(),
        }
    }

    pub fn exists(&self, id: Id) -> bool {
        id < self.reserved.len()
    }

    pub fn reserved(&self) -> Iter {
        Iter::new(self)
    }

    pub fn reserve(&mut self) -> Id {
        match self.released.pop() {
            Some(id) => id,
            None => {
                let id = self.reserved.len();
                self.reserved.push(true);
                id
            }
        }
    }

    pub fn is_reserved(&self, id: Id) -> bool {
        assert!(self.exists(id));
        self.reserved[id]
    }

    pub fn release(&mut self, id: Id) {
        if self.is_reserved(id) {
            self.reserved[id] = false;
            self.released.push(id);
        }
    }
}

pub struct Iter<'a> {
    pool: &'a IdPool,
    id: Id,
}

impl<'a> Iter<'a> {
    fn new(pool: &IdPool) -> Iter {
        Iter {
            pool: pool,
            id: 0,
        }
    }
}

impl<'a> Iterator for Iter<'a> {
    type Item = Id;

    fn next(&mut self) -> Option<Id> {
        loop {
            let id = self.id;
            self.id += 1;

            if !self.pool.exists(id) {
                return None;
            } else if self.pool.is_reserved(id) {
                return Some(id);
            }
        }
    }
}