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 Z: AtomicU64 = AtomicU64::new(0);
const ROW: [AtomicU64; Op::COUNT] =
[Z, Z, Z, Z, Z, Z, Z]; [
ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW,
ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW, ROW,
]
};
static COUNTERS: [AtomicU64; Counter::COUNT] = {
const Z: AtomicU64 = AtomicU64::new(0);
[Z, Z, Z, Z, Z, Z, Z] };
static GAUGES: [AtomicU64; Gauge::COUNT] = {
const Z: AtomicU64 = AtomicU64::new(0);
[Z, Z, Z, Z, Z, Z, Z] };
#[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)
}