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}