use fnv::FnvHashMap;
use std::sync::atomic::{AtomicUsize, Ordering};
pub struct Set {
data: FnvHashMap<String, usize>,
key_data_size: usize,
queries: AtomicUsize,
}
impl Default for Set {
fn default() -> Self {
Set {
data: FnvHashMap::default(),
key_data_size: 0,
queries: AtomicUsize::new(0),
}
}
}
impl Set {
pub fn add(&mut self, key: String) {
let next_index = self.data.len() + 1;
let _ = self.data.entry(key).or_insert(next_index);
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
pub fn allocated_memory(&self) -> usize {
let table_size = self.data.capacity() * 11 / 10
* (std::mem::size_of::<String>() + std::mem::size_of::<usize>());
self.key_data_size + table_size
}
pub fn num_queries(&self) -> usize {
self.queries.load(Ordering::Relaxed)
}
pub fn contains(&self, key: &str) -> bool {
self.queries
.store(self.queries.load(Ordering::Relaxed) + 1, Ordering::Relaxed);
self.data.contains_key(key)
}
pub fn index_of(&self, key: &str) -> usize {
self.queries
.store(self.queries.load(Ordering::Relaxed) + 1, Ordering::Relaxed);
*self.data.get(key).unwrap_or(&0)
}
}