use ::Config;
#[derive(Debug, PartialEq, Copy, Clone)]
pub struct Stats {
pub bytes_sent: u32,
pub bytes_received: u32
}
impl Stats {
pub fn reset(&mut self) {
self.bytes_sent = 0;
self.bytes_received = 0;
}
}
impl Default for Stats {
fn default() -> Stats {
Stats {
bytes_sent: 0,
bytes_received: 0
}
}
}
#[derive(Debug)]
pub struct StatsCollector {
tick: u64,
config: Config,
buckets: Vec<Stats>,
averages: Stats
}
impl StatsCollector {
pub fn new(config: Config) -> StatsCollector {
StatsCollector {
tick: 0,
config: config,
buckets: (0..config.send_rate + 1).map(|_| {
Stats::default()
}).collect::<Vec<Stats>>(),
averages: Stats::default()
}
}
pub fn set_config(&mut self, config: Config) {
self.config = config;
self.buckets = (0..config.send_rate + 1).map(|_| {
Stats::default()
}).collect::<Vec<Stats>>()
}
pub fn set_bytes_sent(&mut self, bytes: u32) {
let old_index = (self.tick as i32 + 1) % (self.config.send_rate + 1) as i32;
let old_bytes = self.buckets[old_index as usize].bytes_sent;
self.averages.bytes_sent = (self.averages.bytes_sent - old_bytes) + bytes;
self.buckets[self.tick as usize].bytes_sent = bytes;
}
pub fn set_bytes_received(&mut self, bytes: u32) {
let old_index = (self.tick as i32 + 1) % (self.config.send_rate + 1) as i32;
let old_bytes = self.buckets[old_index as usize].bytes_received;
self.averages.bytes_received = (self.averages.bytes_received - old_bytes) + bytes;
self.buckets[self.tick as usize].bytes_received = bytes;
}
pub fn tick(&mut self) {
self.tick = (self.tick + 1) % (self.config.send_rate + 1);
}
pub fn average(&self) -> Stats {
self.averages
}
pub fn reset(&mut self) {
self.averages.bytes_sent = 0;
self.averages.bytes_received = 0;
for d in &mut self.buckets {
d.reset();
}
}
}