1use std::ops::Deref;
2use std::slice;
3
4#[derive(Clone, Debug)]
15pub struct SparseSet {
16 dense: Vec<usize>,
19 sparse: Box<[usize]>,
24}
25
26impl SparseSet {
27 pub fn new(size: usize) -> SparseSet {
28 SparseSet {
29 dense: Vec::with_capacity(size),
30 sparse: vec![0; size].into_boxed_slice(),
31 }
32 }
33
34 pub fn len(&self) -> usize {
35 self.dense.len()
36 }
37
38 pub fn is_empty(&self) -> bool {
39 self.dense.is_empty()
40 }
41
42 pub fn capacity(&self) -> usize {
43 self.dense.capacity()
44 }
45
46 pub fn insert(&mut self, value: usize) {
47 let i = self.len();
48 assert!(i < self.capacity());
49 self.dense.push(value);
50 self.sparse[value] = i;
51 }
52
53 pub fn contains(&self, value: usize) -> bool {
54 let i = self.sparse[value];
55 self.dense.get(i) == Some(&value)
56 }
57
58 pub fn clear(&mut self) {
59 self.dense.clear();
60 }
61}
62
63impl Deref for SparseSet {
64 type Target = [usize];
65
66 fn deref(&self) -> &Self::Target {
67 &self.dense
68 }
69}
70
71impl<'a> IntoIterator for &'a SparseSet {
72 type Item = &'a usize;
73 type IntoIter = slice::Iter<'a, usize>;
74 fn into_iter(self) -> Self::IntoIter {
75 self.iter()
76 }
77}