1use poulpy_hal::layouts::{Backend, Module, ScratchArena};
2
3use crate::{
4 api::{GGLWEKeyswitch, GGSWKeyswitch, GLWEKeyswitch, LWEKeyswitch},
5 layouts::{
6 GGLWEInfos, GGLWEToBackendMut, GGLWEToBackendRef, GGSWInfos, GGSWToBackendMut, GGSWToBackendRef, GLWEInfos,
7 GLWEToBackendMut, GLWEToBackendRef, LWEInfos, LWEToBackendMut, LWEToBackendRef,
8 prepared::{GGLWEPreparedToBackendRef, GGLWEToGGSWKeyPreparedToBackendRef},
9 },
10 oep::{GGLWEKeyswitchImpl, GGSWKeyswitchImpl, GLWEKeyswitchImpl, LWEKeyswitchImpl},
11};
12
13macro_rules! impl_keyswitching_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_keyswitching_delegate!(
25 GLWEKeyswitch<BE>,
26 [BE: Backend + GLWEKeyswitchImpl<BE>],
27 fn glwe_keyswitch_tmp_bytes<R, A, B>(&self, res_infos: &R, a_infos: &A, key_infos: &B) -> usize
28 where
29 R: GLWEInfos,
30 A: GLWEInfos,
31 B: GGLWEInfos,
32 {
33 BE::glwe_keyswitch_tmp_bytes(self, res_infos, a_infos, key_infos)
34 }
35
36 fn glwe_keyswitch<R, A, K>(&self, res: &mut R, a: &A, key: &K, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
37 where
38 R: GLWEToBackendMut<BE> + GLWEInfos,
39 A: GLWEToBackendRef<BE> + GLWEInfos,
40 K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
41 {
42 BE::glwe_keyswitch(self, res, a, key, key_size, scratch)
43 }
44
45 fn glwe_keyswitch_assign<R, K>(&self, res: &mut R, key: &K, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
46 where
47 R: GLWEToBackendMut<BE> + GLWEInfos,
48 K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
49 {
50 BE::glwe_keyswitch_assign(self, res, key, key_size, scratch)
51 }
52);
53
54impl_keyswitching_delegate!(
55 GGLWEKeyswitch<BE>,
56 [BE: Backend + GGLWEKeyswitchImpl<BE>],
57 fn gglwe_keyswitch_tmp_bytes<R, A, K>(&self, res_infos: &R, a_infos: &A, key_infos: &K) -> usize
58 where
59 R: GGLWEInfos,
60 A: GGLWEInfos,
61 K: GGLWEInfos,
62 {
63 BE::gglwe_keyswitch_tmp_bytes(self, res_infos, a_infos, key_infos)
64 }
65
66 fn gglwe_keyswitch<R, A, B>(&self, res: &mut R, a: &A, b: &B, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
67 where
68 R: GGLWEToBackendMut<BE> + GGLWEInfos,
69 A: GGLWEToBackendRef<BE> + GGLWEInfos,
70 B: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
71 {
72 BE::gglwe_keyswitch(self, res, a, b, key_size, scratch)
73 }
74
75 fn gglwe_keyswitch_assign<R, A>(&self, res: &mut R, a: &A, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
76 where
77 R: GGLWEToBackendMut<BE> + GGLWEInfos,
78 A: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
79 {
80 BE::gglwe_keyswitch_assign(self, res, a, key_size, scratch)
81 }
82);
83
84impl_keyswitching_delegate!(
85 GGSWKeyswitch<BE>,
86 [BE: Backend + GGSWKeyswitchImpl<BE>],
87 fn ggsw_keyswitch_tmp_bytes<R, A, K, T>(&self, res_infos: &R, a_infos: &A, key_infos: &K, tsk_infos: &T) -> usize
88 where
89 R: GGSWInfos,
90 A: GGSWInfos,
91 K: GGLWEInfos,
92 T: GGLWEInfos,
93 {
94 BE::ggsw_keyswitch_tmp_bytes(self, res_infos, a_infos, key_infos, tsk_infos)
95 }
96
97 fn ggsw_keyswitch<R, A, K, T>(
98 &self,
99 res: &mut R,
100 a: &A,
101 key: &K,
102 key_size: usize,
103 tsk: &T,
104 tsk_size: usize,
105 scratch: &mut ScratchArena<'_, BE>,
106 )
107 where
108 R: GGSWToBackendMut<BE> + GGSWInfos,
109 A: GGSWToBackendRef<BE> + GGSWInfos,
110 K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
111 T: GGLWEToGGSWKeyPreparedToBackendRef<BE> + GGLWEInfos,
112 {
113 BE::ggsw_keyswitch(self, res, a, key, key_size, tsk, tsk_size, scratch)
114 }
115
116 fn ggsw_keyswitch_assign<R, K, T>(
117 &self,
118 res: &mut R,
119 key: &K,
120 key_size: usize,
121 tsk: &T,
122 tsk_size: usize,
123 scratch: &mut ScratchArena<'_, BE>,
124 )
125 where
126 R: GGSWToBackendMut<BE> + GGSWInfos,
127 K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
128 T: GGLWEToGGSWKeyPreparedToBackendRef<BE> + GGLWEInfos,
129 {
130 BE::ggsw_keyswitch_assign(self, res, key, key_size, tsk, tsk_size, scratch)
131 }
132);
133
134impl_keyswitching_delegate!(
135 LWEKeyswitch<BE>,
136 [BE: Backend + LWEKeyswitchImpl<BE>],
137 fn lwe_keyswitch_tmp_bytes<R, A, K>(&self, res_infos: &R, a_infos: &A, key_infos: &K) -> usize
138 where
139 R: LWEInfos,
140 A: LWEInfos,
141 K: GGLWEInfos,
142 {
143 BE::lwe_keyswitch_tmp_bytes(self, res_infos, a_infos, key_infos)
144 }
145
146 fn lwe_keyswitch<R, A, K>(&self, res: &mut R, a: &A, ksk: &K, key_size: usize, scratch: &mut ScratchArena<'_, BE>)
147 where
148 R: LWEToBackendMut<BE> + LWEInfos,
149 A: LWEToBackendRef<BE> + LWEInfos,
150 K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
151 {
152 BE::lwe_keyswitch(self, res, a, ksk, key_size, scratch)
153 }
154);