aad/overload/scalar/
sub.rs1#[macro_export(local_inner_macros)]
2macro_rules! impl_scalar_sub_inner {
3 ($scalar:ty, $one:expr, $zero:expr) => {
4 #[inline]
5 fn sub(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_sub {
25 ($scalar:ty) => {
26 impl<'a> Sub<$scalar> for &Variable<'a, $scalar>
27 where
28 for<'b> &'b $scalar: Sub<$scalar, Output = $scalar>,
29 {
30 type Output = Variable<'a, $scalar>;
31 impl_scalar_sub_inner!($scalar, <$scalar>::one(), <$scalar>::zero());
32 }
33
34 impl<'a, 'b> Sub<$scalar> for &Variable<'a, Variable<'b, $scalar>>
35 where
36 for<'c> &'c $scalar: Sub<$scalar, Output = $scalar>,
37 {
38 type Output = Variable<'a, Variable<'b, $scalar>>;
39 impl_scalar_sub_inner!($scalar, Variable::one(), Variable::zero());
40 }
41
42 impl<'a> Sub<&Variable<'a, $scalar>> for $scalar
43 where
44 for<'b> &'b $scalar: Sub<$scalar, Output = $scalar>,
45 for<'b> &'b Variable<'a, $scalar>: Neg<Output = Variable<'a, $scalar>>,
46 {
47 type Output = Variable<'a, $scalar>;
48
49 #[inline]
50 fn sub(self, rhs: &Variable<'a, $scalar>) -> Self::Output {
51 -(rhs - self)
52 }
53 }
54
55 impl<'a, 'b> Sub<&Variable<'a, Variable<'b, $scalar>>> for $scalar
56 where
57 for<'c> &'c Variable<'a, $scalar>: Sub<$scalar, Output = Variable<'a, $scalar>>,
58 {
59 type Output = Variable<'a, Variable<'b, $scalar>>;
60
61 #[inline]
62 fn sub(self, rhs: &Variable<'a, Variable<'b, $scalar>>) -> Self::Output {
63 rhs - self
64 }
65 }
66
67 impl<'a> Sub<&Variable<'a, $scalar>> for &$scalar
68 where
69 for<'b> &'b $scalar: Sub<$scalar, Output = $scalar>,
70 for<'b> &'b Variable<'a, $scalar>: Neg<Output = Variable<'a, $scalar>>,
71 {
72 type Output = Variable<'a, $scalar>;
73
74 #[inline]
75 fn sub(self, rhs: &Variable<'a, $scalar>) -> Self::Output {
76 -(rhs - *self)
77 }
78 }
79
80 impl<'a, 'b> Sub<&Variable<'a, Variable<'b, $scalar>>> for &$scalar
81 where
82 for<'c> &'c Variable<'a, $scalar>: Sub<$scalar, Output = Variable<'a, $scalar>>,
83 {
84 type Output = Variable<'a, Variable<'b, $scalar>>;
85
86 #[inline]
87 fn sub(self, rhs: &Variable<'a, Variable<'b, $scalar>>) -> Self::Output {
88 rhs - *self
89 }
90 }
91 };
92}