xref: /aosp_15_r20/external/regex-re2/re2/set.h (revision ccdc9c3e24c519bfa4832a66aa2e83a52c19f295)
1*ccdc9c3eSSadaf Ebrahimi // Copyright 2010 The RE2 Authors.  All Rights Reserved.
2*ccdc9c3eSSadaf Ebrahimi // Use of this source code is governed by a BSD-style
3*ccdc9c3eSSadaf Ebrahimi // license that can be found in the LICENSE file.
4*ccdc9c3eSSadaf Ebrahimi 
5*ccdc9c3eSSadaf Ebrahimi #ifndef RE2_SET_H_
6*ccdc9c3eSSadaf Ebrahimi #define RE2_SET_H_
7*ccdc9c3eSSadaf Ebrahimi 
8*ccdc9c3eSSadaf Ebrahimi #include <string>
9*ccdc9c3eSSadaf Ebrahimi #include <utility>
10*ccdc9c3eSSadaf Ebrahimi #include <vector>
11*ccdc9c3eSSadaf Ebrahimi 
12*ccdc9c3eSSadaf Ebrahimi #include "re2/re2.h"
13*ccdc9c3eSSadaf Ebrahimi 
14*ccdc9c3eSSadaf Ebrahimi namespace re2 {
15*ccdc9c3eSSadaf Ebrahimi class Prog;
16*ccdc9c3eSSadaf Ebrahimi class Regexp;
17*ccdc9c3eSSadaf Ebrahimi }  // namespace re2
18*ccdc9c3eSSadaf Ebrahimi 
19*ccdc9c3eSSadaf Ebrahimi namespace re2 {
20*ccdc9c3eSSadaf Ebrahimi 
21*ccdc9c3eSSadaf Ebrahimi // An RE2::Set represents a collection of regexps that can
22*ccdc9c3eSSadaf Ebrahimi // be searched for simultaneously.
23*ccdc9c3eSSadaf Ebrahimi class RE2::Set {
24*ccdc9c3eSSadaf Ebrahimi  public:
25*ccdc9c3eSSadaf Ebrahimi   enum ErrorKind {
26*ccdc9c3eSSadaf Ebrahimi     kNoError = 0,
27*ccdc9c3eSSadaf Ebrahimi     kNotCompiled,   // The set is not compiled.
28*ccdc9c3eSSadaf Ebrahimi     kOutOfMemory,   // The DFA ran out of memory.
29*ccdc9c3eSSadaf Ebrahimi     kInconsistent,  // The result is inconsistent. This should never happen.
30*ccdc9c3eSSadaf Ebrahimi   };
31*ccdc9c3eSSadaf Ebrahimi 
32*ccdc9c3eSSadaf Ebrahimi   struct ErrorInfo {
33*ccdc9c3eSSadaf Ebrahimi     ErrorKind kind;
34*ccdc9c3eSSadaf Ebrahimi   };
35*ccdc9c3eSSadaf Ebrahimi 
36*ccdc9c3eSSadaf Ebrahimi   Set(const RE2::Options& options, RE2::Anchor anchor);
37*ccdc9c3eSSadaf Ebrahimi   ~Set();
38*ccdc9c3eSSadaf Ebrahimi 
39*ccdc9c3eSSadaf Ebrahimi   // Adds pattern to the set using the options passed to the constructor.
40*ccdc9c3eSSadaf Ebrahimi   // Returns the index that will identify the regexp in the output of Match(),
41*ccdc9c3eSSadaf Ebrahimi   // or -1 if the regexp cannot be parsed.
42*ccdc9c3eSSadaf Ebrahimi   // Indices are assigned in sequential order starting from 0.
43*ccdc9c3eSSadaf Ebrahimi   // Errors do not increment the index; if error is not NULL, *error will hold
44*ccdc9c3eSSadaf Ebrahimi   // the error message from the parser.
45*ccdc9c3eSSadaf Ebrahimi   int Add(const StringPiece& pattern, string* error);
46*ccdc9c3eSSadaf Ebrahimi 
47*ccdc9c3eSSadaf Ebrahimi   // Compiles the set in preparation for matching.
48*ccdc9c3eSSadaf Ebrahimi   // Returns false if the compiler runs out of memory.
49*ccdc9c3eSSadaf Ebrahimi   // Add() must not be called again after Compile().
50*ccdc9c3eSSadaf Ebrahimi   // Compile() must be called before Match().
51*ccdc9c3eSSadaf Ebrahimi   bool Compile();
52*ccdc9c3eSSadaf Ebrahimi 
53*ccdc9c3eSSadaf Ebrahimi   // Returns true if text matches at least one of the regexps in the set.
54*ccdc9c3eSSadaf Ebrahimi   // Fills v (if not NULL) with the indices of the matching regexps.
55*ccdc9c3eSSadaf Ebrahimi   // Callers must not expect v to be sorted.
56*ccdc9c3eSSadaf Ebrahimi   bool Match(const StringPiece& text, std::vector<int>* v) const;
57*ccdc9c3eSSadaf Ebrahimi 
58*ccdc9c3eSSadaf Ebrahimi   // As above, but populates error_info (if not NULL) when none of the regexps
59*ccdc9c3eSSadaf Ebrahimi   // in the set matched. This can inform callers when DFA execution fails, for
60*ccdc9c3eSSadaf Ebrahimi   // example, because they might wish to handle that case differently.
61*ccdc9c3eSSadaf Ebrahimi   bool Match(const StringPiece& text, std::vector<int>* v,
62*ccdc9c3eSSadaf Ebrahimi              ErrorInfo* error_info) const;
63*ccdc9c3eSSadaf Ebrahimi 
64*ccdc9c3eSSadaf Ebrahimi  private:
65*ccdc9c3eSSadaf Ebrahimi   typedef std::pair<string, re2::Regexp*> Elem;
66*ccdc9c3eSSadaf Ebrahimi 
67*ccdc9c3eSSadaf Ebrahimi   RE2::Options options_;
68*ccdc9c3eSSadaf Ebrahimi   RE2::Anchor anchor_;
69*ccdc9c3eSSadaf Ebrahimi   std::vector<Elem> elem_;
70*ccdc9c3eSSadaf Ebrahimi   re2::Prog* prog_;
71*ccdc9c3eSSadaf Ebrahimi   bool compiled_;
72*ccdc9c3eSSadaf Ebrahimi   int size_;
73*ccdc9c3eSSadaf Ebrahimi 
74*ccdc9c3eSSadaf Ebrahimi   Set(const Set&) = delete;
75*ccdc9c3eSSadaf Ebrahimi   Set& operator=(const Set&) = delete;
76*ccdc9c3eSSadaf Ebrahimi };
77*ccdc9c3eSSadaf Ebrahimi 
78*ccdc9c3eSSadaf Ebrahimi }  // namespace re2
79*ccdc9c3eSSadaf Ebrahimi 
80*ccdc9c3eSSadaf Ebrahimi #endif  // RE2_SET_H_
81