use molframe_core::hashing::{IdentityBuildHasher, IdentityHashSet};
use molframe_core::symbol::{AltId, SymbolId};
#[derive(Default)]
pub(super) struct ResidueNames {
names: Vec<(SymbolId, AltId)>,
index: Option<IdentityHashSet<(u32, u32)>>,
}
impl ResidueNames {
const INDEX_THRESHOLD: usize = 64;
pub(super) fn contains(&self, name: SymbolId, alt: AltId) -> bool {
match &self.index {
Some(index) => index.contains(&(name.get(), alt.get())),
None => self.names.contains(&(name, alt)),
}
}
pub(super) fn insert(&mut self, name: SymbolId, alt: AltId) {
self.names.push((name, alt));
match &mut self.index {
Some(index) => {
let _existing = index.insert((name.get(), alt.get()));
}
None if self.names.len() > Self::INDEX_THRESHOLD => {
let mut index = IdentityHashSet::with_capacity_and_hasher(
self.names.len(),
IdentityBuildHasher::default(),
);
for &(name, alt) in &self.names {
let _existing = index.insert((name.get(), alt.get()));
}
self.index = Some(index);
}
None => {}
}
}
pub(super) fn clear(&mut self) {
self.names.clear();
self.index = None;
}
}
#[cfg(test)]
#[path = "names_tests.rs"]
mod tests;