1use poulpy_hal::layouts::{Backend, Module, ScratchArena};
2
3use crate::{
4 api::{GGSWExpandRows, GGSWFromGGLWE, GLWEExpandLWE, GLWEFromLWE, LWEFromGLWE, LWESampleExtract},
5 layouts::{
6 GGLWEInfos, GGSWInfos, GGSWToBackendMut, GLWEInfos, GLWEToBackendMut, GLWEToBackendRef, LWEInfos, LWEToBackendMut,
7 LWEToBackendRef,
8 prepared::{GGLWEPreparedToBackendRef, GGLWEToGGSWKeyPreparedToBackendRef},
9 },
10 oep::{ConversionDefault, ConversionImpl},
11};
12
13macro_rules! impl_conversion_delegate {
14 ($trait:ty, [$($bounds:tt)+], $($body:item)+) => {
15 impl<BE> $trait for Module<BE>
16 where
17 $($bounds)+
18 {
19 $($body)+
20 }
21 };
22}
23
24impl_conversion_delegate!(
25 LWESampleExtract<BE>,
26 [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
27 fn lwe_sample_extract<R, A>(&self, res: &mut R, a: &A)
28 where
29 R: LWEToBackendMut<BE> + LWEInfos,
30 A: GLWEToBackendRef<BE> + GLWEInfos,
31 {
32 BE::lwe_sample_extract(self, res, a)
33 }
34);
35
36impl_conversion_delegate!(
37 GLWEFromLWE<BE>,
38 [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
39 fn glwe_from_lwe_tmp_bytes<R, A, K>(&self, glwe_infos: &R, lwe_infos: &A, key_infos: &K) -> usize
40 where
41 R: GLWEInfos,
42 A: LWEInfos,
43 K: GGLWEInfos,
44 {
45 BE::glwe_from_lwe_tmp_bytes(self, glwe_infos, lwe_infos, key_infos)
46 }
47
48 fn glwe_from_lwe<R, A, K>(
49 &self,
50 res: &mut R,
51 lwe: &A,
52 ksk: &K,
53 key_size: usize,
54 scratch: &mut ScratchArena<'_, BE>,
55 )
56 where
57 R: GLWEToBackendMut<BE> + GLWEInfos,
58 A: LWEToBackendRef<BE> + LWEInfos,
59 K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
60 {
61 BE::glwe_from_lwe(self, res, lwe, ksk, key_size, scratch)
62 }
63);
64
65impl_conversion_delegate!(
66 LWEFromGLWE<BE>,
67 [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
68 fn lwe_from_glwe_tmp_bytes<R, A, K>(&self, lwe_infos: &R, glwe_infos: &A, key_infos: &K) -> usize
69 where
70 R: LWEInfos,
71 A: GLWEInfos,
72 K: GGLWEInfos,
73 {
74 BE::lwe_from_glwe_tmp_bytes(self, lwe_infos, glwe_infos, key_infos)
75 }
76
77 fn lwe_from_glwe<R, A, K>(
78 &self,
79 res: &mut R,
80 a: &A,
81 a_idx: usize,
82 key: &K,
83 key_size: usize,
84 scratch: &mut ScratchArena<'_, BE>,
85 )
86 where
87 R: LWEToBackendMut<BE> + LWEInfos,
88 A: GLWEToBackendRef<BE> + GLWEInfos,
89 K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
90 {
91 BE::lwe_from_glwe(self, res, a, a_idx, key, key_size, scratch)
92 }
93);
94
95impl_conversion_delegate!(
96 GLWEExpandLWE<BE>,
97 [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
98 fn glwe_expand_lwe_tmp_bytes<R, A>(&self, lwe_infos: &R, a_infos: &A) -> usize
99 where
100 R: LWEInfos,
101 A: GLWEInfos,
102 {
103 BE::glwe_expand_lwe_tmp_bytes(self, lwe_infos, a_infos)
104 }
105
106 fn glwe_expand_lwe<R, A>(&self, res: &mut [R], a: &A, scratch: &mut ScratchArena<'_, BE>)
107 where
108 R: LWEToBackendMut<BE> + LWEInfos,
109 A: GLWEToBackendRef<BE> + GLWEInfos,
110 {
111 BE::glwe_expand_lwe(self, res, a, scratch)
112 }
113);
114
115impl_conversion_delegate!(
116 GGSWFromGGLWE<BE>,
117 [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
118 fn ggsw_from_gglwe_tmp_bytes<R, A>(&self, res_infos: &R, tsk_infos: &A) -> usize
119 where
120 R: GGSWInfos,
121 A: GGLWEInfos,
122 {
123 BE::ggsw_from_gglwe_tmp_bytes(self, res_infos, tsk_infos)
124 }
125
126 fn ggsw_from_gglwe<R, A, T>(
127 &self,
128 res: &mut R,
129 a: &A,
130 tsk: &T,
131 tsk_size: usize,
132 scratch: &mut ScratchArena<'_, BE>,
133 )
134 where
135 R: GGSWToBackendMut<BE> + GGSWInfos,
136 A: crate::layouts::GGLWEToBackendRef<BE> + GGLWEInfos,
137 T: GGLWEToGGSWKeyPreparedToBackendRef<BE> + GGLWEInfos,
138 {
139 BE::ggsw_from_gglwe(self, res, a, tsk, tsk_size, scratch)
140 }
141);
142
143impl_conversion_delegate!(
144 GGSWExpandRows<BE>,
145 [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
146 fn ggsw_expand_rows_tmp_bytes<R, A>(&self, res_infos: &R, tsk_infos: &A) -> usize
147 where
148 R: GGSWInfos,
149 A: GGLWEInfos,
150 {
151 BE::ggsw_expand_rows_tmp_bytes(self, res_infos, tsk_infos)
152 }
153
154 fn ggsw_expand_row<R, T>(
155 &self,
156 res: &mut R,
157 tsk: &T,
158 tsk_size: usize,
159 scratch: &mut ScratchArena<'_, BE>,
160 )
161 where
162 R: GGSWToBackendMut<BE> + GGSWInfos,
163 T: GGLWEToGGSWKeyPreparedToBackendRef<BE> + GGLWEInfos,
164 {
165 BE::ggsw_expand_row(self, res, tsk, tsk_size, scratch)
166 }
167);