blob: 92b6032c17f0e57990ee3d35c86b8f2d4751b62e [file] [log] [blame]
pkalinnikovea350602016-06-24 11:22:151// Copyright 2016 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Pavel Kalinnikovd7970632017-06-20 09:07:345#include "components/url_pattern_index/fuzzy_pattern_matching.h"
pkalinnikovea350602016-06-24 11:22:156
pkalinnikov35d18812017-04-05 17:28:187#include <algorithm>
8
Pavel Kalinnikovd7970632017-06-20 09:07:349namespace url_pattern_index {
pkalinnikovea350602016-06-24 11:22:1510
11namespace {
12
13bool StartsWithFuzzyImpl(base::StringPiece text, base::StringPiece subpattern) {
14 DCHECK_LE(subpattern.size(), text.size());
15
16 for (size_t i = 0; i != subpattern.size(); ++i) {
17 const char text_char = text[i];
18 const char pattern_char = subpattern[i];
19 if (text_char != pattern_char &&
20 (pattern_char != kSeparatorPlaceholder || !IsSeparator(text_char))) {
21 return false;
22 }
23 }
24 return true;
25}
26
27} // namespace
28
pkalinnikovea350602016-06-24 11:22:1529bool StartsWithFuzzy(base::StringPiece text, base::StringPiece subpattern) {
pkalinnikov854818d62016-07-22 11:55:1030 return subpattern.size() <= text.size() &&
31 StartsWithFuzzyImpl(text, subpattern);
pkalinnikovea350602016-06-24 11:22:1532}
33
34bool EndsWithFuzzy(base::StringPiece text, base::StringPiece subpattern) {
pkalinnikov854818d62016-07-22 11:55:1035 return subpattern.size() <= text.size() &&
36 StartsWithFuzzyImpl(text.substr(text.size() - subpattern.size()),
37 subpattern);
pkalinnikovea350602016-06-24 11:22:1538}
39
pkalinnikov35d18812017-04-05 17:28:1840size_t FindFuzzy(base::StringPiece text,
41 base::StringPiece subpattern,
42 size_t from) {
43 if (from > text.size())
44 return base::StringPiece::npos;
45 if (subpattern.empty())
46 return from;
47
48 auto fuzzy_compare = [](char text_char, char subpattern_char) {
49 return text_char == subpattern_char ||
50 (subpattern_char == kSeparatorPlaceholder && IsSeparator(text_char));
51 };
52
53 base::StringPiece::const_iterator found =
54 std::search(text.begin() + from, text.end(), subpattern.begin(),
55 subpattern.end(), fuzzy_compare);
56 return found == text.end() ? base::StringPiece::npos : found - text.begin();
57}
58
Pavel Kalinnikovd7970632017-06-20 09:07:3459} // namespace url_pattern_index