#[derive(Debug)]
pub struct SparseSet {
dense: Vec<usize>,
sparse: Vec<usize>,
nb_max: usize,
n: usize,
}
impl SparseSet {
pub fn new(nb_max: usize) -> Self {
Self {
dense: vec![usize::MAX;nb_max],
sparse: vec![usize::MAX;nb_max],
nb_max,
n: 0,
}
}
pub fn is_empty(&self) -> bool { self.n == 0 }
pub fn len(&self) -> usize {
self.n
}
pub fn nth(&self, i:usize) -> usize {
debug_assert!(i<self.n);
self.dense[i]
}
pub fn contains(&self, e:usize) -> bool {
self.sparse[e] < self.n
}
pub fn insert(&mut self, e:usize) {
debug_assert!(!self.contains(e));
debug_assert!(e < self.nb_max);
self.sparse[e] = self.n;
self.dense[self.n] = e;
self.n += 1;
}
pub fn remove(&mut self, e:usize) {
debug_assert!(self.contains(e));
self.n -= 1;
self.dense[self.sparse[e]] = self.dense[self.n];
self.sparse[self.dense[self.n]] = self.sparse[e];
self.sparse[e] = usize::MAX;
}
pub fn remove_all_but_one(&mut self, e:usize) {
debug_assert!(self.contains(e));
self.sparse[self.dense[0]] = usize::MAX;
self.dense[0] = e;
self.sparse[e] = 0;
self.n = 1;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn constructor() {
let set = SparseSet::new(10);
assert_eq!(set.len(), 0);
}
#[test]
fn insert() {
let mut set = SparseSet::new(10);
set.insert(5);
set.insert(7);
set.insert(9);
assert!(set.contains(5));
assert!(set.contains(7));
assert!(set.contains(9));
assert!(!set.contains(0));
assert!(!set.contains(1));
assert!(!set.contains(2));
assert!(!set.contains(3));
}
#[test]
fn remove() {
let mut set = SparseSet::new(10);
set.insert(5);
set.insert(7);
assert!(set.contains(5));
assert!(set.contains(7));
assert!(!set.contains(3));
set.remove(5);
assert!(set.contains(7));
assert!(!set.contains(5));
assert!(!set.contains(3));
}
#[test]
fn removeallbutone() {
let mut set = SparseSet::new(10);
set.insert(5);
set.insert(7);
set.insert(3);
assert!(set.contains(5));
assert!(set.contains(7));
assert!(set.contains(3));
set.remove_all_but_one(3);
assert!(!set.contains(5));
assert!(!set.contains(7));
assert!(set.contains(3));
}
}