1use crate::{
2 api::{
3 VecZnxDftAddAssign, VecZnxDftAddInto, VecZnxDftAddScaledAssign, VecZnxDftAlloc, VecZnxDftApply, VecZnxDftBytesOf,
4 VecZnxDftCopy, VecZnxDftFromBytes, VecZnxDftSub, VecZnxDftSubAssign, VecZnxDftSubNegateAssign, VecZnxDftZero,
5 VecZnxIdftApply, VecZnxIdftApplyTmpA, VecZnxIdftApplyTmpBytes,
6 },
7 layouts::{
8 Backend, Module, ScratchArena, VecZnxBackendRef, VecZnxBigBackendMut, VecZnxDft, VecZnxDftBackendMut,
9 VecZnxDftBackendRef, VecZnxDftOwned,
10 },
11 oep::HalVecZnxDftImpl,
12};
13
14macro_rules! impl_vec_znx_dft_delegate {
15 ($trait:ty, $($body:item)+) => {
16 impl<B> $trait for Module<B>
17 where
18 B: Backend + HalVecZnxDftImpl<B>,
19 {
20 $($body)+
21 }
22 };
23}
24
25impl<B: Backend> VecZnxDftFromBytes<B> for Module<B> {
26 fn vec_znx_dft_from_bytes(&self, cols: usize, size: usize, bytes: Vec<u8>) -> VecZnxDftOwned<B> {
27 VecZnxDft::<B::OwnedBuf, B>::from_bytes(self.n(), cols, size, bytes)
28 }
29}
30
31impl<B: Backend> VecZnxDftBytesOf for Module<B> {
32 fn bytes_of_vec_znx_dft(&self, cols: usize, size: usize) -> usize {
33 B::bytes_of_vec_znx_dft(self.n(), cols, size)
34 }
35}
36
37impl<B: Backend> VecZnxDftAlloc<B> for Module<B> {
38 fn vec_znx_dft_alloc(&self, cols: usize, size: usize) -> VecZnxDftOwned<B> {
39 VecZnxDftOwned::alloc(self.n(), cols, size)
40 }
41}
42
43impl_vec_znx_dft_delegate!(
44 VecZnxIdftApplyTmpBytes,
45 fn vec_znx_idft_apply_tmp_bytes(&self) -> usize {
46 B::vec_znx_idft_apply_tmp_bytes(self)
47 }
48);
49
50impl_vec_znx_dft_delegate!(
51 VecZnxIdftApply<B>,
52 fn vec_znx_idft_apply(
53 &self,
54 res: &mut VecZnxBigBackendMut<'_, B>,
55 res_col: usize,
56 a: &VecZnxDftBackendRef<'_, B>,
57 a_col: usize,
58 scratch: &mut ScratchArena<'_, B>,
59 ) {
60 B::vec_znx_idft_apply(self, res, res_col, a, a_col, scratch)
61 }
62);
63
64impl_vec_znx_dft_delegate!(
65 VecZnxIdftApplyTmpA<B>,
66 fn vec_znx_idft_apply_tmpa(
67 &self,
68 res: &mut VecZnxBigBackendMut<'_, B>,
69 res_col: usize,
70 a: &mut VecZnxDftBackendMut<'_, B>,
71 a_col: usize,
72 ) {
73 B::vec_znx_idft_apply_tmpa(self, res, res_col, a, a_col);
74 }
75);
76
77impl_vec_znx_dft_delegate!(
78 VecZnxDftApply<B>,
79 fn vec_znx_dft_apply(
80 &self,
81 step: usize,
82 offset: usize,
83 res: &mut VecZnxDftBackendMut<'_, B>,
84 res_col: usize,
85 a: &VecZnxBackendRef<'_, B>,
86 a_col: usize,
87 ) {
88 B::vec_znx_dft_apply(self, step, offset, res, res_col, a, a_col);
89 }
90);
91
92impl_vec_znx_dft_delegate!(
93 VecZnxDftAddInto<B>,
94 fn vec_znx_dft_add_into(
95 &self,
96 res: &mut VecZnxDftBackendMut<'_, B>,
97 res_col: usize,
98 a: &VecZnxDftBackendRef<'_, B>,
99 a_col: usize,
100 b: &VecZnxDftBackendRef<'_, B>,
101 b_col: usize,
102 ) {
103 B::vec_znx_dft_add_into(self, res, res_col, a, a_col, b, b_col);
104 }
105);
106
107impl_vec_znx_dft_delegate!(
108 VecZnxDftAddAssign<B>,
109 fn vec_znx_dft_add_assign(
110 &self,
111 res: &mut VecZnxDftBackendMut<'_, B>,
112 res_col: usize,
113 a: &VecZnxDftBackendRef<'_, B>,
114 a_col: usize,
115 ) {
116 B::vec_znx_dft_add_assign(self, res, res_col, a, a_col);
117 }
118);
119
120impl_vec_znx_dft_delegate!(
121 VecZnxDftAddScaledAssign<B>,
122 fn vec_znx_dft_add_scaled_assign(
123 &self,
124 res: &mut VecZnxDftBackendMut<'_, B>,
125 res_col: usize,
126 a: &VecZnxDftBackendRef<'_, B>,
127 a_col: usize,
128 a_scale: i64,
129 ) {
130 B::vec_znx_dft_add_scaled_assign(self, res, res_col, a, a_col, a_scale);
131 }
132);
133
134impl_vec_znx_dft_delegate!(
135 VecZnxDftSub<B>,
136 fn vec_znx_dft_sub(
137 &self,
138 res: &mut VecZnxDftBackendMut<'_, B>,
139 res_col: usize,
140 a: &VecZnxDftBackendRef<'_, B>,
141 a_col: usize,
142 b: &VecZnxDftBackendRef<'_, B>,
143 b_col: usize,
144 ) {
145 B::vec_znx_dft_sub(self, res, res_col, a, a_col, b, b_col);
146 }
147);
148
149impl_vec_znx_dft_delegate!(
150 VecZnxDftSubAssign<B>,
151 fn vec_znx_dft_sub_assign(
152 &self,
153 res: &mut VecZnxDftBackendMut<'_, B>,
154 res_col: usize,
155 a: &VecZnxDftBackendRef<'_, B>,
156 a_col: usize,
157 ) {
158 B::vec_znx_dft_sub_assign(self, res, res_col, a, a_col);
159 }
160);
161
162impl_vec_znx_dft_delegate!(
163 VecZnxDftSubNegateAssign<B>,
164 fn vec_znx_dft_sub_negate_assign(
165 &self,
166 res: &mut VecZnxDftBackendMut<'_, B>,
167 res_col: usize,
168 a: &VecZnxDftBackendRef<'_, B>,
169 a_col: usize,
170 ) {
171 B::vec_znx_dft_sub_negate_assign(self, res, res_col, a, a_col);
172 }
173);
174
175impl_vec_znx_dft_delegate!(
176 VecZnxDftCopy<B>,
177 fn vec_znx_dft_copy(
178 &self,
179 step: usize,
180 offset: usize,
181 res: &mut VecZnxDftBackendMut<'_, B>,
182 res_col: usize,
183 a: &VecZnxDftBackendRef<'_, B>,
184 a_col: usize,
185 ) {
186 B::vec_znx_dft_copy(self, step, offset, res, res_col, a, a_col);
187 }
188);
189
190impl_vec_znx_dft_delegate!(
191 VecZnxDftZero<B>,
192 fn vec_znx_dft_zero(&self, res: &mut VecZnxDftBackendMut<'_, B>, res_col: usize) {
193 B::vec_znx_dft_zero(self, res, res_col);
194 }
195);