rateslib/dual/dual_ops/
numeric_ops.rs

1use crate::dual::dual::{Dual, Dual2};
2use crate::dual::enums::Number;
3use std::ops::{Add, Div, Mul, Sub};
4
5pub trait NumberOps<T>:
6    Add<Output = T> + Sub<Output = T> + Mul<Output = T> + Div<Output = T> + Sized + Clone
7{
8}
9impl<'a, T: 'a> NumberOps<T> for &'a T where
10    &'a T: Add<Output = T> + Sub<Output = T> + Mul<Output = T> + Div<Output = T>
11{
12}
13impl NumberOps<Dual> for Dual {}
14impl NumberOps<Dual2> for Dual2 {}
15impl NumberOps<f64> for f64 {}
16impl NumberOps<Number> for Number {}
17
18#[cfg(test)]
19mod tests {
20    use super::*;
21
22    #[test]
23    fn test_fieldops() {
24        fn test_ops<T>(a: &T, b: &T) -> T
25        where
26            for<'a> &'a T: NumberOps<T>,
27        {
28            &(a + b) - a
29        }
30
31        fn test_ops2<T>(a: T, b: T) -> T
32        where
33            T: NumberOps<T>,
34        {
35            (a.clone() + b) - a
36        }
37
38        let x = 1.0;
39        let y = 2.0;
40        let z = test_ops(&x, &y);
41        println!("{:?}", z);
42
43        let z = test_ops2(x, y);
44        println!("{:?}", z);
45    }
46}