use super::hash_index::{HashIndex, hash_numbers};
#[derive(Debug, Default)]
pub(crate) struct ShapeTable {
keys: Vec<usize>,
ends: Vec<usize>,
index: HashIndex,
}
impl ShapeTable {
pub(crate) fn clear(&mut self) {
self.keys.clear();
self.ends.clear();
self.index.clear();
}
pub(crate) fn find(&self, keys: &[usize]) -> Option<usize> {
self.index
.find(hash_numbers(keys), |shape| self.keys_of(shape) == keys)
}
pub(crate) fn keys_of(&self, shape: usize) -> &[usize] {
let start = shape.checked_sub(1).map_or(0, |before| self.ends[before]);
&self.keys[start..self.ends[shape]]
}
pub(crate) fn key(&mut self, string: usize) {
self.keys.push(string);
}
pub(crate) fn seal(&mut self) -> usize {
let start = self.ends.last().copied().unwrap_or(0);
self.ends.push(self.keys.len());
self.index.push(hash_numbers(&self.keys[start..]))
}
}