#[derive(Debug, Default)]
pub struct Stats {
unique: u64,
total: u64,
}
impl Stats {
pub fn new() -> Stats {
Stats::default()
}
#[inline]
pub fn add_unique(&mut self) {
self.total += 1;
self.unique += 1;
}
#[inline]
pub fn add_duplicate(&mut self) {
self.total += 1;
}
pub fn duplicates(&self) -> u64 {
self.total - self.unique
}
pub fn rate(&self) -> f32 {
((self.unique as f64 / self.total as f64) * 100.0) as f32
}
pub fn total(&self) -> u64 {
self.total
}
pub fn uniques(&self) -> u64 {
self.unique
}
pub fn print(&self) {
println!();
uprintln("Unique Count", self.uniques(), 1);
uprintln("Total Count", self.total(), 2);
uprintln("Dup Offset", self.duplicates(), 3);
println!("Dup Rate:{:>22.2}%", 100.0 - self.rate());
println!();
}
}
#[inline]
fn uprintln(label: &str, value: u64, offset: usize) {
let str_value = value.to_string();
let mut output = String::new();
let mut place = str_value.len();
let mut later_loop = false;
for ch in str_value.chars() {
if later_loop && place % 3 == 0 {
output.push(',');
}
output.push(ch);
later_loop = true;
place -= 1;
}
println!("{}:{:>w$}", label, output, w = 18 + offset);
}
#[cfg(test)]
mod tests {
use super::Stats;
#[test]
fn default_creation() {
let stats = Stats::new();
assert_eq!(stats.total(), 0);
assert_eq!(stats.uniques(), 0);
assert_eq!(stats.duplicates(), 0);
}
#[test]
fn addition_of_uniques() {
let mut stats = Stats::new();
stats.add_unique();
stats.add_unique();
stats.add_unique();
assert_eq!(stats.total(), 3);
assert_eq!(stats.uniques(), 3);
assert_eq!(stats.duplicates(), 0);
}
#[test]
fn addition_of_duplicates() {
let mut stats = Stats::new();
stats.add_duplicate();
stats.add_duplicate();
stats.add_duplicate();
assert_eq!(stats.total(), 3);
assert_eq!(stats.uniques(), 0);
assert_eq!(stats.duplicates(), 3);
}
#[test]
fn generate_of_rates() {
let mut stats = Stats::new();
stats.add_duplicate();
stats.add_duplicate();
stats.add_duplicate();
stats.add_unique();
stats.add_unique();
stats.add_unique();
assert_eq!(stats.total(), 6);
assert_eq!(stats.uniques(), 3);
assert_eq!(stats.duplicates(), 3);
assert_eq!(stats.rate() as u16, 50);
}
}