Home | History | Annotate | Download | only in re2
      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_
    106