use crate::domain::types::{BoundaryFlags, DepthVec};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum TerminatorKind {
Char(char),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum Judgment {
Boundary(BoundaryFlags),
NotBoundary,
}
pub(crate) trait Judge {
fn judge(&self, window: &str, pos_in_window: usize, kind: TerminatorKind) -> Judgment;
fn suppress_enclosure(&self, window: &str, pos_in_window: usize, ch: char) -> bool;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum EnclosureSlot {
Asym { index: u8, delta: i8 },
Sym { bit: u8 },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct PendingEnclosure {
pub local_offset: usize,
pub ch: char,
pub slot: EnclosureSlot,
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct Candidate {
pub local_offset: usize,
pub local_depths: DepthVec,
pub local_parity: u32,
pub flags: BoundaryFlags,
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct PendingCandidate {
pub local_offset: usize,
pub local_depths: DepthVec,
pub local_parity: u32,
pub kind: TerminatorKind,
}
impl PendingCandidate {
pub(crate) fn confirm(&self, flags: BoundaryFlags) -> Candidate {
Candidate {
local_offset: self.local_offset,
local_depths: self.local_depths.clone(),
local_parity: self.local_parity,
flags,
}
}
}