use std::sync::atomic::{AtomicU32, Ordering};
#[derive(Debug, Default)]
pub struct UsageAccumulator {
input_tokens: AtomicU32,
output_tokens: AtomicU32,
}
impl UsageAccumulator {
pub fn new() -> Self {
Self::default()
}
pub fn add_output(&self, tokens: u32) {
self.output_tokens.fetch_add(tokens, Ordering::Relaxed);
}
pub fn set_input(&self, tokens: u32) {
self.input_tokens.store(tokens, Ordering::Relaxed);
}
pub fn snapshot(&self) -> (u32, u32) {
(
self.input_tokens.load(Ordering::Relaxed),
self.output_tokens.load(Ordering::Relaxed),
)
}
pub fn total_tokens(&self) -> u32 {
let (input, output) = self.snapshot();
input + output
}
}
impl From<(u32, u32)> for UsageAccumulator {
fn from((input, output): (u32, u32)) -> Self {
let acc = Self::new();
acc.set_input(input);
acc.output_tokens.store(output, Ordering::Relaxed);
acc
}
}
#[derive(Debug, Clone, Copy)]
pub struct UsageRecord {
pub input_tokens: u32,
pub output_tokens: u32,
}
impl UsageRecord {
pub fn total(&self) -> u32 {
self.input_tokens + self.output_tokens
}
}
impl From<(u32, u32)> for UsageRecord {
fn from((input, output): (u32, u32)) -> Self {
Self {
input_tokens: input,
output_tokens: output,
}
}
}