#[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]);
    }
}