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

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

Issue 2793993002: [subresource_filter] Replace KMP by std::search. (Closed)
Patch Set: Fix tests. Created 3 years, 8 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 15e9fe792627a1f943403305a77e06bb3d35a2d0..12c3d2d2364a92ed8d5d1268fde333ec45544e20 100644
--- a/components/subresource_filter/core/common/fuzzy_pattern_matching.h
+++ b/components/subresource_filter/core/common/fuzzy_pattern_matching.h
@@ -24,7 +24,6 @@
#include "base/logging.h"
#include "base/strings/string_piece.h"
-#include "components/subresource_filter/core/common/knuth_morris_pratt.h"
namespace subresource_filter {
@@ -56,104 +55,12 @@ inline bool IsSeparator(char c) {
}
}
-class IsEqualOrBothSeparators {
- public:
- bool operator()(char first, char second) const {
- return first == second || (IsSeparator(first) && IsSeparator(second));
- }
-};
-
// Returns whether |text| starts with a fuzzy occurrence of |subpattern|.
bool StartsWithFuzzy(base::StringPiece text, base::StringPiece subpattern);
// Returns whether |text| ends with a fuzzy occurrence of |subpattern|.
bool EndsWithFuzzy(base::StringPiece text, base::StringPiece subpattern);
-// Appends elements of the Knuth-Morris-Pratt failure function corresponding to
-// |subpattern| at the end of the |failure| vector. All separator characters,
-// including the separator placeholder, are considered equivalent. This is
-// necessary in order to support fuzzy separator matching while also keeping the
-// 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<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.
-template <typename IntType>
-class AllOccurrencesFuzzy
- : private AllOccurrences<IntType, IsEqualOrBothSeparators> {
- public:
- using Base = AllOccurrences<IntType, IsEqualOrBothSeparators>;
- using BaseIterator = typename Base::Iterator;
-
- class Iterator : public BaseIterator {
- public:
- Iterator& operator++() {
- BaseIterator::operator++();
- AdvanceWhileFalsePositive();
- return *this;
- }
-
- Iterator operator++(int) {
- Iterator copy(*this);
- operator++();
- return copy;
- }
-
- private:
- friend class AllOccurrencesFuzzy;
-
- explicit Iterator(const BaseIterator& base_iterator)
- : BaseIterator(base_iterator) {
- AdvanceWhileFalsePositive();
- }
-
- const AllOccurrencesFuzzy& owner() const {
- 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 (BaseIterator::match_end_ != base::StringPiece::npos && !IsMatch())
- BaseIterator::operator++();
- }
-
- // Returns whether the currenct match meets all separators.
- bool IsMatch() const {
- 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(BaseIterator::match_end_ -
- owner().pattern_.size()),
- owner().pattern_);
- }
- };
-
- AllOccurrencesFuzzy(base::StringPiece text,
- base::StringPiece subpattern,
- const IntType* failure)
- : Base(text, subpattern, failure) {}
-
- Iterator begin() const { return Iterator(Base::begin()); }
- Iterator end() const { return Iterator(Base::end()); }
-};
-
} // namespace subresource_filter
#endif // COMPONENTS_SUBRESOURCE_FILTER_CORE_COMMON_FUZZY_PATTERN_MATCHING_H_

Powered by Google App Engine
This is Rietveld 408576698