use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Debug)]
pub struct Gauge {
value: AtomicU64, }
impl Gauge {
pub fn new() -> Self {
Self {
value: AtomicU64::new(0),
}
}
pub fn set(&self, value: f64) {
let fixed_point = (value * 1000.0) as u64;
self.value.store(fixed_point, Ordering::Relaxed);
}
pub fn get(&self) -> f64 {
self.value.load(Ordering::Relaxed) as f64 / 1000.0
}
pub fn reset(&self) {
self.value.store(0, Ordering::Relaxed);
}
}
impl Default for Gauge {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_gauge_basic_operations() {
let gauge = Gauge::new();
assert_eq!(gauge.get(), 0.0);
gauge.set(0.5);
assert!((gauge.get() - 0.5).abs() < 0.001);
gauge.reset();
assert_eq!(gauge.get(), 0.0);
}
#[test]
fn test_gauge_precision() {
let gauge = Gauge::new();
gauge.set(0.123);
assert!((gauge.get() - 0.123).abs() < 0.001);
gauge.set(99.999);
assert!((gauge.get() - 99.999).abs() < 0.001);
}
}