1 // Copyright 2009 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 // Prefilter is the class used to extract string guards from regexps.
6 // Rather than using Prefilter class directly, use FilteredRE2.
7 // See filtered_re2.h
8 
9 #ifndef RE2_PREFILTER_H_
10 #define RE2_PREFILTER_H_
11 
12 #include "util/util.h"
13 
14 namespace re2 {
15 
16 class RE2;
17 
18 class Regexp;
19 
20 class Prefilter {
21   // Instead of using Prefilter directly, use FilteredRE2; see filtered_re2.h
22  public:
23   enum Op {
24     ALL = 0,  // Everything matches
25     NONE,  // Nothing matches
26     ATOM,  // The string atom() must match
27     AND,   // All in subs() must match
28     OR,   // One of subs() must match
29   };
30 
31   explicit Prefilter(Op op);
32   ~Prefilter();
33 
op()34   Op op() { return op_; }
atom()35   const string& atom() const { return atom_; }
set_unique_id(int id)36   void set_unique_id(int id) { unique_id_ = id; }
unique_id()37   int unique_id() const { return unique_id_; }
38 
39   // The children of the Prefilter node.
subs()40   vector<Prefilter*>* subs() {
41     CHECK(op_ == AND || op_ == OR);
42     return subs_;
43   }
44 
45   // Set the children vector. Prefilter takes ownership of subs and
46   // subs_ will be deleted when Prefilter is deleted.
set_subs(vector<Prefilter * > * subs)47   void set_subs(vector<Prefilter*>* subs) { subs_ = subs; }
48 
49   // Given a RE2, return a Prefilter. The caller takes ownership of
50   // the Prefilter and should deallocate it. Returns NULL if Prefilter
51   // cannot be formed.
52   static Prefilter* FromRE2(const RE2* re2);
53 
54   // Returns a readable debug string of the prefilter.
55   string DebugString() const;
56 
57  private:
58   class Info;
59 
60   // Combines two prefilters together to create an AND. The passed
61   // Prefilters will be part of the returned Prefilter or deleted.
62   static Prefilter* And(Prefilter* a, Prefilter* b);
63 
64   // Combines two prefilters together to create an OR. The passed
65   // Prefilters will be part of the returned Prefilter or deleted.
66   static Prefilter* Or(Prefilter* a, Prefilter* b);
67 
68   // Generalized And/Or
69   static Prefilter* AndOr(Op op, Prefilter* a, Prefilter* b);
70 
71   static Prefilter* FromRegexp(Regexp* a);
72 
73   static Prefilter* FromString(const string& str);
74 
75   static Prefilter* OrStrings(set<string>* ss);
76 
77   static Info* BuildInfo(Regexp* re);
78 
79   Prefilter* Simplify();
80 
81   // Kind of Prefilter.
82   Op op_;
83 
84   // Sub-matches for AND or OR Prefilter.
85   vector<Prefilter*>* subs_;
86 
87   // Actual string to match in leaf node.
88   string atom_;
89 
90   // If different prefilters have the same string atom, or if they are
91   // structurally the same (e.g., OR of same atom strings) they are
92   // considered the same unique nodes. This is the id for each unique
93   // node. This field is populated with a unique id for every node,
94   // and -1 for duplicate nodes.
95   int unique_id_;
96 
97   // Used for debugging, helps in tracking memory leaks.
98   int alloc_id_;
99 
100   DISALLOW_EVIL_CONSTRUCTORS(Prefilter);
101 };
102 
103 }  // namespace re2
104 
105 #endif  // RE2_PREFILTER_H_
106