extern crate libc;
use libc::{c_int64, c_int32, c_double};
#[repr(C)]
struct hdr_histogram {
lowest_trackable_value: c_int64,
highest_trackable_value: c_int64,
unit_magnitude: c_int32,
significant_figures: c_int64,
sub_bucket_half_count_magnitude: c_int32,
sub_bucket_half_count: c_int32,
sub_bucket_mask: c_int64,
sub_bucket_count: c_int32,
bucket_count: c_int32,
min_value: c_int64,
max_value: c_int64,
normalizing_index_offset: c_int32,
conversion_ratio: c_double,
counts_len: c_int32,
total_count: c_int64,
counts: c_int64[0],
}
#[link(name = "hdr_histogram")]
extern {
}
#[cfg(test)]
mod test {
use super::Histogram;
use super::HistoBucketCfg;
#[test]
fn test_create() {
let h = Histogram::init(1, 3600000000, 3).unwrap();
assert_eq!(h.counts.len(), 23552);
}
#[test]
fn test_invalid_init() {
assert!(Histogram::init(0, 6481024, 2).is_err());
assert!(Histogram::init(80, 110, 5).is_err());
}
#[test]
fn test_create_with_large_values() {
let h = Histogram::init(20000000, 100000000, 5).unwrap();
h.record_value(100000000);
h.record_value(20000000);
h.record_value(30000000);
assert!(h.values_are_equivalent(20000000, h.value_at_percentile(50.0)));
assert!(h.values_are_equivalent(30000000, h.value_at_percentile(83.33)));
assert!(h.values_are_equivalent(100000000, h.value_at_percentile(83.34)));
assert!(h.values_are_equivalent(100000000, h.value_at_percentile(99.0)));
}
}