• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2022 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/metrics/ranges_manager.h"
6 
7 namespace base {
8 
9 RangesManager::RangesManager() = default;
10 
~RangesManager()11 RangesManager::~RangesManager() {
12   if (!do_not_release_ranges_on_destroy_for_testing_)
13     ReleaseBucketRanges();
14 }
15 
operator ()(const BucketRanges * const a) const16 size_t RangesManager::BucketRangesHash::operator()(
17     const BucketRanges* const a) const {
18   return a->checksum();
19 }
20 
operator ()(const BucketRanges * const a,const BucketRanges * const b) const21 bool RangesManager::BucketRangesEqual::operator()(
22     const BucketRanges* const a,
23     const BucketRanges* const b) const {
24   return a->Equals(b);
25 }
26 
RegisterOrDeleteDuplicateRanges(const BucketRanges * ranges)27 const BucketRanges* RangesManager::RegisterOrDeleteDuplicateRanges(
28     const BucketRanges* ranges) {
29   DCHECK(ranges->HasValidChecksum());
30 
31   // Attempt to insert |ranges| into the set of registered BucketRanges. If an
32   // equivalent one already exists (one with the exact same ranges), this
33   // fetches the pre-existing one and does not insert the passed |ranges|.
34   const BucketRanges* const registered = *ranges_.insert(ranges).first;
35 
36   // If there is already a registered equivalent BucketRanges, delete the passed
37   // |ranges|.
38   if (registered != ranges)
39     delete ranges;
40 
41   return registered;
42 }
43 
GetBucketRanges()44 std::vector<const BucketRanges*> RangesManager::GetBucketRanges() {
45   std::vector<const BucketRanges*> out;
46   out.reserve(ranges_.size());
47   out.assign(ranges_.begin(), ranges_.end());
48   return out;
49 }
50 
ReleaseBucketRanges()51 void RangesManager::ReleaseBucketRanges() {
52   for (auto* range : ranges_) {
53     delete range;
54   }
55   ranges_.clear();
56 }
57 
DoNotReleaseRangesOnDestroyForTesting()58 void RangesManager::DoNotReleaseRangesOnDestroyForTesting() {
59   do_not_release_ranges_on_destroy_for_testing_ = true;
60 }
61 
62 }  // namespace base
63