Struct Finder
pub struct Finder(/* private fields */);
dep_memchr
only.Expand description
A “packed pair” finder that uses 128-bit vector operations.
This finder picks two bytes that it believes have high predictive power
for indicating an overall match of a needle. Depending on whether
Finder::find
or Finder::find_prefilter
is used, it reports offsets
where the needle matches or could match. In the prefilter case, candidates
are reported whenever the Pair
of bytes given matches.
Implementations§
§impl Finder
impl Finder
pub fn new(needle: &[u8]) -> Option<Finder> ⓘ
pub fn new(needle: &[u8]) -> Option<Finder> ⓘ
Create a new pair searcher. The searcher returned can either report
exact matches of needle
or act as a prefilter and report candidate
positions of needle
.
If SSE2 is unavailable in the current environment or if a Pair
could not be constructed from the needle given, then None
is
returned.
pub fn with_pair(needle: &[u8], pair: Pair) -> Option<Finder> ⓘ
pub fn with_pair(needle: &[u8], pair: Pair) -> Option<Finder> ⓘ
Create a new “packed pair” finder using the pair of bytes given.
This constructor permits callers to control precisely which pair of bytes is used as a predicate.
If SSE2 is unavailable in the current environment, then None
is
returned.
pub fn is_available() -> bool
pub fn is_available() -> bool
Returns true when this implementation is available in the current environment.
When this is true, it is guaranteed that Finder::with_pair
will
return a Some
value. Similarly, when it is false, it is guaranteed
that Finder::with_pair
will return a None
value. Notice that this
does not guarantee that Finder::new
will return a Finder
. Namely,
even when Finder::is_available
is true, it is not guaranteed that a
valid Pair
can be found from the needle given.
Note also that for the lifetime of a single program, if this returns true then it will always return true.
pub fn find(&self, haystack: &[u8], needle: &[u8]) -> Option<usize> ⓘ
pub fn find(&self, haystack: &[u8], needle: &[u8]) -> Option<usize> ⓘ
Execute a search using SSE2 vectors and routines.
§Panics
When haystack.len()
is less than Finder::min_haystack_len
.
pub fn find_prefilter(&self, haystack: &[u8]) -> Option<usize> ⓘ
pub fn find_prefilter(&self, haystack: &[u8]) -> Option<usize> ⓘ
Run this finder on the given haystack as a prefilter.
If a candidate match is found, then an offset where the needle could begin in the haystack is returned.
§Panics
When haystack.len()
is less than Finder::min_haystack_len
.
pub fn pair(&self) -> &Pair
pub fn pair(&self) -> &Pair
Returns the pair of offsets (into the needle) used to check as a predicate before confirming whether a needle exists at a particular position.
pub fn min_haystack_len(&self) -> usize ⓘ
pub fn min_haystack_len(&self) -> usize ⓘ
Returns the minimum haystack length that this Finder
can search.
Using a haystack with length smaller than this in a search will result in a panic. The reason for this restriction is that this finder is meant to be a low-level component that is part of a larger substring strategy. In that sense, it avoids trying to handle all cases and instead only handles the cases that it can handle very well.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Finder
impl RefUnwindSafe for Finder
impl Send for Finder
impl Sync for Finder
impl Unpin for Finder
impl UnwindSafe for Finder
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> ByteSized for T
impl<T> ByteSized for T
Source§const BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
Source§fn byte_align(&self) -> usize ⓘ
fn byte_align(&self) -> usize ⓘ
Source§fn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Source§impl<T, R> Chain<R> for Twhere
T: ?Sized,
impl<T, R> Chain<R> for Twhere
T: ?Sized,
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> ExtAny for T
impl<T> ExtAny for T
Source§fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Source§impl<T> ExtMem for Twhere
T: ?Sized,
impl<T> ExtMem for Twhere
T: ?Sized,
Source§const NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Source§fn mem_align_of_val(&self) -> usize ⓘ
fn mem_align_of_val(&self) -> usize ⓘ
Source§fn mem_size_of_val(&self) -> usize ⓘ
fn mem_size_of_val(&self) -> usize ⓘ
Source§fn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
true
if dropping values of this type matters. Read moreSource§fn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
self
without running its destructor. Read moreSource§fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Source§unsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§fn mem_as_bytes(&self) -> &[u8] ⓘ
fn mem_as_bytes(&self) -> &[u8] ⓘ
unsafe_slice
only.§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Hook for T
impl<T> Hook for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out
indicating that a T
is niched.