kaiwang@chromium.org | 0ce37b1 | 2012-09-22 12:42:12 +0900 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | // SampleVector implements HistogramSamples interface. It is used by all |
| 6 | // Histogram based classes to store samples. |
| 7 | |
| 8 | #ifndef BASE_METRICS_SAMPLE_VECTOR_H_ |
| 9 | #define BASE_METRICS_SAMPLE_VECTOR_H_ |
| 10 | |
| 11 | #include <vector> |
| 12 | |
| 13 | #include "base/compiler_specific.h" |
| 14 | #include "base/gtest_prod_util.h" |
| 15 | #include "base/memory/scoped_ptr.h" |
| 16 | #include "base/metrics/histogram_base.h" |
| 17 | #include "base/metrics/histogram_samples.h" |
| 18 | |
| 19 | namespace base { |
| 20 | |
| 21 | class BucketRanges; |
| 22 | |
| 23 | class BASE_EXPORT_PRIVATE SampleVector : public HistogramSamples { |
| 24 | public: |
| 25 | explicit SampleVector(const BucketRanges* bucket_ranges); |
| 26 | virtual ~SampleVector(); |
| 27 | |
| 28 | // HistogramSamples implementation: |
| 29 | virtual void Accumulate(HistogramBase::Sample value, |
| 30 | HistogramBase::Count count) OVERRIDE; |
| 31 | virtual HistogramBase::Count GetCount( |
| 32 | HistogramBase::Sample value) const OVERRIDE; |
| 33 | virtual HistogramBase::Count TotalCount() const OVERRIDE; |
| 34 | virtual scoped_ptr<SampleCountIterator> Iterator() const OVERRIDE; |
| 35 | |
| 36 | // Get count of a specific bucket. |
| 37 | HistogramBase::Count GetCountAtIndex(size_t bucket_index) const; |
| 38 | |
| 39 | protected: |
| 40 | virtual bool AddSubtractImpl( |
| 41 | SampleCountIterator* iter, |
kaiwang@chromium.org | ec0e727 | 2012-10-06 06:29:44 +0900 | [diff] [blame] | 42 | HistogramSamples::Operator op) OVERRIDE; // |op| is ADD or SUBTRACT. |
kaiwang@chromium.org | 0ce37b1 | 2012-09-22 12:42:12 +0900 | [diff] [blame] | 43 | |
| 44 | virtual size_t GetBucketIndex(HistogramBase::Sample value) const; |
| 45 | |
| 46 | private: |
| 47 | FRIEND_TEST_ALL_PREFIXES(HistogramTest, CorruptSampleCounts); |
| 48 | |
glider@chromium.org | 6761bae | 2014-01-21 16:59:28 +0900 | [diff] [blame] | 49 | std::vector<HistogramBase::AtomicCount> counts_; |
kaiwang@chromium.org | 0ce37b1 | 2012-09-22 12:42:12 +0900 | [diff] [blame] | 50 | |
| 51 | // Shares the same BucketRanges with Histogram object. |
| 52 | const BucketRanges* const bucket_ranges_; |
| 53 | |
| 54 | DISALLOW_COPY_AND_ASSIGN(SampleVector); |
| 55 | }; |
| 56 | |
| 57 | class BASE_EXPORT_PRIVATE SampleVectorIterator : public SampleCountIterator { |
| 58 | public: |
glider@chromium.org | 6761bae | 2014-01-21 16:59:28 +0900 | [diff] [blame] | 59 | SampleVectorIterator(const std::vector<HistogramBase::AtomicCount>* counts, |
kaiwang@chromium.org | 0ce37b1 | 2012-09-22 12:42:12 +0900 | [diff] [blame] | 60 | const BucketRanges* bucket_ranges); |
kaiwang@chromium.org | ec0e727 | 2012-10-06 06:29:44 +0900 | [diff] [blame] | 61 | virtual ~SampleVectorIterator(); |
kaiwang@chromium.org | 0ce37b1 | 2012-09-22 12:42:12 +0900 | [diff] [blame] | 62 | |
| 63 | // SampleCountIterator implementation: |
| 64 | virtual bool Done() const OVERRIDE; |
| 65 | virtual void Next() OVERRIDE; |
| 66 | virtual void Get(HistogramBase::Sample* min, |
| 67 | HistogramBase::Sample* max, |
| 68 | HistogramBase::Count* count) const OVERRIDE; |
kaiwang@chromium.org | ec0e727 | 2012-10-06 06:29:44 +0900 | [diff] [blame] | 69 | |
| 70 | // SampleVector uses predefined buckets, so iterator can return bucket index. |
kaiwang@chromium.org | 0ce37b1 | 2012-09-22 12:42:12 +0900 | [diff] [blame] | 71 | virtual bool GetBucketIndex(size_t* index) const OVERRIDE; |
| 72 | |
| 73 | private: |
| 74 | void SkipEmptyBuckets(); |
| 75 | |
glider@chromium.org | 6761bae | 2014-01-21 16:59:28 +0900 | [diff] [blame] | 76 | const std::vector<HistogramBase::AtomicCount>* counts_; |
kaiwang@chromium.org | 0ce37b1 | 2012-09-22 12:42:12 +0900 | [diff] [blame] | 77 | const BucketRanges* bucket_ranges_; |
| 78 | |
| 79 | size_t index_; |
| 80 | }; |
| 81 | |
| 82 | } // namespace base |
| 83 | |
| 84 | #endif // BASE_METRICS_SAMPLE_VECTOR_H_ |