| 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_COPY_AND_ASSIGN(Prefilter); | |
| 101 }; | |
| 102 | |
| 103 } // namespace re2 | |
| 104 | |
| 105 #endif // RE2_PREFILTER_H_ | |
| OLD | NEW |