use crate::scan::literal_set::GpuLiteralSet;
use vyre::ir::Program;
use vyre::VyreBackend;
pub use vyre_foundation::match_result::Match;
pub struct DirectGpuScanner {
literal_set: GpuLiteralSet,
}
impl DirectGpuScanner {
#[must_use]
pub fn compile(patterns: &[&[u8]]) -> Self {
Self {
literal_set: GpuLiteralSet::compile(patterns),
}
}
#[must_use]
pub fn program(&self) -> &Program {
&self.literal_set.program
}
#[must_use]
pub fn literal_set_cache_key(&self) -> String {
use crate::scan::MatchScan;
MatchScan::cache_key(&self.literal_set)
}
#[must_use]
pub fn reference_scan(&self, haystack: &[u8]) -> Vec<Match> {
self.literal_set.reference_scan(haystack)
}
pub fn scan<B: VyreBackend + ?Sized>(
&self,
backend: &B,
haystack: &[u8],
max_matches: u32,
) -> Result<Vec<Match>, vyre::BackendError> {
self.literal_set.scan(backend, haystack, max_matches)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn direct_gpu_scanner_reuses_real_literal_set_program() {
let scanner = DirectGpuScanner::compile(&[b"abc", b"bc"]);
assert_eq!(
scanner.reference_scan(b"zabc"),
vec![Match::new(0, 1, 4), Match::new(1, 2, 4)]
);
assert_eq!(scanner.program().workgroup_size(), [32, 1, 1]);
assert!(!scanner.program().entry().is_empty());
}
}