aad/overload/scalar/
add.rs

1#[macro_export(local_inner_macros)]
2macro_rules! impl_scalar_add_inner {
3    ($scalar:ty, $one:expr, $zero:expr) => {
4        #[inline]
5        fn add(self, rhs: $scalar) -> Self::Output {
6            let value = &self.value + rhs;
7            match &self.index {
8                Some((i, tape)) => Variable {
9                    index: {
10                        let mut operations = tape.operations.borrow_mut();
11                        let count = operations.len();
12                        operations.push(OperationRecord([(*i, $one), (usize::MAX, $zero)]));
13                        Some((count, tape))
14                    },
15                    value,
16                },
17                None => Variable { index: None, value },
18            }
19        }
20    };
21}
22
23#[macro_export(local_inner_macros)]
24macro_rules! impl_scalar_add {
25    ($scalar:ty) => {
26        impl<'a> Add<$scalar> for &Variable<'a, $scalar>
27        where
28            for<'b> &'b $scalar: Add<$scalar, Output = $scalar>,
29        {
30            type Output = Variable<'a, $scalar>;
31            impl_scalar_add_inner!($scalar, <$scalar>::one(), <$scalar>::zero());
32        }
33
34        impl<'a, 'b> Add<$scalar> for &Variable<'a, Variable<'b, $scalar>>
35        where
36            for<'c> &'c $scalar: Add<$scalar, Output = $scalar>,
37        {
38            type Output = Variable<'a, Variable<'b, $scalar>>;
39            impl_scalar_add_inner!($scalar, Variable::one(), Variable::zero());
40        }
41
42        impl<'a> Add<&Variable<'a, $scalar>> for $scalar
43        where
44            for<'b> &'b Variable<'a, $scalar>: Add<$scalar, Output = Variable<'a, $scalar>>,
45        {
46            type Output = Variable<'a, $scalar>;
47
48            #[inline]
49            fn add(self, rhs: &Variable<'a, $scalar>) -> Self::Output {
50                rhs + self
51            }
52        }
53
54        impl<'a, 'b> Add<&Variable<'a, Variable<'b, $scalar>>> for $scalar
55        where
56            for<'c> &'c Variable<'a, $scalar>: Add<$scalar, Output = Variable<'a, $scalar>>,
57        {
58            type Output = Variable<'a, Variable<'b, $scalar>>;
59
60            #[inline]
61            fn add(self, rhs: &Variable<'a, Variable<'b, $scalar>>) -> Self::Output {
62                rhs + self
63            }
64        }
65
66        impl<'a> Add<&Variable<'a, $scalar>> for &$scalar
67        where
68            for<'b> &'b Variable<'a, $scalar>: Add<$scalar, Output = Variable<'a, $scalar>>,
69        {
70            type Output = Variable<'a, $scalar>;
71
72            #[inline]
73            fn add(self, rhs: &Variable<'a, $scalar>) -> Self::Output {
74                rhs + *self
75            }
76        }
77
78        impl<'a, 'b> Add<&Variable<'a, Variable<'b, $scalar>>> for &$scalar
79        where
80            for<'c> &'c Variable<'a, $scalar>: Add<$scalar, Output = Variable<'a, $scalar>>,
81        {
82            type Output = Variable<'a, Variable<'b, $scalar>>;
83
84            #[inline]
85            fn add(self, rhs: &Variable<'a, Variable<'b, $scalar>>) -> Self::Output {
86                rhs + *self
87            }
88        }
89    };
90}