decaf377/ark_curve/r1cs/
ops.rs

1use core::ops::{Add, AddAssign, Sub, SubAssign};
2
3use crate::ark_curve::{r1cs::element::ElementVar, Element};
4
5use super::lazy::LazyElementVar;
6
7impl Add for ElementVar {
8    type Output = ElementVar;
9
10    fn add(self, other: ElementVar) -> Self::Output {
11        ElementVar {
12            inner: LazyElementVar::new_from_element(
13                self.inner
14                    .element()
15                    .expect("element will exist")
16                    .add(other.inner.element().expect("element will exist")),
17            ),
18        }
19    }
20}
21
22impl<'a> Add<&'a ElementVar> for ElementVar {
23    type Output = ElementVar;
24
25    fn add(self, other: &'a ElementVar) -> Self::Output {
26        ElementVar {
27            inner: LazyElementVar::new_from_element(
28                self.inner
29                    .element()
30                    .expect("element will exist")
31                    .add(other.inner.element().expect("element will exist")),
32            ),
33        }
34    }
35}
36
37impl AddAssign for ElementVar {
38    fn add_assign(&mut self, rhs: ElementVar) {
39        let rhs = rhs.inner.element().expect("element will exist");
40        let mut lhs = self.inner.element().expect("element will exist");
41        lhs.add_assign(rhs);
42
43        *self = ElementVar {
44            inner: LazyElementVar::new_from_element(lhs),
45        };
46    }
47}
48
49impl<'a> AddAssign<&'a ElementVar> for ElementVar {
50    fn add_assign(&mut self, rhs: &'a ElementVar) {
51        let rhs = rhs.inner.element().expect("element will exist");
52        let mut lhs = self.inner.element().expect("element will exist");
53        lhs.add_assign(rhs);
54
55        *self = ElementVar {
56            inner: LazyElementVar::new_from_element(lhs),
57        };
58    }
59}
60
61impl Sub for ElementVar {
62    type Output = ElementVar;
63
64    fn sub(self, other: ElementVar) -> Self::Output {
65        ElementVar {
66            inner: LazyElementVar::new_from_element(
67                self.inner
68                    .element()
69                    .expect("element will exist")
70                    .sub(other.inner.element().expect("element will exist")),
71            ),
72        }
73    }
74}
75
76impl<'a> Sub<&'a ElementVar> for ElementVar {
77    type Output = ElementVar;
78
79    fn sub(self, other: &'a ElementVar) -> Self::Output {
80        ElementVar {
81            inner: LazyElementVar::new_from_element(
82                self.inner
83                    .element()
84                    .expect("element will exist")
85                    .sub(other.inner.element().expect("element will exist")),
86            ),
87        }
88    }
89}
90
91impl SubAssign for ElementVar {
92    fn sub_assign(&mut self, rhs: ElementVar) {
93        let rhs = rhs.inner.element().expect("element will exist");
94        let mut lhs = self.inner.element().expect("element will exist");
95        lhs.sub_assign(rhs);
96
97        *self = ElementVar {
98            inner: LazyElementVar::new_from_element(lhs),
99        };
100    }
101}
102
103impl<'a> SubAssign<&'a ElementVar> for ElementVar {
104    fn sub_assign(&mut self, rhs: &'a ElementVar) {
105        let rhs = rhs.inner.element().expect("element will exist");
106        let mut lhs = self.inner.element().expect("element will exist");
107        lhs.sub_assign(rhs);
108
109        *self = ElementVar {
110            inner: LazyElementVar::new_from_element(lhs),
111        };
112    }
113}
114
115impl Sub<Element> for ElementVar {
116    type Output = ElementVar;
117
118    fn sub(self, other: Element) -> Self::Output {
119        ElementVar {
120            inner: LazyElementVar::new_from_element(
121                self.inner.element().expect("element will exist").sub(other),
122            ),
123        }
124    }
125}
126
127impl SubAssign<Element> for ElementVar {
128    fn sub_assign(&mut self, rhs: Element) {
129        let mut lhs = self.inner.element().expect("element will exist");
130        lhs.sub_assign(rhs);
131
132        *self = ElementVar {
133            inner: LazyElementVar::new_from_element(lhs),
134        };
135    }
136}
137
138impl Add<Element> for ElementVar {
139    type Output = ElementVar;
140
141    fn add(self, other: Element) -> Self::Output {
142        ElementVar {
143            inner: LazyElementVar::new_from_element(
144                self.inner.element().expect("element will exist").add(other),
145            ),
146        }
147    }
148}
149
150impl AddAssign<Element> for ElementVar {
151    fn add_assign(&mut self, rhs: Element) {
152        let mut lhs = self.inner.element().expect("element will exist");
153        lhs.add_assign(rhs);
154
155        *self = ElementVar {
156            inner: LazyElementVar::new_from_element(lhs),
157        };
158    }
159}