use super::interpreter::TaggedNfa;
use super::shared::PatternStep;
use super::steps::StepExtractor;
use crate::nfa::Nfa;
use crate::vm::{PikeVm, PikeVmContext};
use std::sync::RwLock;
pub struct TaggedNfaEngine {
steps: Option<Vec<PatternStep>>,
pike_vm: PikeVm,
pike_ctx: RwLock<PikeVmContext>,
}
impl TaggedNfaEngine {
pub fn new(nfa: Nfa) -> Self {
let steps = StepExtractor::new(&nfa).extract();
let pike_vm = PikeVm::new(nfa);
let pike_ctx = RwLock::new(pike_vm.create_context());
Self {
steps,
pike_vm,
pike_ctx,
}
}
pub fn is_match(&self, input: &[u8]) -> bool {
self.find(input).is_some()
}
pub fn find(&self, input: &[u8]) -> Option<(usize, usize)> {
if let Some(ref steps) = self.steps {
return TaggedNfa::find(steps, input);
}
self.pike_vm.find(input)
}
pub fn find_at(&self, input: &[u8], start: usize) -> Option<(usize, usize)> {
if let Some(ref steps) = self.steps {
return TaggedNfa::find_at(steps, input, start);
}
self.pike_vm.find_at(input, start)
}
pub fn captures(&self, input: &[u8]) -> Option<Vec<Option<(usize, usize)>>> {
let mut ctx = self.pike_ctx.write().unwrap();
self.pike_vm.captures_with_context(input, &mut ctx, 0)
}
}