text: // Copyright 2010 The Goma 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 DEVTOOLS_GOMA_CLIENT_HISTOGRAM_H_
  #define DEVTOOLS_GOMA_CLIENT_HISTOGRAM_H_
  
  #include <assert.h>
  #include <math.h>
  #include <stdint.h>
  
  #include <map>
  #include <string>
  
  #include "absl/time/time.h"
  
  using std::string;
  
  namespace devtools_goma {
  
  class DistributionProto;
  
  class Histogram {
   public:
    // Construct an object which holds occurrence frequence information
    // in interval buckets of log(logbase). Default value for log base is 2.
    Histogram() : logbase_(2),
          min_max_is_set_(false),
          count_(0), sum_(0), sum_of_squares_(0) {}
    ~Histogram() {}
  
    void SetName(const string& name);
  
    // Resets statistics values.
    // It preserves logbase_.
    void Reset();
  
    void Add(int64_t value);
  
    void AddTimeAsMilliseconds(absl::Duration duration) {
      Add(absl::ToInt64Milliseconds(duration));
    }
  
    // Log base can be modified before adding the first value.
    void SetLogBase(float logbase);
  
    int DetermineBucket(int64_t value) const;
    int64_t BucketValue(int n) const;
    int64_t min() const { return min_; }
    int64_t max() const { return max_; }
    int64_t sum() const { return sum_; }
    double sum_of_squares() const { return sum_of_squares_; }
    int64_t standard_deviation() const;
    int64_t mean() const { return sum_ / count_; }
    int64_t count() const { return count_; }
    const string& name() const { return name_; }
    string DebugString() const;
    void DumpToProto(DistributionProto* dist);
  
   private:
    string ManySharps(int64_t n) const;
  
    string name_;
    float logbase_;
    std::map<int, int64_t> buckets_;
    bool min_max_is_set_;
    int64_t min_;
    int64_t max_;
    int64_t count_;
    int64_t sum_;
    double sum_of_squares_;
  };
  
  }  // namespace devtools_goma
  
  #endif  // DEVTOOLS_GOMA_CLIENT_HISTOGRAM_H_
  