web_fs/
arena.rs

1pub struct Arena<T> {
2    inner: Vec<Option<T>>,
3    last_remove: Option<usize>,
4}
5
6impl<T> Arena<T> {
7    pub fn new() -> Self {
8        Arena {
9            inner: Vec::new(),
10            last_remove: None,
11        }
12    }
13    pub fn insert(&mut self, e: T) -> usize {
14        if let Some(vacancy) = self.last_remove {
15            self.inner[vacancy] = Some(e);
16            self.last_remove = None;
17            vacancy
18        } else {
19            for i in 0..self.inner.len() {
20                if self.inner[i].is_none() {
21                    self.inner[i] = Some(e);
22                    return i;
23                }
24            }
25            let last_index = self.inner.len();
26            self.inner.push(Some(e));
27            last_index
28        }
29    }
30    pub fn remove(&mut self, i: usize) -> Option<T> {
31        if i >= self.inner.len() {
32            return None;
33        }
34        self.inner[i].take()
35    }
36}