| // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef TOOLS_GN_PATTERN_H_ | 
 | #define TOOLS_GN_PATTERN_H_ | 
 |  | 
 | #include <stddef.h> | 
 |  | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "gn/value.h" | 
 |  | 
 | extern const char kFilePattern_Help[]; | 
 |  | 
 | class Pattern { | 
 |  public: | 
 |   struct Subrange { | 
 |     enum Type { | 
 |       LITERAL,       // Matches exactly the contents of the string. | 
 |       ANYTHING,      // * (zero or more chars). | 
 |       PATH_BOUNDARY  // '/' or beginning of string. | 
 |     }; | 
 |  | 
 |     explicit Subrange(Type t, const std::string& l = std::string()) | 
 |         : type(t), literal(l) {} | 
 |  | 
 |     // Returns the minimum number of chars that this subrange requires. | 
 |     size_t MinSize() const { | 
 |       switch (type) { | 
 |         case LITERAL: | 
 |           return literal.size(); | 
 |         case ANYTHING: | 
 |           return 0; | 
 |         case PATH_BOUNDARY: | 
 |           return 0;  // Can match beginning or end of string, which is 0 len. | 
 |         default: | 
 |           return 0; | 
 |       } | 
 |     } | 
 |  | 
 |     Type type; | 
 |  | 
 |     // When type == LITERAL this is the text to match. | 
 |     std::string literal; | 
 |   }; | 
 |  | 
 |   explicit Pattern(const std::string& s); | 
 |   Pattern(const Pattern& other); | 
 |   ~Pattern(); | 
 |  | 
 |   // Returns true if the current pattern matches the given string. | 
 |   bool MatchesString(const std::string& s) const; | 
 |  | 
 |  private: | 
 |   // allow_implicit_path_boundary determines if a path boundary should accept | 
 |   // matches at the beginning or end of the string. | 
 |   bool RecursiveMatch(const std::string& s, | 
 |                       size_t begin_char, | 
 |                       size_t subrange_index, | 
 |                       bool allow_implicit_path_boundary) const; | 
 |  | 
 |   std::vector<Subrange> subranges_; | 
 |  | 
 |   // Set to true when the subranges are "*foo" ("ANYTHING" followed by a | 
 |   // literal). This covers most patterns so we optimize for this. | 
 |   bool is_suffix_; | 
 | }; | 
 |  | 
 | class PatternList { | 
 |  public: | 
 |   PatternList(); | 
 |   PatternList(const PatternList& other); | 
 |   ~PatternList(); | 
 |  | 
 |   bool is_empty() const { return patterns_.empty(); } | 
 |  | 
 |   void Append(const Pattern& pattern); | 
 |  | 
 |   // Initializes the pattern list from a give list of pattern strings. Sets | 
 |   // |*err| on failure. | 
 |   void SetFromValue(const Value& v, Err* err); | 
 |  | 
 |   bool MatchesString(const std::string& s) const; | 
 |   bool MatchesValue(const Value& v) const; | 
 |  | 
 |  private: | 
 |   std::vector<Pattern> patterns_; | 
 | }; | 
 |  | 
 | #endif  // TOOLS_GN_PATTERN_H_ |