decaf377/ark_curve/r1cs/
ops.rs1use 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}