@@ -329,6 +329,24 @@ macro_rules! impl_scalar_math_operator {
329329 Tf :: new_from_rf( new_rf)
330330 }
331331 }
332+
333+ impl <U : Time > $operator<& $struct_type<$scalar_type, U >> for $scalar_type {
334+ type Output = $struct_type<$scalar_type, U >;
335+ fn $operator_fn( self , rhs: & $struct_type<$scalar_type, U >) -> Self :: Output {
336+ let scalar_rf = RationalFunction :: new_from_scalar( self ) ;
337+ let new_rf = scalar_rf. $operator_fn( & rhs. rf) ;
338+ Tf :: new_from_rf( new_rf)
339+ }
340+ }
341+
342+ impl <U : Time > $operator<$scalar_type> for & $struct_type<$scalar_type, U > {
343+ type Output = $struct_type<$scalar_type, U >;
344+ fn $operator_fn( self , rhs: $scalar_type) -> Self :: Output {
345+ let scalar_rf = RationalFunction :: new_from_scalar( rhs) ;
346+ let new_rf = ( & self . rf) . $operator_fn( & scalar_rf) ;
347+ Tf :: new_from_rf( new_rf)
348+ }
349+ }
332350 ) *
333351 } ;
334352}
@@ -370,12 +388,38 @@ impl_scalar_math_operator!(
370388 i128 ,
371389 [ ( Add , add) , ( Sub , sub) , ( Mul , mul) , ( Div , div) ]
372390) ;
373- impl_scalar_math_operator ! ( Tf , u8 , [ ( Add , add) , ( Mul , mul) , ( Div , div) ] ) ;
374- impl_scalar_math_operator ! ( Tf , u16 , [ ( Add , add) , ( Mul , mul) , ( Div , div) ] ) ;
375391
376- impl_scalar_math_operator ! ( Tf , u32 , [ ( Add , add) , ( Mul , mul) , ( Div , div) ] ) ;
377- impl_scalar_math_operator ! ( Tf , u64 , [ ( Add , add) , ( Mul , mul) , ( Div , div) ] ) ;
378- impl_scalar_math_operator ! ( Tf , u128 , [ ( Add , add) , ( Mul , mul) , ( Div , div) ] ) ;
392+ macro_rules! impl_comb_ref_and_no_ref_operators {
393+ ( $struct_type: ident , [ $( ( $operator: ident, $operator_fn: ident) ) , * ] ) => {
394+ $(
395+ impl <T , U : Time > $operator<& $struct_type<T , U >> for $struct_type<T , U >
396+ where
397+ T : $operator<Output = T > + Clone + Zero + One + Default + Add + AddAssign + Mul <Output = T > + Neg <Output = T > + Copy ,
398+ {
399+ type Output = $struct_type<T , U >;
400+ fn $operator_fn( self , rhs: & $struct_type<T , U >) -> Self :: Output {
401+ ( & self ) . $operator_fn( rhs)
402+ }
403+ }
404+
405+ impl <T , U : Time > $operator<$struct_type<T , U >> for & $struct_type<T , U >
406+ where
407+ T : $operator<Output = T > + Clone + Zero + One + Default + Add + AddAssign + Mul <Output = T > + Neg <Output = T > + Copy ,
408+ {
409+ type Output = $struct_type<T , U >;
410+ fn $operator_fn( self , rhs: $struct_type<T , U >) -> Self :: Output {
411+ self . $operator_fn( & rhs)
412+ }
413+ }
414+ ) *
415+ } ;
416+ }
417+
418+ impl_comb_ref_and_no_ref_operators ! (
419+ Tf ,
420+ [ ( Mul , mul) , ( Div , div) , ( Sub , sub) , ( Add , add) ]
421+ ) ;
422+
379423impl < T , U : Time > Tf < T , U >
380424where
381425 T : One + Zero + Mul < Output = T > + AddAssign + Clone ,
@@ -637,5 +681,9 @@ mod tests {
637681 let ans = 3.0 * tf_org;
638682
639683 assert_abs_diff_eq ! ( tf. eval( & 1.2 ) , ans. eval( & 1.2 ) , epsilon = 1e-9 ) ;
684+
685+ let s = Tf :: s ( ) ;
686+
687+ let _ = & s + 1.0 - & s * ( 1.0 + & s) / & s;
640688 }
641689}
0 commit comments