use std::cell::Cell;
thread_local! {
static CLONES: Cell<u64> = const { Cell::new(0) };
}
#[inline]
pub(crate) fn record() {
let _ = CLONES.try_with(|c| c.set(c.get().saturating_add(1)));
}
pub(crate) fn count() -> u64 {
CLONES.get()
}
pub(crate) fn measure<T>(f: impl FnOnce() -> T) -> (T, u64) {
let before = count();
let out = f();
(out, count() - before)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::domain::entities::Event;
fn event() -> Event {
Event::from_strings(
"probe.checked".to_string(),
"e-1".to_string(),
"default".to_string(),
serde_json::json!({}),
None,
)
.unwrap()
}
#[test]
fn measure_counts_event_clones() {
let e = event();
let (_, none) = measure(|| e.id);
assert_eq!(none, 0, "not cloning must record nothing");
let (_, three) = measure(|| vec![e.clone(), e.clone(), e.clone()]);
assert_eq!(three, 3, "one increment per Event::clone");
let batch = vec![event(), event(), event(), event()];
let (_, four) = measure(|| batch.clone());
assert_eq!(four, 4);
}
#[test]
fn cloned_events_are_faithful_copies() {
let e = event();
let copy = e.clone();
assert_eq!(copy, e);
}
}