reference_set.cc 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/zucchini/reference_set.h"
  5. #include <algorithm>
  6. #include <iterator>
  7. #include "base/check_op.h"
  8. #include "components/zucchini/target_pool.h"
  9. namespace zucchini {
  10. namespace {
  11. // Returns true if |refs| is sorted by location.
  12. bool IsReferenceListSorted(const std::vector<Reference>& refs) {
  13. return std::is_sorted(refs.begin(), refs.end(),
  14. [](const Reference& a, const Reference& b) {
  15. return a.location < b.location;
  16. });
  17. }
  18. } // namespace
  19. ReferenceSet::ReferenceSet(const ReferenceTypeTraits& traits,
  20. const TargetPool& target_pool)
  21. : traits_(traits), target_pool_(target_pool) {}
  22. ReferenceSet::ReferenceSet(ReferenceSet&&) = default;
  23. ReferenceSet::~ReferenceSet() = default;
  24. void ReferenceSet::InitReferences(ReferenceReader&& ref_reader) {
  25. DCHECK(references_.empty());
  26. for (auto ref = ref_reader.GetNext(); ref.has_value();
  27. ref = ref_reader.GetNext()) {
  28. references_.push_back(*ref);
  29. }
  30. DCHECK(IsReferenceListSorted(references_));
  31. }
  32. void ReferenceSet::InitReferences(const std::vector<Reference>& refs) {
  33. DCHECK(references_.empty());
  34. DCHECK(IsReferenceListSorted(references_));
  35. references_.assign(refs.begin(), refs.end());
  36. }
  37. Reference ReferenceSet::at(offset_t offset) const {
  38. auto pos = std::upper_bound(references_.begin(), references_.end(), offset,
  39. [](offset_t offset, const Reference& ref) {
  40. return offset < ref.location;
  41. });
  42. DCHECK(pos != references_.begin()); // Iterators.
  43. --pos;
  44. DCHECK_LT(offset, pos->location + width());
  45. return *pos;
  46. }
  47. } // namespace zucchini