#[derive(Debug, Default)]
pub(in crate::wire::binary) struct Shapes {
keys: Vec<usize>,
ends: Vec<usize>,
}
impl Shapes {
pub(in crate::wire::binary) fn len(&self) -> usize {
self.ends.len()
}
pub(super) fn start(&self, shape: usize) -> usize {
shape.checked_sub(1).map_or(0, |before| self.ends[before])
}
pub(in crate::wire::binary) fn width(&self, shape: usize) -> usize {
self.ends[shape] - self.start(shape)
}
pub(in crate::wire::binary) fn key(&self, shape: usize, at: usize) -> usize {
self.keys[self.start(shape) + at]
}
pub(in crate::wire::binary) fn keys_of(&self, shape: usize) -> &[usize] {
&self.keys[self.start(shape)..self.ends[shape]]
}
pub(super) fn push_key(&mut self, string: usize) {
self.keys.push(string);
}
pub(super) fn seal(&mut self) -> usize {
self.ends.push(self.keys.len());
self.ends.len() - 1
}
}