Skip to main content

maskforge_core/index/
artifact.rs

1//! Stores compiled per-state token transitions and binding metadata.
2
3use super::build::DeltaRow;
4use super::BindMode;
5use crate::error::Provenance;
6use crate::primitives::StateId;
7
8#[derive(Debug)]
9pub struct CompiledIndex {
10    delta: Vec<DeltaRow>,
11    provenance: Provenance,
12    bind_mode: BindMode,
13}
14
15impl CompiledIndex {
16    pub(crate) fn new(delta: Vec<DeltaRow>, provenance: Provenance, bind_mode: BindMode) -> Self {
17        Self {
18            delta,
19            provenance,
20            bind_mode,
21        }
22    }
23
24    pub(crate) fn row(&self, s: StateId) -> Option<&DeltaRow> {
25        self.delta.get(s.get() as usize)
26    }
27
28    #[must_use]
29    pub fn bind_mode(&self) -> BindMode {
30        self.bind_mode
31    }
32
33    #[must_use]
34    pub fn provenance(&self) -> Provenance {
35        self.provenance
36    }
37
38    #[must_use]
39    pub fn state_count(&self) -> usize {
40        self.delta.len()
41    }
42
43    #[must_use]
44    pub fn live_pairs(&self) -> usize {
45        self.delta.iter().map(DeltaRow::len).sum()
46    }
47
48    #[must_use]
49    pub fn max_row_len(&self) -> usize {
50        self.delta.iter().map(DeltaRow::len).max().unwrap_or(0)
51    }
52
53    #[must_use]
54    pub fn heap_bytes(&self) -> usize {
55        let outer = self.delta.capacity() * std::mem::size_of::<DeltaRow>();
56        let rows: usize = self.delta.iter().map(DeltaRow::heap_bytes).sum();
57        outer + rows
58    }
59}