1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- // 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_
|