use core::sync::atomic::{AtomicU64, Ordering};
use crate::{Counter, Gauge, Op};
pub const MAX_SHARDS: usize = 32;
static OP_COUNTERS: [[AtomicU64; Op::COUNT]; MAX_SHARDS] =
[const { [const { AtomicU64::new(0) }; Op::COUNT] }; MAX_SHARDS];
static COUNTERS: [AtomicU64; Counter::COUNT] = [const { AtomicU64::new(0) }; Counter::COUNT];
static GAUGES: [AtomicU64; Gauge::COUNT] = [const { AtomicU64::new(0) }; Gauge::COUNT];
#[inline(always)]
pub fn tick_op(op: Op, shard_id: u16) {
let s = (shard_id as usize) & (MAX_SHARDS - 1);
OP_COUNTERS[s][op as usize].fetch_add(1, Ordering::Relaxed);
}
#[inline(always)]
pub fn tick_counter(c: Counter, delta: u64) {
COUNTERS[c as usize].fetch_add(delta, Ordering::Relaxed);
}
#[inline(always)]
pub fn set_gauge(g: Gauge, value: u64) {
GAUGES[g as usize].store(value, Ordering::Relaxed);
}
pub fn op_total(op: Op) -> u64 {
OP_COUNTERS
.iter()
.map(|row| row[op as usize].load(Ordering::Relaxed))
.sum()
}
pub fn op_shard(op: Op, shard_id: u16) -> u64 {
let s = (shard_id as usize) & (MAX_SHARDS - 1);
OP_COUNTERS[s][op as usize].load(Ordering::Relaxed)
}
pub fn counter(c: Counter) -> u64 {
COUNTERS[c as usize].load(Ordering::Relaxed)
}
pub fn gauge(g: Gauge) -> u64 {
GAUGES[g as usize].load(Ordering::Relaxed)
}