poulpy/poulpy-hal/src/oep/scratch.rs
poulpy-hal/src/oep/scratch.rsRaw
1use crate::layouts::{
2 Backend, DataRef, MatZnx, ScalarZnx, Scratch, ScratchOwned, SvpPPol, VecZnx, VecZnxBig, VecZnxDft, VmpPMat, ZnxInfos,
3};
4
5/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
6/// * See TODO for reference code.
7/// * See TODO for corresponding public API.
8/// # Safety [crate::doc::backend_safety] for safety contract.
9pub unsafe trait ScratchOwnedAllocImpl<B: Backend> {
10 fn scratch_owned_alloc_impl(size: usize) -> ScratchOwned<B>;
11}
12
13/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
14/// * See TODO for reference code.
15/// * See TODO for corresponding public API.
16/// # Safety [crate::doc::backend_safety] for safety contract.
17pub unsafe trait ScratchOwnedBorrowImpl<B: Backend> {
18 fn scratch_owned_borrow_impl(scratch: &mut ScratchOwned<B>) -> &mut Scratch<B>;
19}
20
21/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
22/// * See TODO for reference code.
23/// * See TODO for corresponding public API.
24/// # Safety [crate::doc::backend_safety] for safety contract.
25pub unsafe trait ScratchFromBytesImpl<B: Backend> {
26 fn scratch_from_bytes_impl(data: &mut [u8]) -> &mut Scratch<B>;
27}
28
29/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
30/// * See TODO for reference code.
31/// * See TODO for corresponding public API.
32/// # Safety [crate::doc::backend_safety] for safety contract.
33pub unsafe trait ScratchAvailableImpl<B: Backend> {
34 fn scratch_available_impl(scratch: &Scratch<B>) -> usize;
35}
36
37/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
38/// * See TODO for reference code.
39/// * See TODO for corresponding public API.
40/// # Safety [crate::doc::backend_safety] for safety contract.
41pub unsafe trait TakeSliceImpl<B: Backend> {
42 fn take_slice_impl<T>(scratch: &mut Scratch<B>, len: usize) -> (&mut [T], &mut Scratch<B>);
43}
44
45/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
46/// * See TODO for reference code.
47/// * See TODO for corresponding public API.
48/// # Safety [crate::doc::backend_safety] for safety contract.
49pub unsafe trait TakeScalarZnxImpl<B: Backend> {
50 fn take_scalar_znx_impl(scratch: &mut Scratch<B>, n: usize, cols: usize) -> (ScalarZnx<&mut [u8]>, &mut Scratch<B>);
51}
52
53/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
54/// * See TODO for reference code.
55/// * See TODO for corresponding public API.
56/// # Safety [crate::doc::backend_safety] for safety contract.
57pub unsafe trait TakeSvpPPolImpl<B: Backend> {
58 fn take_svp_ppol_impl(scratch: &mut Scratch<B>, n: usize, cols: usize) -> (SvpPPol<&mut [u8], B>, &mut Scratch<B>);
59}
60
61/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
62/// * See TODO for reference code.
63/// * See TODO for corresponding public API.
64/// # Safety [crate::doc::backend_safety] for safety contract.
65pub unsafe trait TakeVecZnxImpl<B: Backend> {
66 fn take_vec_znx_impl(scratch: &mut Scratch<B>, n: usize, cols: usize, size: usize) -> (VecZnx<&mut [u8]>, &mut Scratch<B>);
67}
68
69/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
70/// * See TODO for reference code.
71/// * See TODO for corresponding public API.
72/// # Safety [crate::doc::backend_safety] for safety contract.
73pub unsafe trait TakeVecZnxSliceImpl<B: Backend> {
74 fn take_vec_znx_slice_impl(
75 scratch: &mut Scratch<B>,
76 len: usize,
77 n: usize,
78 cols: usize,
79 size: usize,
80 ) -> (Vec<VecZnx<&mut [u8]>>, &mut Scratch<B>);
81}
82
83/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
84/// * See TODO for reference code.
85/// * See TODO for corresponding public API.
86/// # Safety [crate::doc::backend_safety] for safety contract.
87pub unsafe trait TakeVecZnxBigImpl<B: Backend> {
88 fn take_vec_znx_big_impl(
89 scratch: &mut Scratch<B>,
90 n: usize,
91 cols: usize,
92 size: usize,
93 ) -> (VecZnxBig<&mut [u8], B>, &mut Scratch<B>);
94}
95
96/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
97/// * See TODO for reference code.
98/// * See TODO for corresponding public API.
99/// # Safety [crate::doc::backend_safety] for safety contract.
100pub unsafe trait TakeVecZnxDftImpl<B: Backend> {
101 fn take_vec_znx_dft_impl(
102 scratch: &mut Scratch<B>,
103 n: usize,
104 cols: usize,
105 size: usize,
106 ) -> (VecZnxDft<&mut [u8], B>, &mut Scratch<B>);
107}
108
109/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
110/// * See TODO for reference code.
111/// * See TODO for corresponding public API.
112/// # Safety [crate::doc::backend_safety] for safety contract.
113pub unsafe trait TakeVecZnxDftSliceImpl<B: Backend> {
114 fn take_vec_znx_dft_slice_impl(
115 scratch: &mut Scratch<B>,
116 len: usize,
117 n: usize,
118 cols: usize,
119 size: usize,
120 ) -> (Vec<VecZnxDft<&mut [u8], B>>, &mut Scratch<B>);
121}
122
123/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
124/// * See TODO for reference code.
125/// * See TODO for corresponding public API.
126/// # Safety [crate::doc::backend_safety] for safety contract.
127pub unsafe trait TakeVmpPMatImpl<B: Backend> {
128 fn take_vmp_pmat_impl(
129 scratch: &mut Scratch<B>,
130 n: usize,
131 rows: usize,
132 cols_in: usize,
133 cols_out: usize,
134 size: usize,
135 ) -> (VmpPMat<&mut [u8], B>, &mut Scratch<B>);
136}
137
138/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
139/// * See TODO for reference code.
140/// * See TODO for corresponding public API.
141/// # Safety [crate::doc::backend_safety] for safety contract.
142pub unsafe trait TakeMatZnxImpl<B: Backend> {
143 fn take_mat_znx_impl(
144 scratch: &mut Scratch<B>,
145 n: usize,
146 rows: usize,
147 cols_in: usize,
148 cols_out: usize,
149 size: usize,
150 ) -> (MatZnx<&mut [u8]>, &mut Scratch<B>);
151}
152
153/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
154/// * See TODO for reference code.
155/// * See TODO for corresponding public API.
156/// # Safety [crate::doc::backend_safety] for safety contract.
157pub trait TakeLikeImpl<'a, B: Backend, T> {
158 type Output;
159 fn take_like_impl(scratch: &'a mut Scratch<B>, template: &T) -> (Self::Output, &'a mut Scratch<B>);
160}
161
162impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VmpPMat<D, B>> for B
163where
164 B: TakeVmpPMatImpl<B>,
165 D: DataRef,
166{
167 type Output = VmpPMat<&'a mut [u8], B>;
168
169 fn take_like_impl(scratch: &'a mut Scratch<B>, template: &VmpPMat<D, B>) -> (Self::Output, &'a mut Scratch<B>) {
170 B::take_vmp_pmat_impl(
171 scratch,
172 template.n(),
173 template.rows(),
174 template.cols_in(),
175 template.cols_out(),
176 template.size(),
177 )
178 }
179}
180
181impl<'a, B: Backend, D> TakeLikeImpl<'a, B, MatZnx<D>> for B
182where
183 B: TakeMatZnxImpl<B>,
184 D: DataRef,
185{
186 type Output = MatZnx<&'a mut [u8]>;
187
188 fn take_like_impl(scratch: &'a mut Scratch<B>, template: &MatZnx<D>) -> (Self::Output, &'a mut Scratch<B>) {
189 B::take_mat_znx_impl(
190 scratch,
191 template.n(),
192 template.rows(),
193 template.cols_in(),
194 template.cols_out(),
195 template.size(),
196 )
197 }
198}
199
200impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VecZnxDft<D, B>> for B
201where
202 B: TakeVecZnxDftImpl<B>,
203 D: DataRef,
204{
205 type Output = VecZnxDft<&'a mut [u8], B>;
206
207 fn take_like_impl(scratch: &'a mut Scratch<B>, template: &VecZnxDft<D, B>) -> (Self::Output, &'a mut Scratch<B>) {
208 B::take_vec_znx_dft_impl(scratch, template.n(), template.cols(), template.size())
209 }
210}
211
212impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VecZnxBig<D, B>> for B
213where
214 B: TakeVecZnxBigImpl<B>,
215 D: DataRef,
216{
217 type Output = VecZnxBig<&'a mut [u8], B>;
218
219 fn take_like_impl(scratch: &'a mut Scratch<B>, template: &VecZnxBig<D, B>) -> (Self::Output, &'a mut Scratch<B>) {
220 B::take_vec_znx_big_impl(scratch, template.n(), template.cols(), template.size())
221 }
222}
223
224impl<'a, B: Backend, D> TakeLikeImpl<'a, B, SvpPPol<D, B>> for B
225where
226 B: TakeSvpPPolImpl<B>,
227 D: DataRef,
228{
229 type Output = SvpPPol<&'a mut [u8], B>;
230
231 fn take_like_impl(scratch: &'a mut Scratch<B>, template: &SvpPPol<D, B>) -> (Self::Output, &'a mut Scratch<B>) {
232 B::take_svp_ppol_impl(scratch, template.n(), template.cols())
233 }
234}
235
236impl<'a, B: Backend, D> TakeLikeImpl<'a, B, VecZnx<D>> for B
237where
238 B: TakeVecZnxImpl<B>,
239 D: DataRef,
240{
241 type Output = VecZnx<&'a mut [u8]>;
242
243 fn take_like_impl(scratch: &'a mut Scratch<B>, template: &VecZnx<D>) -> (Self::Output, &'a mut Scratch<B>) {
244 B::take_vec_znx_impl(scratch, template.n(), template.cols(), template.size())
245 }
246}
247
248impl<'a, B: Backend, D> TakeLikeImpl<'a, B, ScalarZnx<D>> for B
249where
250 B: TakeScalarZnxImpl<B>,
251 D: DataRef,
252{
253 type Output = ScalarZnx<&'a mut [u8]>;
254
255 fn take_like_impl(scratch: &'a mut Scratch<B>, template: &ScalarZnx<D>) -> (Self::Output, &'a mut Scratch<B>) {
256 B::take_scalar_znx_impl(scratch, template.n(), template.cols())
257 }
258}