// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_METRICS_HISTOGRAM_SAMPLES_H_
#define BASE_METRICS_HISTOGRAM_SAMPLES_H_
#include "base/basictypes.h"
#include "base/metrics/histogram_base.h"
#include "base/memory/scoped_ptr.h"
class Pickle;
class PickleIterator;
namespace base {
class SampleCountIterator;
// HistogramSamples is a container storing all samples of a histogram.
class BASE_EXPORT HistogramSamples {
public:
HistogramSamples();
virtual ~HistogramSamples();
virtual void Accumulate(HistogramBase::Sample value,
HistogramBase::Count count) = 0;
virtual HistogramBase::Count GetCount(HistogramBase::Sample value) const = 0;
virtual HistogramBase::Count TotalCount() const = 0;
virtual void Add(const HistogramSamples& other);
// Add from serialized samples.
virtual bool AddFromPickle(PickleIterator* iter);
virtual void Subtract(const HistogramSamples& other);
virtual scoped_ptr<SampleCountIterator> Iterator() const = 0;
virtual bool Serialize(Pickle* pickle) const;
// Accessor fuctions.
int64 sum() const { return sum_; }
HistogramBase::Count redundant_count() const {
return subtle::NoBarrier_Load(&redundant_count_);
}
protected:
// Based on |op| type, add or subtract sample counts data from the iterator.
enum Operator { ADD, SUBTRACT };
virtual bool AddSubtractImpl(SampleCountIterator* iter, Operator op) = 0;
void IncreaseSum(int64 diff);
void IncreaseRedundantCount(HistogramBase::Count diff);
private:
int64 sum_;
// |redundant_count_| helps identify memory corruption. It redundantly stores
// the total number of samples accumulated in the histogram. We can compare
// this count to the sum of the counts (TotalCount() function), and detect
// problems. Note, depending on the implementation of different histogram
// types, there might be races during histogram accumulation and snapshotting
// that we choose to accept. In this case, the tallies might mismatch even
// when no memory corruption has happened.
HistogramBase::AtomicCount redundant_count_;
};
class BASE_EXPORT SampleCountIterator {
public:
virtual ~SampleCountIterator();
virtual bool Done() const = 0;
virtual void Next() = 0;
// Get the sample and count at current position.
// |min| |max| and |count| can be NULL if the value is not of interest.
// Requires: !Done();
virtual void Get(HistogramBase::Sample* min,
HistogramBase::Sample* max,
HistogramBase::Count* count) const = 0;
// Get the index of current histogram bucket.
// For histograms that don't use predefined buckets, it returns false.
// Requires: !Done();
virtual bool GetBucketIndex(size_t* index) const;
};
} // namespace base
#endif // BASE_METRICS_HISTOGRAM_SAMPLES_H_