| // 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_REFERENCE_SET_H_ |
| #define COMPONENTS_ZUCCHINI_REFERENCE_SET_H_ |
| |
| #include <stddef.h> |
| |
| #include <vector> |
| |
| #include "components/zucchini/image_utils.h" |
| |
| namespace zucchini { |
| |
| class TargetPool; |
| |
| // Container of distinct references of one type, along with traits, only used |
| // during patch generation. |
| class ReferenceSet { |
| public: |
| using const_iterator = std::vector<Reference>::const_iterator; |
| |
| // |traits| specifies the reference represented. |target_pool| specifies |
| // common targets shared by all reference represented, and mediates target |
| // translation between offsets and indexes. |
| ReferenceSet(const ReferenceTypeTraits& traits, |
| const TargetPool& target_pool); |
| ReferenceSet(const ReferenceSet&) = delete; |
| ReferenceSet(ReferenceSet&&); |
| ~ReferenceSet(); |
| |
| // Either one of the initializers below should be called exactly once. These |
| // insert all references from |ref_reader/refs| into this class. The targets |
| // of these references must be in |target_pool_|. |
| void InitReferences(ReferenceReader&& ref_reader); |
| void InitReferences(const std::vector<Reference>& refs); |
| |
| const std::vector<Reference>& references() const { return references_; } |
| const ReferenceTypeTraits& traits() const { return traits_; } |
| const TargetPool& target_pool() const { return target_pool_; } |
| TypeTag type_tag() const { return traits_.type_tag; } |
| PoolTag pool_tag() const { return traits_.pool_tag; } |
| offset_t width() const { return traits_.width; } |
| |
| // Looks up the Reference by an |offset| that it spans. |offset| is assumed to |
| // be valid, i.e., |offset| must be spanned by some Reference in |
| // |references_|. |
| Reference at(offset_t offset) const; |
| |
| size_t size() const { return references_.size(); } |
| const_iterator begin() const { return references_.begin(); } |
| const_iterator end() const { return references_.end(); } |
| |
| private: |
| ReferenceTypeTraits traits_; |
| const TargetPool& target_pool_; |
| // List of distinct Reference instances sorted by location. |
| std::vector<Reference> references_; |
| }; |
| |
| } // namespace zucchini |
| |
| #endif // COMPONENTS_ZUCCHINI_REFERENCE_SET_H_ |