/*
 *  Copyright 2016 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

package org.webrtc;

/**
 * Class for holding the native pointer of a histogram. Since there is no way to destroy a
 * histogram, please don't create unnecessary instances of this object. This class is thread safe.
 *
 * Usage example:
 * private static final Histogram someMetricHistogram =
 *     Histogram.createCounts("WebRTC.Video.SomeMetric", 1, 10000, 50);
 * someMetricHistogram.addSample(someVariable);
 */
@JNINamespace("webrtc::jni")
class Histogram {
  private final long handle;

  private Histogram(long handle) {
    this.handle = handle;
  }

  static public Histogram createCounts(String name, int min, int max, int bucketCount) {
    return new Histogram(nativeCreateCounts(name, min, max, bucketCount));
  }

  static public Histogram createEnumeration(String name, int max) {
    return new Histogram(nativeCreateEnumeration(name, max));
  }

  public void addSample(int sample) {
    nativeAddSample(handle, sample);
  }

  private static native long nativeCreateCounts(String name, int min, int max, int bucketCount);
  private static native long nativeCreateEnumeration(String name, int max);
  private static native void nativeAddSample(long handle, int sample);
}
