Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Unified Diff: components/subresource_filter/core/common/fuzzy_pattern_matching.h

Issue 2153743002: Save failure function to FlatBuffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add newline. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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()); }

Powered by Google App Engine
This is Rietveld 408576698