use auto_impl::auto_impl;
use fbinit::FacebookInit;
pub type BoxSingletonCounter = Box<dyn SingletonCounter + Send + Sync>;
pub type BoxCounter = Box<dyn Counter + Send + Sync>;
pub type BoxTimeseries = Box<dyn Timeseries + Send + Sync>;
pub type BoxHistogram = Box<dyn Histogram + Send + Sync>;
pub type BoxLocalCounter = Box<dyn Counter>;
pub type BoxLocalTimeseries = Box<dyn Timeseries>;
pub type BoxLocalHistogram = Box<dyn Histogram>;
#[auto_impl(Box)]
pub trait SingletonCounter {
fn set_value(&self, fb: FacebookInit, value: i64);
fn increment_value(&self, fb: FacebookInit, value: i64);
fn get_value(&self, fb: FacebookInit) -> Option<i64>;
}
#[auto_impl(Box)]
pub trait Counter {
fn increment_value(&self, value: i64);
}
#[auto_impl(Box)]
pub trait Timeseries {
fn add_value(&self, value: i64);
fn add_value_aggregated(&self, value: i64, nsamples: u32);
}
#[auto_impl(Box)]
pub trait Histogram {
fn add_value(&self, value: i64);
fn add_repeated_value(&self, value: i64, nsamples: u32) {
for _ in 0..nsamples {
self.add_value(value);
}
}
fn flush(&self) {}
}
mod localkey_impls {
use std::thread::LocalKey;
use super::*;
pub trait CounterStatic {
fn increment_value(&'static self, value: i64);
}
impl<T: Counter> CounterStatic for LocalKey<T> {
fn increment_value(&'static self, value: i64) {
self.with(|s| T::increment_value(s, value));
}
}
pub trait TimeseriesStatic {
fn add_value(&'static self, value: i64);
fn add_value_aggregated(&'static self, value: i64, nsamples: u32);
}
impl<T: Timeseries> TimeseriesStatic for LocalKey<T> {
fn add_value(&'static self, value: i64) {
self.with(|s| s.add_value(value));
}
fn add_value_aggregated(&'static self, value: i64, nsamples: u32) {
self.with(|s| s.add_value_aggregated(value, nsamples));
}
}
pub trait HistogramStatic {
fn add_value(&'static self, value: i64);
fn add_repeated_value(&'static self, value: i64, nsamples: u32);
}
impl<T: Histogram> HistogramStatic for LocalKey<T> {
fn add_value(&'static self, value: i64) {
self.with(|s| s.add_value(value));
}
fn add_repeated_value(&'static self, value: i64, nsamples: u32) {
self.with(|s| s.add_repeated_value(value, nsamples));
}
}
}
pub use localkey_impls::*;
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_add_repeated_value() {
struct DummyHistogram {
n_added: std::sync::atomic::AtomicU32,
}
impl Histogram for DummyHistogram {
fn add_value(&self, _value: i64) {
self.n_added
.fetch_add(1, std::sync::atomic::Ordering::AcqRel);
}
}
let dummy_histogram = DummyHistogram {
n_added: std::sync::atomic::AtomicU32::new(0),
};
let n_to_add: u32 = 3;
dummy_histogram.add_repeated_value(0, n_to_add);
assert_eq!(dummy_histogram.n_added.into_inner(), n_to_add);
}
}