1*a03ca8b9SKrzysztof Kosiński // Copyright 2017 The Chromium Authors. All rights reserved. 2*a03ca8b9SKrzysztof Kosiński // Use of this source code is governed by a BSD-style license that can be 3*a03ca8b9SKrzysztof Kosiński // found in the LICENSE file. 4*a03ca8b9SKrzysztof Kosiński 5*a03ca8b9SKrzysztof Kosiński #ifndef COMPONENTS_ZUCCHINI_REFERENCE_SET_H_ 6*a03ca8b9SKrzysztof Kosiński #define COMPONENTS_ZUCCHINI_REFERENCE_SET_H_ 7*a03ca8b9SKrzysztof Kosiński 8*a03ca8b9SKrzysztof Kosiński #include <stddef.h> 9*a03ca8b9SKrzysztof Kosiński 10*a03ca8b9SKrzysztof Kosiński #include <vector> 11*a03ca8b9SKrzysztof Kosiński 12*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/image_utils.h" 13*a03ca8b9SKrzysztof Kosiński 14*a03ca8b9SKrzysztof Kosiński namespace zucchini { 15*a03ca8b9SKrzysztof Kosiński 16*a03ca8b9SKrzysztof Kosiński class TargetPool; 17*a03ca8b9SKrzysztof Kosiński 18*a03ca8b9SKrzysztof Kosiński // Container of distinct references of one type, along with traits, only used 19*a03ca8b9SKrzysztof Kosiński // during patch generation. 20*a03ca8b9SKrzysztof Kosiński class ReferenceSet { 21*a03ca8b9SKrzysztof Kosiński public: 22*a03ca8b9SKrzysztof Kosiński using const_iterator = std::vector<Reference>::const_iterator; 23*a03ca8b9SKrzysztof Kosiński 24*a03ca8b9SKrzysztof Kosiński // |traits| specifies the reference represented. |target_pool| specifies 25*a03ca8b9SKrzysztof Kosiński // common targets shared by all reference represented, and mediates target 26*a03ca8b9SKrzysztof Kosiński // translation between offsets and indexes. 27*a03ca8b9SKrzysztof Kosiński ReferenceSet(const ReferenceTypeTraits& traits, 28*a03ca8b9SKrzysztof Kosiński const TargetPool& target_pool); 29*a03ca8b9SKrzysztof Kosiński ReferenceSet(const ReferenceSet&) = delete; 30*a03ca8b9SKrzysztof Kosiński ReferenceSet(ReferenceSet&&); 31*a03ca8b9SKrzysztof Kosiński ~ReferenceSet(); 32*a03ca8b9SKrzysztof Kosiński 33*a03ca8b9SKrzysztof Kosiński // Either one of the initializers below should be called exactly once. These 34*a03ca8b9SKrzysztof Kosiński // insert all references from |ref_reader/refs| into this class. The targets 35*a03ca8b9SKrzysztof Kosiński // of these references must be in |target_pool_|. 36*a03ca8b9SKrzysztof Kosiński void InitReferences(ReferenceReader&& ref_reader); 37*a03ca8b9SKrzysztof Kosiński void InitReferences(const std::vector<Reference>& refs); 38*a03ca8b9SKrzysztof Kosiński references()39*a03ca8b9SKrzysztof Kosiński const std::vector<Reference>& references() const { return references_; } traits()40*a03ca8b9SKrzysztof Kosiński const ReferenceTypeTraits& traits() const { return traits_; } target_pool()41*a03ca8b9SKrzysztof Kosiński const TargetPool& target_pool() const { return target_pool_; } type_tag()42*a03ca8b9SKrzysztof Kosiński TypeTag type_tag() const { return traits_.type_tag; } pool_tag()43*a03ca8b9SKrzysztof Kosiński PoolTag pool_tag() const { return traits_.pool_tag; } width()44*a03ca8b9SKrzysztof Kosiński offset_t width() const { return traits_.width; } 45*a03ca8b9SKrzysztof Kosiński 46*a03ca8b9SKrzysztof Kosiński // Looks up the Reference by an |offset| that it spans. |offset| is assumed to 47*a03ca8b9SKrzysztof Kosiński // be valid, i.e., |offset| must be spanned by some Reference in 48*a03ca8b9SKrzysztof Kosiński // |references_|. 49*a03ca8b9SKrzysztof Kosiński Reference at(offset_t offset) const; 50*a03ca8b9SKrzysztof Kosiński size()51*a03ca8b9SKrzysztof Kosiński size_t size() const { return references_.size(); } begin()52*a03ca8b9SKrzysztof Kosiński const_iterator begin() const { return references_.begin(); } end()53*a03ca8b9SKrzysztof Kosiński const_iterator end() const { return references_.end(); } 54*a03ca8b9SKrzysztof Kosiński 55*a03ca8b9SKrzysztof Kosiński private: 56*a03ca8b9SKrzysztof Kosiński ReferenceTypeTraits traits_; 57*a03ca8b9SKrzysztof Kosiński const TargetPool& target_pool_; 58*a03ca8b9SKrzysztof Kosiński // List of distinct Reference instances sorted by location. 59*a03ca8b9SKrzysztof Kosiński std::vector<Reference> references_; 60*a03ca8b9SKrzysztof Kosiński }; 61*a03ca8b9SKrzysztof Kosiński 62*a03ca8b9SKrzysztof Kosiński } // namespace zucchini 63*a03ca8b9SKrzysztof Kosiński 64*a03ca8b9SKrzysztof Kosiński #endif // COMPONENTS_ZUCCHINI_REFERENCE_SET_H_ 65