diff_priv/
vec_set.rs

1/// based on https://stackoverflow.com/questions/53755017/can-i-randomly-sample-from-a-hashset-efficiently
2/// used to efficiently retrieve observed values in the Laplace noiser
3use std::collections::HashSet;
4
5#[derive(Default, Clone)]
6pub struct VecSet<T> {
7    set: HashSet<T>,
8    vec: Vec<T>,
9}
10
11impl<T> VecSet<T>
12where
13    T: Clone + Eq + std::hash::Hash,
14{
15    pub fn len(&self) -> usize {
16        self.set.len()
17    }
18
19    pub fn insert(&mut self, elem: T) {
20        assert_eq!(self.set.len(), self.vec.len());
21        let was_new = self.set.insert(elem.clone());
22        if was_new {
23            self.vec.push(elem);
24        }
25    }
26
27    pub fn get(&self, index: usize) -> Option<&T> {
28        self.vec.get(index)
29    }
30}