scirs2_text/simd_ops/
pattern_matching.rs1pub struct SimdPatternMatcher;
7
8impl SimdPatternMatcher {
9 pub fn find_pattern(text: &str, pattern: &str) -> Vec<usize> {
11 if pattern.is_empty() {
12 return vec![];
13 }
14
15 let mut positions = Vec::new();
16 let text_bytes = text.as_bytes();
17 let pattern_bytes = pattern.as_bytes();
18
19 for i in 0..=text_bytes.len().saturating_sub(pattern_bytes.len()) {
20 if text_bytes[i..i + pattern_bytes.len()] == *pattern_bytes {
21 positions.push(i);
22 }
23 }
24
25 positions
26 }
27
28 pub fn boyer_moore_search(text: &str, pattern: &str) -> Option<usize> {
30 text.find(pattern)
32 }
33
34 pub fn find_multiple_patterns(text: &str, patterns: &[&str]) -> Vec<(usize, usize)> {
36 let mut matches = Vec::new();
37
38 for (pattern_id, &pattern) in patterns.iter().enumerate() {
39 let positions = Self::find_pattern(text, pattern);
40 for pos in positions {
41 matches.push((pattern_id, pos));
42 }
43 }
44
45 matches.sort_by_key(|(_, pos)| *pos);
46 matches
47 }
48}