use crate::codepointset::CodePointSet;
use crate::cursor::Position;
pub type Range = std::ops::Range<usize>;
pub type CaptureGroupID = u16;
pub const MAX_CAPTURE_GROUPS: usize = 65535;
pub const MAX_LOOPS: usize = 65535;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum CharacterClassType {
Digits,
Spaces,
Words,
}
#[derive(Debug, Clone, Default)]
pub struct BracketContents {
pub invert: bool,
pub cps: CodePointSet,
}
pub type IP = usize;
#[derive(Debug, Copy, Clone)]
pub struct LoopData {
pub iters: usize,
pub entry: Position,
}
impl LoopData {
pub fn new() -> LoopData {
LoopData {
iters: 0,
entry: Position { pos: 0 },
}
}
}
#[derive(Debug, Copy, Clone)]
pub struct GroupData {
pub start: Position,
pub end: Position,
}
impl GroupData {
pub const NOT_MATCHED: usize = std::usize::MAX;
pub fn new() -> GroupData {
GroupData {
start: Position {
pos: GroupData::NOT_MATCHED,
},
end: Position {
pos: GroupData::NOT_MATCHED,
},
}
}
pub fn start_matched(&self) -> bool {
self.start.pos != GroupData::NOT_MATCHED
}
pub fn end_matched(&self) -> bool {
self.end.pos != GroupData::NOT_MATCHED
}
pub fn as_range(&self) -> Option<Range> {
if self.start_matched() && self.end_matched() {
Some(self.start.pos..self.end.pos)
} else {
None
}
}
pub fn reset(&mut self) {
self.start.pos = GroupData::NOT_MATCHED;
self.end.pos = GroupData::NOT_MATCHED;
}
}