use std::borrow::Cow;
use std::collections::HashSet;
use super::build::Build;
use crate::model::quick_hash::QuickBuild;
const SCAN_MAX: usize = 16;
#[derive(Default)]
pub(super) struct Keys<'t> {
count: usize,
set: Option<HashSet<Cow<'t, str>, QuickBuild>>,
}
impl<'t> Keys<'t> {
pub(super) fn repeats<B: Build<'t>>(
&mut self,
build: &B,
mark: usize,
key: Cow<'t, str>,
) -> bool {
self.count += 1;
if let Some(set) = &mut self.set {
return !set.insert(key);
}
if build.has_key(mark, &key) {
return true;
}
if self.count > SCAN_MAX {
let mut set = HashSet::with_hasher(QuickBuild::default());
build.each_key(mark, &mut |k| {
set.insert(Cow::Owned(k.to_owned()));
});
set.insert(key);
self.set = Some(set);
}
false
}
}