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)// BucketRanges stores the vector of ranges that delimit what samples are
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tallied in the corresponding buckets of a histogram. Histograms that have
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same ranges for all their corresponding buckets should share the same
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BucketRanges object.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// E.g. A 5 buckets LinearHistogram with 1 as minimal value and 4 as maximal
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value will need a BucketRanges with 6 ranges:
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 0, 1, 2, 3, 4, INT_MAX
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kaiwang): Currently we keep all negative values in 0~1 bucket. Consider
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// changing 0 to INT_MIN.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_METRICS_BUCKET_RANGES_H_
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_METRICS_BUCKET_RANGES_H_
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram_base.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT BucketRanges {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<HistogramBase::Sample> Ranges;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit BucketRanges(size_t num_ranges);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~BucketRanges();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size() const { return ranges_.size(); }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistogramBase::Sample range(size_t i) const { return ranges_[i]; }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_range(size_t i, HistogramBase::Sample value);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 checksum() const { return checksum_; }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_checksum(uint32 checksum) { checksum_ = checksum; }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // A bucket is defined by a consecutive pair of entries in |ranges|, so there
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // is one fewer bucket than there are ranges.  For example, if |ranges| is
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // [0, 1, 3, 7, INT_MAX], then the buckets in this histogram are
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // [0, 1), [1, 3), [3, 7), and [7, INT_MAX).
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  size_t bucket_count() const { return ranges_.size() - 1; }
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checksum methods to verify whether the ranges are corrupted (e.g. bad
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // memory access).
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 CalculateChecksum() const;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasValidChecksum() const;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetChecksum();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true iff |other| object has same ranges_ as |this| object's ranges_.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Equals(const BucketRanges* other) const;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A monotonically increasing list of values which determine which bucket to
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // put a sample into.  For each index, show the smallest sample that can be
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // added to the corresponding bucket.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Ranges ranges_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checksum for the conntents of ranges_.  Used to detect random over-writes
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of our data, and to quickly see if some other BucketRanges instance is
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // possibly Equal() to this instance.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kaiwang): Consider change this to uint64. Because we see a lot of
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // noise on UMA dashboard.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 checksum_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BucketRanges);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Expose only for test.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT_PRIVATE extern const uint32 kCrcTable[256];
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_METRICS_BUCKET_RANGES_H_
80