1use crate::{
2 api::{
3 SvpApplyDft, SvpApplyDftToDft, SvpApplyDftToDftAdd, SvpApplyDftToDftInplace, SvpPPolAlloc, SvpPPolBytesOf,
4 SvpPPolFromBytes, SvpPrepare,
5 },
6 layouts::{
7 Backend, Module, ScalarZnxToRef, SvpPPolOwned, SvpPPolToMut, SvpPPolToRef, VecZnxDftToMut, VecZnxDftToRef, VecZnxToRef,
8 },
9 oep::{
10 SvpApplyDftImpl, SvpApplyDftToDftAddImpl, SvpApplyDftToDftImpl, SvpApplyDftToDftInplaceImpl, SvpPPolAllocBytesImpl,
11 SvpPPolAllocImpl, SvpPPolFromBytesImpl, SvpPrepareImpl,
12 },
13};
14
15impl<B> SvpPPolFromBytes<B> for Module<B>
16where
17 B: Backend + SvpPPolFromBytesImpl<B>,
18{
19 fn svp_ppol_from_bytes(&self, cols: usize, bytes: Vec<u8>) -> SvpPPolOwned<B> {
20 B::svp_ppol_from_bytes_impl(self.n(), cols, bytes)
21 }
22}
23
24impl<B> SvpPPolAlloc<B> for Module<B>
25where
26 B: Backend + SvpPPolAllocImpl<B>,
27{
28 fn svp_ppol_alloc(&self, cols: usize) -> SvpPPolOwned<B> {
29 B::svp_ppol_alloc_impl(self.n(), cols)
30 }
31}
32
33impl<B> SvpPPolBytesOf for Module<B>
34where
35 B: Backend + SvpPPolAllocBytesImpl<B>,
36{
37 fn bytes_of_svp_ppol(&self, cols: usize) -> usize {
38 B::svp_ppol_bytes_of_impl(self.n(), cols)
39 }
40}
41
42impl<B> SvpPrepare<B> for Module<B>
43where
44 B: Backend + SvpPrepareImpl<B>,
45{
46 fn svp_prepare<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
47 where
48 R: SvpPPolToMut<B>,
49 A: ScalarZnxToRef,
50 {
51 B::svp_prepare_impl(self, res, res_col, a, a_col);
52 }
53}
54
55impl<B> SvpApplyDft<B> for Module<B>
56where
57 B: Backend + SvpApplyDftImpl<B>,
58{
59 fn svp_apply_dft<R, A, C>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize)
60 where
61 R: VecZnxDftToMut<B>,
62 A: SvpPPolToRef<B>,
63 C: VecZnxToRef,
64 {
65 B::svp_apply_dft_impl(self, res, res_col, a, a_col, b, b_col);
66 }
67}
68
69impl<B> SvpApplyDftToDft<B> for Module<B>
70where
71 B: Backend + SvpApplyDftToDftImpl<B>,
72{
73 fn svp_apply_dft_to_dft<R, A, C>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize)
74 where
75 R: VecZnxDftToMut<B>,
76 A: SvpPPolToRef<B>,
77 C: VecZnxDftToRef<B>,
78 {
79 B::svp_apply_dft_to_dft_impl(self, res, res_col, a, a_col, b, b_col);
80 }
81}
82
83impl<B> SvpApplyDftToDftAdd<B> for Module<B>
84where
85 B: Backend + SvpApplyDftToDftAddImpl<B>,
86{
87 fn svp_apply_dft_to_dft_add<R, A, C>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize)
88 where
89 R: VecZnxDftToMut<B>,
90 A: SvpPPolToRef<B>,
91 C: VecZnxDftToRef<B>,
92 {
93 B::svp_apply_dft_to_dft_add_impl(self, res, res_col, a, a_col, b, b_col);
94 }
95}
96
97impl<B> SvpApplyDftToDftInplace<B> for Module<B>
98where
99 B: Backend + SvpApplyDftToDftInplaceImpl,
100{
101 fn svp_apply_dft_to_dft_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
102 where
103 R: VecZnxDftToMut<B>,
104 A: SvpPPolToRef<B>,
105 {
106 B::svp_apply_dft_to_dft_inplace_impl(self, res, res_col, a, a_col);
107 }
108}