| Index: components/subresource_filter/core/common/fuzzy_pattern_matching.h
|
| diff --git a/components/subresource_filter/core/common/fuzzy_pattern_matching.h b/components/subresource_filter/core/common/fuzzy_pattern_matching.h
|
| index b9f7701a7c0d64704e66350015fe96144d59ccb1..586190abd54ae240b35003a1d8173d1f9c9e9a5f 100644
|
| --- a/components/subresource_filter/core/common/fuzzy_pattern_matching.h
|
| +++ b/components/subresource_filter/core/common/fuzzy_pattern_matching.h
|
| @@ -19,6 +19,7 @@
|
|
|
| #include <stddef.h>
|
|
|
| +#include <type_traits>
|
| #include <vector>
|
|
|
| #include "base/logging.h"
|
| @@ -75,23 +76,33 @@ bool EndsWithFuzzy(base::StringPiece text, base::StringPiece subpattern);
|
| // equality predicate transitive and symmetric which is needed for KMP. However,
|
| // the separators will need to be checked in a second pass for KMP match
|
| // candidates, which is implemented by AllOccurrencesFuzzy.
|
| +template <typename FailureFunctionElement>
|
| void BuildFailureFunctionFuzzy(base::StringPiece subpattern,
|
| - std::vector<size_t>* failure);
|
| + std::vector<FailureFunctionElement>* failure) {
|
| + static_assert(std::is_unsigned<FailureFunctionElement>::value,
|
| + "The type is not unsigned.");
|
| + BuildFailureFunction<FailureFunctionElement, IsEqualOrBothSeparators>(
|
| + subpattern, failure);
|
| +}
|
|
|
| // Iterator range that yields all fuzzy occurrences of |subpattern| in |text|.
|
| // The values in the range are the positions just beyond each occurrence.
|
| +// Out-of-range iterators are dereferenced to base::StringPiece::npos.
|
| //
|
| // The |failure| array is the failure function created by
|
| // BuildFailureFunctionFuzzy for the same |subpattern|, and containing at least
|
| // subpattern.size() values.
|
| -class AllOccurrencesFuzzy : private AllOccurrences<IsEqualOrBothSeparators> {
|
| +template <typename IntType>
|
| +class AllOccurrencesFuzzy
|
| + : private AllOccurrences<IntType, IsEqualOrBothSeparators> {
|
| public:
|
| - using Base = AllOccurrences<IsEqualOrBothSeparators>;
|
| + using Base = AllOccurrences<IntType, IsEqualOrBothSeparators>;
|
| + using BaseIterator = typename Base::Iterator;
|
|
|
| - class Iterator : public Base::Iterator {
|
| + class Iterator : public BaseIterator {
|
| public:
|
| Iterator& operator++() {
|
| - Base::Iterator::operator++();
|
| + BaseIterator::operator++();
|
| AdvanceWhileFalsePositive();
|
| return *this;
|
| }
|
| @@ -105,38 +116,38 @@ class AllOccurrencesFuzzy : private AllOccurrences<IsEqualOrBothSeparators> {
|
| private:
|
| friend class AllOccurrencesFuzzy;
|
|
|
| - explicit Iterator(const Base::Iterator& base_iterator)
|
| - : Base::Iterator(base_iterator) {
|
| + explicit Iterator(const BaseIterator& base_iterator)
|
| + : BaseIterator(base_iterator) {
|
| AdvanceWhileFalsePositive();
|
| }
|
|
|
| const AllOccurrencesFuzzy& owner() const {
|
| - return *static_cast<const AllOccurrencesFuzzy*>(owner_);
|
| + return *static_cast<const AllOccurrencesFuzzy*>(BaseIterator::owner_);
|
| }
|
|
|
| // Moves the iterator forward until it either reaches the end, or meets an
|
| // occurrence exactly matching all non-placeholder separators.
|
| void AdvanceWhileFalsePositive() {
|
| - while (match_end_ != base::StringPiece::npos && !IsMatch())
|
| - Base::Iterator::operator++();
|
| + while (BaseIterator::match_end_ != base::StringPiece::npos && !IsMatch())
|
| + BaseIterator::operator++();
|
| }
|
|
|
| // Returns whether the currenct match meets all separators.
|
| bool IsMatch() const {
|
| - DCHECK_LE(match_end_, owner().text_.size());
|
| - DCHECK_GE(match_end_, owner().pattern_.size());
|
| + DCHECK_LE(BaseIterator::match_end_, owner().text_.size());
|
| + DCHECK_GE(BaseIterator::match_end_, owner().pattern_.size());
|
|
|
| // TODO(pkalinnikov): Store a vector of separator positions externally and
|
| // check if they are equal to the corresponding characters of the |text|.
|
| - return StartsWithFuzzy(
|
| - owner().text_.substr(match_end_ - owner().pattern_.size()),
|
| - owner().pattern_);
|
| + return StartsWithFuzzy(owner().text_.substr(BaseIterator::match_end_ -
|
| + owner().pattern_.size()),
|
| + owner().pattern_);
|
| }
|
| };
|
|
|
| AllOccurrencesFuzzy(base::StringPiece text,
|
| base::StringPiece subpattern,
|
| - const size_t* failure)
|
| + const IntType* failure)
|
| : Base(text, subpattern, failure) {}
|
|
|
| Iterator begin() const { return Iterator(Base::begin()); }
|
|
|