lctree/
index.rs

1pub struct Index {
2    time_id: usize,
3    deleted_ids: Vec<usize>, // maybe use a set instead?
4}
5
6impl Index {
7    pub fn new() -> Self {
8        Self {
9            time_id: 0,
10            deleted_ids: Vec::new(),
11        }
12    }
13
14    pub fn insert(&mut self) -> usize {
15        if !self.deleted_ids.is_empty() {
16            return self.deleted_ids.pop().unwrap();
17        }
18        self.time_id += 1;
19        self.time_id - 1
20    }
21
22    pub fn delete(&mut self, id: usize) {
23        assert!(id < self.time_id, "Invalid deletion");
24        self.deleted_ids.push(id);
25    }
26}
27
28#[cfg(test)]
29mod tests {
30
31    #[test]
32    pub fn test_indexing() {
33        let mut index = super::Index::new();
34        // make 3 insertions
35        assert_eq!(index.insert(), 0);
36        assert_eq!(index.insert(), 1);
37        assert_eq!(index.insert(), 2);
38        assert_eq!(index.time_id, 3);
39
40        // delete 1
41        index.delete(1);
42        assert_eq!(index.time_id, 3);
43        assert_eq!(index.deleted_ids, vec![1]);
44
45        // next insertion should be 1
46        assert_eq!(index.insert(), 1);
47        assert_eq!(index.time_id, 3);
48    }
49
50    #[test]
51    #[should_panic]
52    pub fn test_invalid_deletion() {
53        let mut index = super::Index::new();
54        // make 3 insertions
55        assert_eq!(index.insert(), 0);
56        assert_eq!(index.insert(), 1);
57        assert_eq!(index.insert(), 2);
58        index.delete(4);
59    }
60}