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), } } }