use std::sync::atomic::{AtomicUsize, Ordering};
use cache_padded::CachePadded;
use thread_local::ThreadLocal;
#[derive(Default, Debug)]
pub struct FastCounter {
counters: ThreadLocal<CachePadded<AtomicUsize>>,
}
impl FastCounter {
#[inline]
pub fn incr(&self) {
self.counters
.get_or_default()
.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub fn decr(&self) {
self.counters
.get_or_default()
.fetch_sub(1, Ordering::Relaxed);
}
pub fn count(&self) -> usize {
self.counters
.iter()
.map(|f| f.load(Ordering::Relaxed))
.fold(0usize, |x, y| x.wrapping_add(y))
}
}