1pub struct Index {
2 time_id: usize,
3 deleted_ids: Vec<usize>, }
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 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 index.delete(1);
42 assert_eq!(index.time_id, 3);
43 assert_eq!(index.deleted_ids, vec![1]);
44
45 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 assert_eq!(index.insert(), 0);
56 assert_eq!(index.insert(), 1);
57 assert_eq!(index.insert(), 2);
58 index.delete(4);
59 }
60}