| Index: chrome/browser/autofill/autofill_regexes.cc
|
| diff --git a/chrome/browser/autofill/autofill_regexes.cc b/chrome/browser/autofill/autofill_regexes.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5329958fc80c243bb4a8e1daec1f6048a0fea369
|
| --- /dev/null
|
| +++ b/chrome/browser/autofill/autofill_regexes.cc
|
| @@ -0,0 +1,84 @@
|
| +// Copyright (c) 2011 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.
|
| +
|
| +#include "chrome/browser/autofill/autofill_regexes.h"
|
| +
|
| +#include <map>
|
| +#include <utility>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/memory/singleton.h"
|
| +#include "base/stl_util-inl.h"
|
| +#include "base/string16.h"
|
| +#include "unicode/regex.h"
|
| +
|
| +namespace {
|
| +
|
| +// A singleton class that serves as a cache of compiled regex patterns.
|
| +class AutofillRegexes {
|
| + public:
|
| + static AutofillRegexes* GetInstance();
|
| +
|
| + // Returns the compiled regex matcher corresponding to |pattern|.
|
| + icu::RegexMatcher* GetMatcher(const string16& pattern);
|
| +
|
| + private:
|
| + AutofillRegexes();
|
| + ~AutofillRegexes();
|
| + friend struct DefaultSingletonTraits<AutofillRegexes>;
|
| +
|
| + // Maps patterns to their corresponding regex matchers.
|
| + std::map<string16, icu::RegexMatcher*> matchers_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AutofillRegexes);
|
| +};
|
| +
|
| +// static
|
| +AutofillRegexes* AutofillRegexes::GetInstance() {
|
| + return Singleton<AutofillRegexes>::get();
|
| +}
|
| +
|
| +AutofillRegexes::AutofillRegexes() {
|
| +}
|
| +
|
| +AutofillRegexes::~AutofillRegexes() {
|
| + STLDeleteContainerPairSecondPointers(matchers_.begin(),
|
| + matchers_.end());
|
| +}
|
| +
|
| +icu::RegexMatcher* AutofillRegexes::GetMatcher(const string16& pattern) {
|
| + if (!matchers_.count(pattern)) {
|
| + const icu::UnicodeString icu_pattern(pattern.data(), pattern.length());
|
| +
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + icu::RegexMatcher* matcher = new icu::RegexMatcher(icu_pattern,
|
| + UREGEX_CASE_INSENSITIVE,
|
| + status);
|
| + DCHECK(U_SUCCESS(status));
|
| +
|
| + matchers_.insert(std::make_pair(pattern, matcher));
|
| + }
|
| +
|
| + return matchers_[pattern];
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +namespace autofill {
|
| +
|
| +bool MatchesPattern(const string16& input, const string16& pattern) {
|
| + icu::RegexMatcher* matcher =
|
| + AutofillRegexes::GetInstance()->GetMatcher(pattern);
|
| + icu::UnicodeString icu_input(input.data(), input.length());
|
| + matcher->reset(icu_input);
|
| +
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UBool match = matcher->find(0, status);
|
| + DCHECK(U_SUCCESS(status));
|
| + return !!match;
|
| +}
|
| +
|
| +} // namespace autofill
|
| +
|
|
|