// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_ZUCCHINI_EQUIVALENCE_MAP_H_ #define COMPONENTS_ZUCCHINI_EQUIVALENCE_MAP_H_ #include <stddef.h> #include <deque> #include <limits> #include <vector> #include "components/zucchini/image_index.h" #include "components/zucchini/image_utils.h" #include "components/zucchini/targets_affinity.h" namespace zucchini { constexpr double kMismatchFatal = …; class EncodedView; class EquivalenceSource; // Returns similarity score between a token (raw byte or first byte of a // reference) in |old_image_index| at |src| and a token in |new_image_index| // at |dst|. |targets_affinities| describes affinities for each target pool and // is used to evaluate similarity between references, hence it's size must be // equal to the number of pools in both |old_image_index| and |new_image_index|. // Both |src| and |dst| must refer to tokens in |old_image_index| and // |new_image_index|. double GetTokenSimilarity( const ImageIndex& old_image_index, const ImageIndex& new_image_index, const std::vector<TargetsAffinity>& targets_affinities, offset_t src, offset_t dst); // Returns a similarity score between content in |old_image_index| and // |new_image_index| at regions described by |equivalence|, using // |targets_affinities| to evaluate similarity between references. double GetEquivalenceSimilarity( const ImageIndex& old_image_index, const ImageIndex& new_image_index, const std::vector<TargetsAffinity>& targets_affinities, const Equivalence& equivalence); // Extends |equivalence| forward and returns the result. This is related to // VisitEquivalenceSeed(). EquivalenceCandidate ExtendEquivalenceForward( const ImageIndex& old_image_index, const ImageIndex& new_image_index, const std::vector<TargetsAffinity>& targets_affinities, const EquivalenceCandidate& equivalence, double min_similarity); // Extends |equivalence| backward and returns the result. This is related to // VisitEquivalenceSeed(). EquivalenceCandidate ExtendEquivalenceBackward( const ImageIndex& old_image_index, const ImageIndex& new_image_index, const std::vector<TargetsAffinity>& targets_affinities, const EquivalenceCandidate& equivalence, double min_similarity); // Creates an equivalence, starting with |src| and |dst| as offset hint, and // extends it both forward and backward, trying to maximise similarity between // |old_image_index| and |new_image_index|, and returns the result. // |targets_affinities| is used to evaluate similarity between references. // |min_similarity| describes the minimum acceptable similarity score and is // used as threshold to discard bad equivalences. EquivalenceCandidate VisitEquivalenceSeed( const ImageIndex& old_image_index, const ImageIndex& new_image_index, const std::vector<TargetsAffinity>& targets_affinities, offset_t src, offset_t dst, double min_similarity); // Container of pruned equivalences used to map offsets from |old_image| to // offsets in |new_image|. Equivalences are pruned by cropping smaller // equivalences to avoid overlaps, to make the equivalence map (for covered // bytes in |old_image| and |new_image|) one-to-one. class OffsetMapper { … }; // Container of equivalences between |old_image_index| and |new_image_index|, // sorted by |Equivalence::dst_offset|, only used during patch generation. class EquivalenceMap { … }; } // namespace zucchini #endif // COMPONENTS_ZUCCHINI_EQUIVALENCE_MAP_H_