15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SampleVector implements HistogramSamples interface. It is used by all
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Histogram based classes to store samples.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_METRICS_SAMPLE_VECTOR_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_METRICS_SAMPLE_VECTOR_H_
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram_base.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram_samples.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BucketRanges;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT_PRIVATE SampleVector : public HistogramSamples {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SampleVector(const BucketRanges* bucket_ranges);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SampleVector();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HistogramSamples implementation:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Accumulate(HistogramBase::Sample value,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          HistogramBase::Count count) OVERRIDE;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HistogramBase::Count GetCount(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistogramBase::Sample value) const OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HistogramBase::Count TotalCount() const OVERRIDE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_ptr<SampleCountIterator> Iterator() const OVERRIDE;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get count of a specific bucket.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistogramBase::Count GetCountAtIndex(size_t bucket_index) const;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool AddSubtractImpl(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SampleCountIterator* iter,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistogramSamples::Operator op) OVERRIDE;  // |op| is ADD or SUBTRACT.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual size_t GetBucketIndex(HistogramBase::Sample value) const;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(HistogramTest, CorruptSampleCounts);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<HistogramBase::Count> counts_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shares the same BucketRanges with Histogram object.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BucketRanges* const bucket_ranges_;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SampleVector);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT_PRIVATE SampleVectorIterator : public SampleCountIterator {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SampleVectorIterator(const std::vector<HistogramBase::Count>* counts,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const BucketRanges* bucket_ranges);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SampleVectorIterator();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SampleCountIterator implementation:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Done() const OVERRIDE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Next() OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Get(HistogramBase::Sample* min,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   HistogramBase::Sample* max,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   HistogramBase::Count* count) const OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SampleVector uses predefined buckets, so iterator can return bucket index.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetBucketIndex(size_t* index) const OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SkipEmptyBuckets();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<HistogramBase::Count>* counts_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BucketRanges* bucket_ranges_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t index_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_METRICS_SAMPLE_VECTOR_H_
85