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