OLD | NEW |
(Empty) | |
| 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 |
| 34 Op op() { return op_; } |
| 35 const string& atom() const { return atom_; } |
| 36 void set_unique_id(int id) { unique_id_ = id; } |
| 37 int unique_id() const { return unique_id_; } |
| 38 |
| 39 // The children of the Prefilter node. |
| 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. |
| 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_ |
OLD | NEW |