use num::Integer;
use super::{
super::traits::{CheckedCalc, CheckedType},
Cell,
};
impl<U: CheckedType + CheckedCalc> Integer for Cell<U>
where
std::num::ParseIntError: std::convert::From<<U as num::Num>::FromStrRadixErr>,
{
fn div_floor(&self, other: &Self) -> Self {
Cell {
error_tag: self.error_tag | other.error_tag,
data: self.data.div_floor(&other.data),
}
}
fn mod_floor(&self, other: &Self) -> Self {
Cell {
error_tag: self.error_tag | other.error_tag,
data: self.data.mod_floor(&other.data),
}
}
fn gcd(&self, other: &Self) -> Self {
Cell {
error_tag: self.error_tag | other.error_tag,
data: self.data.gcd(&other.data),
}
}
fn lcm(&self, other: &Self) -> Self {
Cell {
error_tag: self.error_tag | other.error_tag,
data: self.data.lcm(&other.data),
}
}
fn divides(&self, other: &Self) -> bool {
self.data.divides(&other.data)
}
fn is_multiple_of(&self, other: &Self) -> bool {
self.data.is_multiple_of(&other.data)
}
fn is_even(&self) -> bool {
self.data.is_even()
}
fn is_odd(&self) -> bool {
self.data.is_odd()
}
fn div_rem(&self, other: &Self) -> (Self, Self) {
let (quotient, remainder) = self.data.div_rem(&other.data);
(
Cell {
error_tag: self.error_tag | other.error_tag,
data: quotient,
},
Cell {
error_tag: self.error_tag | other.error_tag,
data: remainder,
},
)
}
}