pub struct SimdPatternMatcher;
impl SimdPatternMatcher {
pub fn find_pattern(text: &str, pattern: &str) -> Vec<usize> {
if pattern.is_empty() {
return vec![];
}
let mut positions = Vec::new();
let text_bytes = text.as_bytes();
let pattern_bytes = pattern.as_bytes();
for i in 0..=text_bytes.len().saturating_sub(pattern_bytes.len()) {
if text_bytes[i..i + pattern_bytes.len()] == *pattern_bytes {
positions.push(i);
}
}
positions
}
pub fn boyer_moore_search(text: &str, pattern: &str) -> Option<usize> {
text.find(pattern)
}
pub fn find_multiple_patterns(text: &str, patterns: &[&str]) -> Vec<(usize, usize)> {
let mut matches = Vec::new();
for (pattern_id, &pattern) in patterns.iter().enumerate() {
let positions = Self::find_pattern(text, pattern);
for pos in positions {
matches.push((pattern_id, pos));
}
}
matches.sort_by_key(|(_, pos)| *pos);
matches
}
}