1 use crate::util::primitives::StateID;
2 
3 /// A collection of sentinel state IDs for Aho-Corasick automata.
4 ///
5 /// This specifically enables the technique by which we determine which states
6 /// are dead, matches or start states. Namely, by arranging states in a
7 /// particular order, we can determine the type of a state simply by looking at
8 /// its ID.
9 #[derive(Clone, Debug)]
10 pub(crate) struct Special {
11     /// The maximum ID of all the "special" states. This corresponds either to
12     /// start_anchored_id when a prefilter is active and max_match_id when a
13     /// prefilter is not active. The idea here is that if there is no prefilter,
14     /// then there is no point in treating start states as special.
15     pub(crate) max_special_id: StateID,
16     /// The maximum ID of all the match states. Any state ID bigger than this
17     /// is guaranteed to be a non-match ID.
18     ///
19     /// It is possible and legal for max_match_id to be equal to
20     /// start_anchored_id, which occurs precisely in the case where the empty
21     /// string is a pattern that was added to the underlying automaton.
22     pub(crate) max_match_id: StateID,
23     /// The state ID of the start state used for unanchored searches.
24     pub(crate) start_unanchored_id: StateID,
25     /// The state ID of the start state used for anchored searches. This is
26     /// always start_unanchored_id+1.
27     pub(crate) start_anchored_id: StateID,
28 }
29 
30 impl Special {
31     /// Create a new set of "special" state IDs with all IDs initialized to
32     /// zero. The general idea here is that they will be updated and set to
33     /// correct values later.
zero() -> Special34     pub(crate) fn zero() -> Special {
35         Special {
36             max_special_id: StateID::ZERO,
37             max_match_id: StateID::ZERO,
38             start_unanchored_id: StateID::ZERO,
39             start_anchored_id: StateID::ZERO,
40         }
41     }
42 }
43