use std::sync::Arc;
use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Clone, Default)]
pub struct Stats {
pub counters: Arc<Counters>
}
impl Stats {
pub fn new() -> Self {
Default::default()
}
}
#[derive(Default)]
pub struct Counters {
incoming: AtomicU64,
outgoing: AtomicU64,
}
impl Counters {
pub fn increase_incoming(&self) {
self.incoming.fetch_add(1, Ordering::Relaxed);
}
pub fn increase_outgoing(&self) {
self.outgoing.fetch_add(1, Ordering::Relaxed);
}
pub fn incoming(&self) -> u64 {
self.incoming.load(Ordering::Relaxed)
}
pub fn outgoing(&self) -> u64 {
self.outgoing.load(Ordering::Relaxed)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn incoming() {
let stats = Stats::new();
assert_eq!(0, stats.counters.incoming());
stats.counters.increase_incoming();
assert_eq!(1, stats.counters.incoming());
}
#[test]
fn outgoing() {
let stats = Stats::new();
assert_eq!(0, stats.counters.outgoing());
stats.counters.increase_outgoing();
stats.counters.increase_outgoing();
assert_eq!(2, stats.counters.outgoing());
}
}