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()11RangesManager::~RangesManager() { 12 if (!do_not_release_ranges_on_destroy_for_testing_) 13 ReleaseBucketRanges(); 14 } 15 operator ()(const BucketRanges * const a) const16size_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) const21bool 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)27const 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()44std::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()51void RangesManager::ReleaseBucketRanges() { 52 for (auto* range : ranges_) { 53 delete range; 54 } 55 ranges_.clear(); 56 } 57 DoNotReleaseRangesOnDestroyForTesting()58void RangesManager::DoNotReleaseRangesOnDestroyForTesting() { 59 do_not_release_ranges_on_destroy_for_testing_ = true; 60 } 61 62 } // namespace base 63