Struct NFA

pub struct NFA { /* private fields */ }

A noncontiguous NFA implementation of Aho-Corasick.

When possible, prefer using AhoCorasick instead of this type directly. Using an NFA directly is typically only necessary when one needs access to the Automaton trait implementation.

This NFA represents the "core" implementation of Aho-Corasick in this crate. Namely, constructing this NFA involving building a trie and then filling in the failure transitions between states, similar to what is described in any standard textbook description of Aho-Corasick.

In order to minimize heap usage and to avoid additional construction costs, this implementation represents the transitions of all states as distinct sparse memory allocations. This is where it gets its name from. That is, this NFA has no contiguous memory allocation for its transition table. Each state gets its own allocation.

While the sparse representation keeps memory usage to somewhat reasonable levels, it is still quite large and also results in somewhat mediocre search performance. For this reason, it is almost always a good idea to use a contiguous::NFA instead. It is marginally slower to build, but has higher throughput and can sometimes use an order of magnitude less memory. The main reason to use a noncontiguous NFA is when you need the fastest possible construction time, or when a contiguous NFA does not have the desired capacity. (The total number of NFA states it can have is fewer than a noncontiguous NFA.)

Example

This example shows how to build an NFA directly and use it to execute [Automaton::try_find]:

use aho_corasick::{
    automaton::Automaton,
    nfa::noncontiguous::NFA,
    Input, Match,
};

let patterns = &["b", "abc", "abcd"];
let haystack = "abcd";

let nfa = NFA::new(patterns).unwrap();
assert_eq!(
    Some(Match::must(0, 1..2)),
    nfa.try_find(&Input::new(haystack))?,
);
# Ok::<(), Box<dyn std::error::Error>>(())

It is also possible to implement your own version of try_find. See the Automaton documentation for an example.

Implementations

impl NFA

fn new<I, P>(patterns: I) -> Result<NFA, BuildError>
where
    I: IntoIterator<Item = P>,
    P: AsRef<[u8]>,

Create a new Aho-Corasick noncontiguous NFA using the default configuration.

Use a Builder if you want to change the configuration.

fn builder() -> Builder

A convenience method for returning a new Aho-Corasick noncontiguous NFA builder.

This usually permits one to just import the NFA type.

Trait Implementations

impl Automaton for NFA

fn start_state(&self, anchored: Anchored) -> Result<StateID, MatchError>
fn next_state(&self, anchored: Anchored, sid: StateID, byte: u8) -> StateID
fn is_special(&self, sid: StateID) -> bool
fn is_dead(&self, sid: StateID) -> bool
fn is_match(&self, sid: StateID) -> bool
fn is_start(&self, sid: StateID) -> bool
fn match_kind(&self) -> MatchKind
fn patterns_len(&self) -> usize
fn pattern_len(&self, pid: PatternID) -> usize
fn min_pattern_len(&self) -> usize
fn max_pattern_len(&self) -> usize
fn match_len(&self, sid: StateID) -> usize
fn match_pattern(&self, sid: StateID, index: usize) -> PatternID
fn memory_usage(&self) -> usize
fn prefilter(&self) -> Option<&Prefilter>

impl Clone for NFA

fn clone(&self) -> Self

impl Debug for NFA

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Auto Trait Implementations

impl Freeze for NFA

impl RefUnwindSafe for NFA

impl Send for NFA

impl Sync for NFA

impl Unpin for NFA

impl UnsafeUnpin for NFA

impl UnwindSafe for NFA

Blanket Implementations

impl<T> Any for NFA where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for NFA where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for NFA where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

impl<T> CloneToUninit for NFA where T: Clone,

unsafe fn clone_to_uninit(&self, dest: *mut u8)

impl<T> From<T> for NFA

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> ToOwned for NFA where T: Clone,

type Owned = T;
fn to_owned(&self) -> T
fn clone_into(&self, target: &mut T)

impl<T, U> Into<U> for NFA where U: From<T>,

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom<U> for NFA where U: Into<T>,

type Error = never;
fn try_from(value: U) -> Result<T, never>

impl<T, U> TryInto<U> for NFA where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error;
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>