#include "base/metrics/sample_map.h"
#include <stdint.h>
#include <memory>
#include "base/metrics/histogram_base.h"
#include "base/metrics/histogram_samples.h"
#include "base/metrics/sample_map_iterator.h"
#include "base/numerics/wrapping_math.h"
namespace base {
using Count32 = HistogramBase::Count32;
using Sample32 = HistogramBase::Sample32;
SampleMap::SampleMap(uint64_t id)
: HistogramSamples(id, std::make_unique<LocalMetadata>()) {}
SampleMap::~SampleMap() = default;
void SampleMap::Accumulate(Sample32 value, Count32 count) {
sample_counts_[value] += count;
IncreaseSumAndCount(strict_cast<int64_t>(count) * value, count);
}
Count32 SampleMap::GetCount(Sample32 value) const {
const auto it = sample_counts_.find(value);
return (it == sample_counts_.end()) ? 0 : it->second;
}
Count32 SampleMap::TotalCount() const {
Count32 count = 0;
for (const auto& entry : sample_counts_) {
count += entry.second;
}
return count;
}
std::unique_ptr<SampleCountIterator> SampleMap::Iterator() const {
return std::make_unique<SampleMapIterator<SampleToCountMap, false>>(
sample_counts_);
}
std::unique_ptr<SampleCountIterator> SampleMap::ExtractingIterator() {
return std::make_unique<SampleMapIterator<SampleToCountMap, true>>(
sample_counts_);
}
bool SampleMap::IsDefinitelyEmpty() const {
return HistogramSamples::IsDefinitelyEmpty() && sample_counts_.empty();
}
bool SampleMap::AddSubtractImpl(SampleCountIterator* iter, Operator op) {
Sample32 min;
int64_t max;
Count32 count;
for (; !iter->Done(); iter->Next()) {
iter->Get(&min, &max, &count);
if (int64_t{min} + 1 != max) {
return false;
}
Count32& sample_ref = sample_counts_[min];
if (op == HistogramSamples::ADD) {
sample_ref = base::WrappingAdd(sample_ref, count);
} else {
sample_ref = base::WrappingSub(sample_ref, count);
}
}
return true;
}
}