1use crate::{
2 api::{SvpApplyDft, SvpApplyDftToDft, SvpApplyDftToDftAssign, SvpPPolAlloc, SvpPPolBytesOf, SvpPPolCopyBackend, SvpPrepare},
3 layouts::{
4 Backend, Module, ScalarZnxBackendRef, SvpPPolBackendMut, SvpPPolBackendRef, SvpPPolOwned, VecZnxBackendRef,
5 VecZnxDftBackendMut, VecZnxDftBackendRef,
6 },
7 oep::HalSvpImpl,
8};
9
10macro_rules! impl_svp_delegate {
11 ($trait:ty, $($body:item)+) => {
12 impl<B> $trait for Module<B>
13 where
14 B: Backend + HalSvpImpl<B>,
15 {
16 $($body)+
17 }
18 };
19}
20
21impl<B: Backend> SvpPPolAlloc<B> for Module<B> {
22 fn svp_ppol_alloc(&self, cols: usize) -> SvpPPolOwned<B> {
23 SvpPPolOwned::alloc(self.n(), cols)
24 }
25}
26
27impl<B: Backend> SvpPPolBytesOf for Module<B> {
28 fn bytes_of_svp_ppol(&self, cols: usize) -> usize {
29 B::bytes_of_svp_ppol(self.n(), cols)
30 }
31}
32
33impl_svp_delegate!(
34 SvpPrepare<B>,
35 fn svp_prepare(&self, res: &mut SvpPPolBackendMut<'_, B>, res_col: usize, a: &ScalarZnxBackendRef<'_, B>, a_col: usize) {
36 B::svp_prepare(self, res, res_col, a, a_col);
37 }
38);
39
40impl_svp_delegate!(
41 SvpPPolCopyBackend<B>,
42 fn svp_ppol_copy_backend(
43 &self,
44 res: &mut SvpPPolBackendMut<'_, B>,
45 res_col: usize,
46 a: &SvpPPolBackendRef<'_, B>,
47 a_col: usize,
48 ) {
49 B::svp_ppol_copy_backend(self, res, res_col, a, a_col);
50 }
51);
52
53impl_svp_delegate!(
54 SvpApplyDft<B>,
55 fn svp_apply_dft(
56 &self,
57 res: &mut VecZnxDftBackendMut<'_, B>,
58 res_col: usize,
59 a: &SvpPPolBackendRef<'_, B>,
60 a_col: usize,
61 b: &VecZnxBackendRef<'_, B>,
62 b_col: usize,
63 ) {
64 B::svp_apply_dft(self, res, res_col, a, a_col, b, b_col);
65 }
66);
67
68impl_svp_delegate!(
69 SvpApplyDftToDft<B>,
70 fn svp_apply_dft_to_dft(
71 &self,
72 res: &mut VecZnxDftBackendMut<'_, B>,
73 res_col: usize,
74 a: &SvpPPolBackendRef<'_, B>,
75 a_col: usize,
76 b: &VecZnxDftBackendRef<'_, B>,
77 b_col: usize,
78 ) {
79 B::svp_apply_dft_to_dft(self, res, res_col, a, a_col, b, b_col);
80 }
81);
82
83impl_svp_delegate!(
84 SvpApplyDftToDftAssign<B>,
85 fn svp_apply_dft_to_dft_assign(
86 &self,
87 res: &mut VecZnxDftBackendMut<'_, B>,
88 res_col: usize,
89 a: &SvpPPolBackendRef<'_, B>,
90 a_col: usize,
91 ) {
92 B::svp_apply_dft_to_dft_assign(self, res, res_col, a, a_col);
93 }
94);