use crate::hir::Hir;
use super::interpreter::BacktrackingVm;
#[cfg(all(feature = "jit", any(target_arch = "x86_64", target_arch = "aarch64")))]
use super::jit::{compile_backtracking, BacktrackingJit};
pub struct BacktrackingEngine {
vm: BacktrackingVm,
#[cfg(all(feature = "jit", any(target_arch = "x86_64", target_arch = "aarch64")))]
jit: Option<BacktrackingJit>,
}
impl std::fmt::Debug for BacktrackingEngine {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("BacktrackingEngine")
.field("capture_count", &self.vm.capture_count())
.finish()
}
}
impl BacktrackingEngine {
pub fn new(hir: &Hir) -> Self {
let vm = BacktrackingVm::new(hir);
#[cfg(all(feature = "jit", any(target_arch = "x86_64", target_arch = "aarch64")))]
let jit = compile_backtracking(hir).ok();
Self {
vm,
#[cfg(all(feature = "jit", any(target_arch = "x86_64", target_arch = "aarch64")))]
jit,
}
}
#[inline]
pub fn is_match(&self, input: &[u8]) -> bool {
self.find(input).is_some()
}
#[inline]
pub fn find(&self, input: &[u8]) -> Option<(usize, usize)> {
#[cfg(all(feature = "jit", any(target_arch = "x86_64", target_arch = "aarch64")))]
if let Some(ref jit) = self.jit {
return jit.find(input);
}
self.vm.find(input)
}
#[inline]
pub fn find_at(&self, input: &[u8], pos: usize) -> Option<(usize, usize)> {
#[cfg(all(feature = "jit", any(target_arch = "x86_64", target_arch = "aarch64")))]
if let Some(ref jit) = self.jit {
return jit.find_at(input, pos);
}
self.vm.find_at(input, pos)
}
#[inline]
pub fn captures(&self, input: &[u8]) -> Option<Vec<Option<(usize, usize)>>> {
#[cfg(all(feature = "jit", any(target_arch = "x86_64", target_arch = "aarch64")))]
if let Some(ref jit) = self.jit {
return jit.captures(input);
}
self.vm.captures(input)
}
pub fn capture_count(&self) -> u32 {
self.vm.capture_count()
}
pub fn vm(&self) -> &BacktrackingVm {
&self.vm
}
#[cfg(all(feature = "jit", any(target_arch = "x86_64", target_arch = "aarch64")))]
pub fn is_jit(&self) -> bool {
self.jit.is_some()
}
#[cfg(not(all(feature = "jit", any(target_arch = "x86_64", target_arch = "aarch64"))))]
pub fn is_jit(&self) -> bool {
false
}
}