pub(crate) struct Searcher {
call: unsafe fn(searcher: &Searcher, prestate: &mut PrefilterState, haystack: &[u8], needle: &[u8]) -> Option<usize>,
kind: SearcherKind,
rabinkarp: Finder,
}
Expand description
A “meta” substring searcher.
To a first approximation, this chooses what it believes to be the “best”
substring search implemnetation based on the needle at construction time.
Then, every call to find
will execute that particular implementation. To
a second approximation, multiple substring search algorithms may be used,
depending on the haystack. For example, for supremely short haystacks,
Rabin-Karp is typically used.
See the documentation on Prefilter
for an explanation of the dispatching
mechanism. The quick summary is that an enum has too much overhead and
we can’t use dynamic dispatch via traits because we need to work in a
core-only environment. (Dynamic dispatch works in core-only, but you
need &dyn Trait
and we really need a Box<dyn Trait>
here. The latter
requires alloc
.) So instead, we use a union and an appropriately paired
free function to read from the correct field on the union and execute the
chosen substring search implementation.
Fields§
§call: unsafe fn(searcher: &Searcher, prestate: &mut PrefilterState, haystack: &[u8], needle: &[u8]) -> Option<usize>
§kind: SearcherKind
§rabinkarp: Finder
Implementations§
source§impl Searcher
impl Searcher
sourcepub(crate) fn new<R: HeuristicFrequencyRank>(
prefilter: PrefilterConfig,
ranker: R,
needle: &[u8],
) -> Searcher
pub(crate) fn new<R: HeuristicFrequencyRank>( prefilter: PrefilterConfig, ranker: R, needle: &[u8], ) -> Searcher
Creates a new “meta” substring searcher that attempts to choose the best algorithm based on the needle, heuristics and what the current target supports.
sourcefn twoway(
needle: &[u8],
rabinkarp: Finder,
prestrat: Option<Prefilter>,
) -> Searcher
fn twoway( needle: &[u8], rabinkarp: Finder, prestrat: Option<Prefilter>, ) -> Searcher
Creates a new searcher that always uses the Two-Way algorithm. This is typically used when vector algorithms are unavailable or inappropriate. (For example, when the needle is “too long.”)
If a prefilter is given, then the searcher returned will be accelerated by the prefilter.
sourcepub(crate) fn find(
&self,
prestate: &mut PrefilterState,
haystack: &[u8],
needle: &[u8],
) -> Option<usize>
pub(crate) fn find( &self, prestate: &mut PrefilterState, haystack: &[u8], needle: &[u8], ) -> Option<usize>
Searches the given haystack for the given needle. The needle given should be the same as the needle that this finder was initialized with.
Inlining this can lead to big wins for latency, and #[inline] doesn’t seem to be enough in some cases.