#[derive(Debug, Clone)]
pub struct SmallIntSet {
bit_set: Vec<bool>,
values: Vec<usize>,
}
impl SmallIntSet {
pub fn new(size: usize) -> Self {
Self {
bit_set: vec![false; size],
values: vec![],
}
}
pub fn contains(&self, i: usize) -> bool {
self.bit_set[i]
}
pub fn insert(&mut self, i: usize) {
if !self.bit_set[i] {
self.bit_set[i] = true;
self.values.push(i)
}
}
pub fn sorted_iter(&mut self) -> ::std::slice::Iter<usize> {
self.values.sort();
self.values.iter()
}
pub fn clear(&mut self) {
for i in self.values.iter() {
self.bit_set[*i] = false;
}
self.values.clear();
assert!(self.values.is_empty());
}
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::SmallIntSet;
#[test]
fn basic_test() {
let mut set = SmallIntSet::new(5);
assert!(!set.contains(3));
assert!(!set.contains(0));
set.insert(2);
assert!(set.contains(2));
assert!(!set.contains(3));
assert_eq!(set.sorted_iter().cloned().collect::<Vec<_>>(), vec![2]);
set.insert(2);
assert_eq!(set.sorted_iter().cloned().collect::<Vec<_>>(), vec![2]);
set.insert(0);
set.insert(3);
assert_eq!(set.sorted_iter().cloned().collect::<Vec<_>>(), vec![0, 2, 3]);
set.insert(4);
assert_eq!(set.sorted_iter().cloned().collect::<Vec<_>>(), vec![0, 2, 3, 4]);
set.clear();
assert_eq!(set.sorted_iter().cloned().collect::<Vec<usize>>(), Vec::<usize>::new());
assert!(!set.contains(3));
assert!(!set.contains(0));
assert!(!set.contains(2));
set.insert(2);
assert!(set.contains(2));
assert!(!set.contains(3));
assert_eq!(set.sorted_iter().cloned().collect::<Vec<_>>(), vec![2]);
}
}