| // Copyright 2018 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. |
| |
| #ifndef COMPONENTS_ZUCCHINI_IMPOSED_ENSEMBLE_MATCHER_H_ |
| #define COMPONENTS_ZUCCHINI_IMPOSED_ENSEMBLE_MATCHER_H_ |
| |
| #include <stddef.h> |
| |
| #include <string> |
| #include <vector> |
| |
| #include "components/zucchini/buffer_view.h" |
| #include "components/zucchini/element_detection.h" |
| #include "components/zucchini/ensemble_matcher.h" |
| |
| namespace zucchini { |
| |
| // A class to parse imposed match format, which is either an empty string (no |
| // imposed patch), or a string formatted as: |
| // "#+#=#+#,#+#=#+#,..." (e.g., "1+2=3+4", "1+2=3+4,5+6=7+8"), |
| // where "#+#=#+#" encodes a match as 4 unsigned integers: |
| // [offset in "old", size in "old", offset in "new", size in "new"]. |
| class ImposedMatchParser { |
| public: |
| enum Status { |
| kSuccess, |
| kInvalidDelimiter, |
| kParseError, |
| kOutOfBound, |
| kOverlapInNew, |
| kTypeMismatch, |
| }; |
| |
| ImposedMatchParser(); |
| ImposedMatchParser(const ImposedMatchParser&) = delete; |
| const ImposedMatchParser& operator=(const ImposedMatchParser&) = delete; |
| ~ImposedMatchParser(); |
| |
| // Parses |imposed_matches| and writes the results to member variables. |
| // |old_image| and |new_image| are used for validation. Returns a Status value |
| // to signal success or various error modes. |detector| is used to validate |
| // Element types for matched pairs. This should only be called once for each |
| // instance. |
| Status Parse(std::string imposed_matches, |
| ConstBufferView old_image, |
| ConstBufferView new_image, |
| ElementDetector&& detector); |
| |
| size_t num_identical() const { return num_identical_; } |
| std::vector<ElementMatch>* mutable_matches() { return &matches_; } |
| std::vector<ElementMatch>* mutable_bad_matches() { return &bad_matches_; } |
| |
| private: |
| size_t num_identical_ = 0; |
| std::vector<ElementMatch> matches_; |
| // Stores "forgiven" bad matches, so the caller can impose matches for |
| // unsupported image types (which will simply be ignored). Note that imposing |
| // matches for known but incompatible image types would result in error. |
| std::vector<ElementMatch> bad_matches_; |
| }; |
| |
| // An ensemble matcher that parses a format string that describes matches. |
| class ImposedEnsembleMatcher : public EnsembleMatcher { |
| public: |
| // |imposed_matches| specifies imposed maches, using a format described below. |
| // Validation is performed in RunMatch(). |
| explicit ImposedEnsembleMatcher(const std::string& imposed_matches); |
| ImposedEnsembleMatcher(const ImposedEnsembleMatcher&) = delete; |
| const ImposedEnsembleMatcher& operator=(const ImposedEnsembleMatcher&) = |
| delete; |
| ~ImposedEnsembleMatcher() override; |
| |
| // EnsembleMatcher: |
| bool RunMatch(ConstBufferView old_image, ConstBufferView new_image) override; |
| |
| private: |
| const std::string imposed_matches_; |
| }; |
| |
| } // namespace zucchini |
| |
| #endif // COMPONENTS_ZUCCHINI_IMPOSED_ENSEMBLE_MATCHER_H_ |