OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/metrics/sample_vector.h" | 5 #include "base/metrics/sample_vector.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/metrics/bucket_ranges.h" | 8 #include "base/metrics/bucket_ranges.h" |
9 | 9 |
10 using std::vector; | 10 using std::vector; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 DCHECK(bucket_index >= 0 && bucket_index < counts_.size()); | 46 DCHECK(bucket_index >= 0 && bucket_index < counts_.size()); |
47 return counts_[bucket_index]; | 47 return counts_[bucket_index]; |
48 } | 48 } |
49 | 49 |
50 scoped_ptr<SampleCountIterator> SampleVector::Iterator() const { | 50 scoped_ptr<SampleCountIterator> SampleVector::Iterator() const { |
51 return scoped_ptr<SampleCountIterator>( | 51 return scoped_ptr<SampleCountIterator>( |
52 new SampleVectorIterator(&counts_, bucket_ranges_)); | 52 new SampleVectorIterator(&counts_, bucket_ranges_)); |
53 } | 53 } |
54 | 54 |
55 bool SampleVector::AddSubtractImpl(SampleCountIterator* iter, | 55 bool SampleVector::AddSubtractImpl(SampleCountIterator* iter, |
56 HistogramSamples::Instruction instruction) { | 56 HistogramSamples::Operator op) { |
57 HistogramBase::Sample min; | 57 HistogramBase::Sample min; |
58 HistogramBase::Sample max; | 58 HistogramBase::Sample max; |
59 HistogramBase::Count count; | 59 HistogramBase::Count count; |
60 | 60 |
61 // Go through the iterator and add the counts into correct bucket. | 61 // Go through the iterator and add the counts into correct bucket. |
62 size_t index = 0; | 62 size_t index = 0; |
63 while (index < counts_.size() && !iter->Done()) { | 63 while (index < counts_.size() && !iter->Done()) { |
64 iter->Get(&min, &max, &count); | 64 iter->Get(&min, &max, &count); |
65 if (min == bucket_ranges_->range(index) && | 65 if (min == bucket_ranges_->range(index) && |
66 max == bucket_ranges_->range(index + 1)) { | 66 max == bucket_ranges_->range(index + 1)) { |
67 // Sample matches this bucket! | 67 // Sample matches this bucket! |
68 counts_[index] += | 68 counts_[index] += (op == HistogramSamples::ADD) ? count : -count; |
69 (instruction == HistogramSamples::ADD) ? count : -count; | |
70 iter->Next(); | 69 iter->Next(); |
71 } else if (min > bucket_ranges_->range(index)) { | 70 } else if (min > bucket_ranges_->range(index)) { |
72 // Sample is larger than current bucket range. Try next. | 71 // Sample is larger than current bucket range. Try next. |
73 index++; | 72 index++; |
74 } else { | 73 } else { |
75 // Sample is smaller than current bucket range. We scan buckets from | 74 // Sample is smaller than current bucket range. We scan buckets from |
76 // smallest to largest, so the sample value must be invalid. | 75 // smallest to largest, so the sample value must be invalid. |
77 return false; | 76 return false; |
78 } | 77 } |
79 } | 78 } |
(...skipping 30 matching lines...) Expand all Loading... |
110 | 109 |
111 SampleVectorIterator::SampleVectorIterator(const vector<Count>* counts, | 110 SampleVectorIterator::SampleVectorIterator(const vector<Count>* counts, |
112 const BucketRanges* bucket_ranges) | 111 const BucketRanges* bucket_ranges) |
113 : counts_(counts), | 112 : counts_(counts), |
114 bucket_ranges_(bucket_ranges), | 113 bucket_ranges_(bucket_ranges), |
115 index_(0) { | 114 index_(0) { |
116 CHECK_GT(bucket_ranges_->size(), counts_->size()); | 115 CHECK_GT(bucket_ranges_->size(), counts_->size()); |
117 SkipEmptyBuckets(); | 116 SkipEmptyBuckets(); |
118 } | 117 } |
119 | 118 |
| 119 SampleVectorIterator::~SampleVectorIterator() {} |
| 120 |
120 bool SampleVectorIterator::Done() const { | 121 bool SampleVectorIterator::Done() const { |
121 return index_ >= counts_->size(); | 122 return index_ >= counts_->size(); |
122 } | 123 } |
123 | 124 |
124 void SampleVectorIterator::Next() { | 125 void SampleVectorIterator::Next() { |
125 DCHECK(!Done()); | 126 DCHECK(!Done()); |
126 index_++; | 127 index_++; |
127 SkipEmptyBuckets(); | 128 SkipEmptyBuckets(); |
128 } | 129 } |
129 | 130 |
(...skipping 21 matching lines...) Expand all Loading... |
151 return; | 152 return; |
152 | 153 |
153 while (index_ < counts_->size()) { | 154 while (index_ < counts_->size()) { |
154 if ((*counts_)[index_] != 0) | 155 if ((*counts_)[index_] != 0) |
155 return; | 156 return; |
156 index_++; | 157 index_++; |
157 } | 158 } |
158 } | 159 } |
159 | 160 |
160 } // namespace base | 161 } // namespace base |
OLD | NEW |