xref: /aosp_15_r20/external/zucchini/reference_set.cc (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 #include "components/zucchini/reference_set.h"
6*a03ca8b9SKrzysztof Kosiński 
7*a03ca8b9SKrzysztof Kosiński #include <algorithm>
8*a03ca8b9SKrzysztof Kosiński #include <iterator>
9*a03ca8b9SKrzysztof Kosiński 
10*a03ca8b9SKrzysztof Kosiński #include "base/check_op.h"
11*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/target_pool.h"
12*a03ca8b9SKrzysztof Kosiński 
13*a03ca8b9SKrzysztof Kosiński namespace zucchini {
14*a03ca8b9SKrzysztof Kosiński 
15*a03ca8b9SKrzysztof Kosiński namespace {
16*a03ca8b9SKrzysztof Kosiński 
17*a03ca8b9SKrzysztof Kosiński // Returns true if |refs| is sorted by location.
IsReferenceListSorted(const std::vector<Reference> & refs)18*a03ca8b9SKrzysztof Kosiński bool IsReferenceListSorted(const std::vector<Reference>& refs) {
19*a03ca8b9SKrzysztof Kosiński   return std::is_sorted(refs.begin(), refs.end(),
20*a03ca8b9SKrzysztof Kosiński                         [](const Reference& a, const Reference& b) {
21*a03ca8b9SKrzysztof Kosiński                           return a.location < b.location;
22*a03ca8b9SKrzysztof Kosiński                         });
23*a03ca8b9SKrzysztof Kosiński }
24*a03ca8b9SKrzysztof Kosiński 
25*a03ca8b9SKrzysztof Kosiński }  // namespace
26*a03ca8b9SKrzysztof Kosiński 
ReferenceSet(const ReferenceTypeTraits & traits,const TargetPool & target_pool)27*a03ca8b9SKrzysztof Kosiński ReferenceSet::ReferenceSet(const ReferenceTypeTraits& traits,
28*a03ca8b9SKrzysztof Kosiński                            const TargetPool& target_pool)
29*a03ca8b9SKrzysztof Kosiński     : traits_(traits), target_pool_(target_pool) {}
30*a03ca8b9SKrzysztof Kosiński ReferenceSet::ReferenceSet(ReferenceSet&&) = default;
31*a03ca8b9SKrzysztof Kosiński ReferenceSet::~ReferenceSet() = default;
32*a03ca8b9SKrzysztof Kosiński 
InitReferences(ReferenceReader && ref_reader)33*a03ca8b9SKrzysztof Kosiński void ReferenceSet::InitReferences(ReferenceReader&& ref_reader) {
34*a03ca8b9SKrzysztof Kosiński   DCHECK(references_.empty());
35*a03ca8b9SKrzysztof Kosiński   for (auto ref = ref_reader.GetNext(); ref.has_value();
36*a03ca8b9SKrzysztof Kosiński        ref = ref_reader.GetNext()) {
37*a03ca8b9SKrzysztof Kosiński     references_.push_back(*ref);
38*a03ca8b9SKrzysztof Kosiński   }
39*a03ca8b9SKrzysztof Kosiński   DCHECK(IsReferenceListSorted(references_));
40*a03ca8b9SKrzysztof Kosiński }
41*a03ca8b9SKrzysztof Kosiński 
InitReferences(const std::vector<Reference> & refs)42*a03ca8b9SKrzysztof Kosiński void ReferenceSet::InitReferences(const std::vector<Reference>& refs) {
43*a03ca8b9SKrzysztof Kosiński   DCHECK(references_.empty());
44*a03ca8b9SKrzysztof Kosiński   DCHECK(IsReferenceListSorted(references_));
45*a03ca8b9SKrzysztof Kosiński   references_.assign(refs.begin(), refs.end());
46*a03ca8b9SKrzysztof Kosiński }
47*a03ca8b9SKrzysztof Kosiński 
at(offset_t offset) const48*a03ca8b9SKrzysztof Kosiński Reference ReferenceSet::at(offset_t offset) const {
49*a03ca8b9SKrzysztof Kosiński   auto pos = std::upper_bound(references_.begin(), references_.end(), offset,
50*a03ca8b9SKrzysztof Kosiński                               [](offset_t offset, const Reference& ref) {
51*a03ca8b9SKrzysztof Kosiński                                 return offset < ref.location;
52*a03ca8b9SKrzysztof Kosiński                               });
53*a03ca8b9SKrzysztof Kosiński 
54*a03ca8b9SKrzysztof Kosiński   DCHECK(pos != references_.begin());  // Iterators.
55*a03ca8b9SKrzysztof Kosiński   --pos;
56*a03ca8b9SKrzysztof Kosiński   DCHECK_LT(offset, pos->location + width());
57*a03ca8b9SKrzysztof Kosiński   return *pos;
58*a03ca8b9SKrzysztof Kosiński }
59*a03ca8b9SKrzysztof Kosiński 
60*a03ca8b9SKrzysztof Kosiński }  // namespace zucchini
61