63 lines
1.7 KiB
C++
63 lines
1.7 KiB
C++
// 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
|