use bnum::types::U2048;
use serde::{Deserialize, Serialize};
use std::ops::Add;
#[derive(Serialize, Deserialize, Copy, Clone, Debug)]
pub struct CompLevel {
count: U2048,
rate: u64,
}
impl Default for CompLevel {
fn default() -> Self {
Self::new()
}
}
impl Add<CompLevel> for CompLevel {
type Output = Self;
fn add(self, other: CompLevel) -> Self {
Self {
count: self.count + other.count,
rate: self.rate + self.rate,
}
}
}
impl CompLevel {
pub fn new() -> Self {
Self {
count: 0u8.into(),
rate: 0u64,
}
}
pub fn add_rate(&mut self, rate: u64) {
self.rate = &self.rate + rate;
}
pub fn add_count(&mut self, count: u64) {
self.count = self.count + count;
}
pub fn big_add_count(&mut self, count: U2048) {
self.count = &self.count + count;
}
pub fn rate(&self) -> &u64 {
&self.rate
}
pub fn count(&self) -> &U2048 {
&self.count
}
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug)]
pub struct Comp {
pub l1: CompLevel,
pub l2: CompLevel,
rate: u64,
}
impl Default for Comp {
fn default() -> Self {
Self::new()
}
}
impl Add<Comp> for Comp {
type Output = Self;
fn add(self, other: Comp) -> Self {
Self {
l1: self.l1 + other.l1,
l2: self.l2 + other.l2,
rate: self.rate + other.rate,
}
}
}
impl Comp {
pub fn new() -> Self {
Self {
l1: CompLevel::new(),
l2: CompLevel::new(),
rate: 0u64,
}
}
pub fn add_rate(&mut self, rate: u64) {
self.rate = &self.rate + rate;
}
pub fn rate(&self) -> &u64 {
&self.rate
}
}