use crate::util::{ prefilter::PrefilterI, search::{MatchKind, Span}, }; #[derive(Clone, Debug)] pub(crate) struct ByteSet([bool; 256]); impl ByteSet { pub(crate) fn new>( _kind: MatchKind, needles: &[B], ) -> Option { #[cfg(not(feature = "perf-literal-multisubstring"))] { None } #[cfg(feature = "perf-literal-multisubstring")] { let mut set = [false; 256]; for needle in needles.iter() { let needle = needle.as_ref(); if needle.len() != 1 { return None; } set[usize::from(needle[0])] = true; } Some(ByteSet(set)) } } } impl PrefilterI for ByteSet { fn find(&self, haystack: &[u8], span: Span) -> Option { haystack[span].iter().position(|&b| self.0[usize::from(b)]).map(|i| { let start = span.start + i; let end = start + 1; Span { start, end } }) } fn prefix(&self, haystack: &[u8], span: Span) -> Option { let b = *haystack.get(span.start)?; if self.0[usize::from(b)] { Some(Span { start: span.start, end: span.start + 1 }) } else { None } } fn memory_usage(&self) -> usize { 0 } fn is_fast(&self) -> bool { false } }