diff options
author | Zeno Albisser <zeno.albisser@digia.com> | 2013-08-15 21:46:11 +0200 |
---|---|---|
committer | Zeno Albisser <zeno.albisser@digia.com> | 2013-08-15 21:46:11 +0200 |
commit | 679147eead574d186ebf3069647b4c23e8ccace6 (patch) | |
tree | fc247a0ac8ff119f7c8550879ebb6d3dd8d1ff69 /chromium/tools/gn/pattern.h | |
download | qtwebengine-chromium-679147eead574d186ebf3069647b4c23e8ccace6.tar.gz |
Initial import.
Diffstat (limited to 'chromium/tools/gn/pattern.h')
-rw-r--r-- | chromium/tools/gn/pattern.h | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/chromium/tools/gn/pattern.h b/chromium/tools/gn/pattern.h new file mode 100644 index 00000000000..582cfeab8aa --- /dev/null +++ b/chromium/tools/gn/pattern.h @@ -0,0 +1,86 @@ +// 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 <string> +#include <vector> + +#include "tools/gn/value.h" + +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. + }; + + 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; + }; + + Pattern(const std::string& s); + ~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(); + + bool is_empty() const { return patterns_.empty(); } + + // 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_ |