| // Copyright 2016 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/url_pattern_index/fuzzy_pattern_matching.h" |
| |
| #include <algorithm> |
| |
| #include "base/check_op.h" |
| |
| namespace url_pattern_index { |
| |
| namespace { |
| |
| bool StartsWithFuzzyImpl(base::StringPiece text, base::StringPiece subpattern) { |
| DCHECK_LE(subpattern.size(), text.size()); |
| |
| for (size_t i = 0; i != subpattern.size(); ++i) { |
| const char text_char = text[i]; |
| const char pattern_char = subpattern[i]; |
| if (text_char != pattern_char && |
| (pattern_char != kSeparatorPlaceholder || !IsSeparator(text_char))) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| } // namespace |
| |
| bool StartsWithFuzzy(base::StringPiece text, base::StringPiece subpattern) { |
| return subpattern.size() <= text.size() && |
| StartsWithFuzzyImpl(text, subpattern); |
| } |
| |
| bool EndsWithFuzzy(base::StringPiece text, base::StringPiece subpattern) { |
| return subpattern.size() <= text.size() && |
| StartsWithFuzzyImpl(text.substr(text.size() - subpattern.size()), |
| subpattern); |
| } |
| |
| size_t FindFuzzy(base::StringPiece text, |
| base::StringPiece subpattern, |
| size_t from) { |
| if (from > text.size()) |
| return base::StringPiece::npos; |
| if (subpattern.empty()) |
| return from; |
| |
| auto fuzzy_compare = [](char text_char, char subpattern_char) { |
| return text_char == subpattern_char || |
| (subpattern_char == kSeparatorPlaceholder && IsSeparator(text_char)); |
| }; |
| |
| base::StringPiece::const_iterator found = |
| std::search(text.begin() + from, text.end(), subpattern.begin(), |
| subpattern.end(), fuzzy_compare); |
| return found == text.end() ? base::StringPiece::npos : found - text.begin(); |
| } |
| |
| } // namespace url_pattern_index |