| // Copyright 2017 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_TARGET_POOL_H_ |
| #define COMPONENTS_ZUCCHINI_TARGET_POOL_H_ |
| |
| #include <stddef.h> |
| |
| #include <vector> |
| |
| #include "components/zucchini/image_utils.h" |
| #include "components/zucchini/patch_reader.h" |
| |
| namespace zucchini { |
| |
| class OffsetMapper; |
| class TargetSource; |
| |
| // Ordered container of distinct targets that have the same semantics, along |
| // with a list of associated reference types, only used during patch generation. |
| class TargetPool { |
| public: |
| using const_iterator = std::vector<offset_t>::const_iterator; |
| |
| TargetPool(); |
| // Initializes the object with given sorted and unique |targets|. |
| explicit TargetPool(std::vector<offset_t>&& targets); |
| TargetPool(TargetPool&&); |
| TargetPool(const TargetPool&); |
| ~TargetPool(); |
| |
| // Insert new targets from various sources. These invalidate all previous key |
| // lookups. |
| // - From a list of targets, useful for adding extra targets in Zucchini-gen: |
| void InsertTargets(const std::vector<offset_t>& targets); |
| // - From TargetSource, useful for adding extra targets in Zucchini-apply: |
| void InsertTargets(TargetSource* targets); |
| // - From list of References, useful for listing targets in Zucchini-gen: |
| void InsertTargets(const std::vector<Reference>& references); |
| // - From ReferenceReader, useful for listing targets in Zucchini-apply: |
| void InsertTargets(ReferenceReader&& references); |
| |
| // Adds |type| as a reference type associated with the pool of targets. |
| void AddType(TypeTag type) { types_.push_back(type); } |
| |
| // Returns a canonical key associated with a valid target at |offset|. |
| key_t KeyForOffset(offset_t offset) const; |
| |
| // Returns a canonical key associated with the target nearest to |offset|. |
| key_t KeyForNearestOffset(offset_t offset) const; |
| |
| // Returns the target for a |key|, which is assumed to be valid and held by |
| // this class. |
| offset_t OffsetForKey(key_t key) const { return targets_[key]; } |
| |
| // Returns whether a particular key is valid. |
| bool KeyIsValid(key_t key) const { return key < targets_.size(); } |
| |
| // Uses |offset_mapper| to transform "old" |targets_| to "new" |targets_|, |
| // resulting in sorted and unique targets. |
| void FilterAndProject(const OffsetMapper& offset_mapper); |
| |
| // Accessors for testing. |
| const std::vector<offset_t>& targets() const { return targets_; } |
| const std::vector<TypeTag>& types() const { return types_; } |
| |
| // Returns the number of targets. |
| size_t size() const { return targets_.size(); } |
| const_iterator begin() const { return targets_.cbegin(); } |
| const_iterator end() const { return targets_.cend(); } |
| |
| private: |
| std::vector<TypeTag> types_; // Enumerates type_tag for this pool. |
| std::vector<offset_t> targets_; // Targets for pool in ascending order. |
| }; |
| |
| } // namespace zucchini |
| |
| #endif // COMPONENTS_ZUCCHINI_TARGET_POOL_H_ |