aad/overload/scalar/
add.rs1#[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}