Skip to main content

poulpy_hal/delegates/
svp_ppol.rs

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);