xref: /aosp_15_r20/external/zucchini/reference_set.h (revision a03ca8b91e029cd15055c20c78c2e087c84792e4)
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