use crate::codepointset::CodePointSet;
use crate::position::PositionType;
#[cfg(not(feature = "std"))]
use alloc::string::String;
use core::ops;
pub type CaptureGroupID = u16;
pub type CaptureGroupName = String;
pub const MAX_CAPTURE_GROUPS: usize = 65535;
pub const MAX_LOOPS: usize = 65535;
pub type LoopID = u16;
#[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,
}
impl BracketContents {
pub fn is_empty(&self) -> bool {
match self.invert {
false => self.cps.is_empty(),
true => self.cps.contains_all_codepoints(),
}
}
}
pub type IP = usize;
#[derive(Debug, Copy, Clone)]
pub struct LoopData<Position: PositionType> {
pub iters: usize,
pub entry: Position,
}
impl<Position: PositionType> LoopData<Position> {
pub fn new(entry: Position) -> LoopData<Position> {
LoopData { iters: 0, entry }
}
}
#[derive(Debug, Copy, Clone)]
pub struct GroupData<Position: PositionType> {
pub start: Option<Position>,
pub end: Option<Position>,
}
impl<Position: PositionType> GroupData<Position> {
pub fn new() -> GroupData<Position> {
GroupData {
start: None,
end: None,
}
}
pub fn start_matched(&self) -> bool {
self.start.is_some()
}
pub fn end_matched(&self) -> bool {
self.end.is_some()
}
pub fn as_range(&self) -> Option<ops::Range<Position>> {
match (self.start, self.end) {
(Some(start), Some(end)) => Some(ops::Range { start, end }),
_ => None,
}
}
pub fn reset(&mut self) {
self.start = None;
self.end = None;
}
}