| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/metrics/ranges_manager.h" |
| |
| namespace base { |
| |
| RangesManager::RangesManager() = default; |
| |
| RangesManager::~RangesManager() { |
| if (!do_not_release_ranges_on_destroy_for_testing_) |
| ReleaseBucketRanges(); |
| } |
| |
| size_t RangesManager::BucketRangesHash::operator()( |
| const BucketRanges* const a) const { |
| return a->checksum(); |
| } |
| |
| bool RangesManager::BucketRangesEqual::operator()( |
| const BucketRanges* const a, |
| const BucketRanges* const b) const { |
| return a->Equals(b); |
| } |
| |
| const BucketRanges* RangesManager::RegisterOrDeleteDuplicateRanges( |
| const BucketRanges* ranges) { |
| DCHECK(ranges->HasValidChecksum()); |
| |
| // Attempt to insert |ranges| into the set of registered BucketRanges. If an |
| // equivalent one already exists (one with the exact same ranges), this |
| // fetches the pre-existing one and does not insert the passed |ranges|. |
| const BucketRanges* const registered = *ranges_.insert(ranges).first; |
| |
| // If there is already a registered equivalent BucketRanges, delete the passed |
| // |ranges|. |
| if (registered != ranges) |
| delete ranges; |
| |
| return registered; |
| } |
| |
| std::vector<const BucketRanges*> RangesManager::GetBucketRanges() { |
| std::vector<const BucketRanges*> out; |
| out.reserve(ranges_.size()); |
| out.assign(ranges_.begin(), ranges_.end()); |
| return out; |
| } |
| |
| void RangesManager::ReleaseBucketRanges() { |
| for (auto* range : ranges_) { |
| delete range; |
| } |
| ranges_.clear(); |
| } |
| |
| void RangesManager::DoNotReleaseRangesOnDestroyForTesting() { |
| do_not_release_ranges_on_destroy_for_testing_ = true; |
| } |
| |
| } // namespace base |