1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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>;
#[auto_impl(Box)]
pub trait SingletonCounter {
fn set_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);
}
mod localkey_impls {
use super::*;
use std::thread::LocalKey;
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::*;