forked from StrafesNET/strafe-project
52 lines
1.1 KiB
Rust
52 lines
1.1 KiB
Rust
|
use std::ops::{Add,Mul};
|
||
|
use crate::ratio::Ratio;
|
||
|
use fixed_wide_traits::wide::{WideMul,WideDiv};
|
||
|
|
||
|
impl<Num,Den:Copy> Ratio<Num,Den>
|
||
|
{
|
||
|
pub fn rational_add<T>(self,rhs:T)->Ratio<<Num as Add<<Den as Mul<T>>::Output>>::Output,Den>
|
||
|
where
|
||
|
Den:Mul<T>,
|
||
|
Num:Add<<Den as Mul<T>>::Output>,
|
||
|
{
|
||
|
Ratio{
|
||
|
num:self.num+self.den.mul(rhs),
|
||
|
den:self.den,
|
||
|
}
|
||
|
}
|
||
|
pub fn wide_rational_add<T>(self,rhs:T)->Ratio<<Num as Add<<Den as WideMul<T>>::Output>>::Output,Den>
|
||
|
where
|
||
|
Den:WideMul<T>,
|
||
|
Num:Add<<Den as WideMul<T>>::Output>,
|
||
|
{
|
||
|
Ratio{
|
||
|
num:self.num+self.den.wide_mul(rhs),
|
||
|
den:self.den,
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
impl<Num,Den,T> WideMul<T> for Ratio<Num,Den>
|
||
|
where
|
||
|
Num:WideMul<T>,
|
||
|
{
|
||
|
type Output=Ratio<<Num as WideMul<T>>::Output,Den>;
|
||
|
fn wide_mul(self,rhs:T)->Ratio<<Num as WideMul<T>>::Output,Den>{
|
||
|
Ratio{
|
||
|
num:self.num.wide_mul(rhs),
|
||
|
den:self.den,
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
impl<Num,Den,T> WideDiv<T> for Ratio<Num,Den>
|
||
|
where
|
||
|
Den:WideMul<T>,
|
||
|
{
|
||
|
type Output=Ratio<Num,<Den as WideMul<T>>::Output>;
|
||
|
fn wide_div(self,rhs:T)->Ratio<Num,<Den as WideMul<T>>::Output>{
|
||
|
Ratio{
|
||
|
num:self.num,
|
||
|
den:self.den.wide_mul(rhs),
|
||
|
}
|
||
|
}
|
||
|
}
|