1use super::*;
2
3macro_rules! impl_signal_binary_statistic_to_dispatch {
4 (
5 $trait:ident,
6 $buffer_method:ident,
7 $scratch_method:ident,
8 $method:ident,
9 $buffer_function:ident,
10 $scratch_function:ident,
11 $function:ident,
12 [$($source_ty:ty => ($destination_ty:ty, $direct_buffer:ident, $direct_scratch:ident, $direct:ident)),* $(,)?]
13 ) => {
14 pub trait $trait<Destination>: DataTypeLike
15 where
16 Destination: DataTypeLike,
17 {
18 fn $buffer_method(
19 stream_context: &StreamContext,
20 source: &SignalView<'_, Self>,
21 ) -> Result<usize>;
22
23 fn $scratch_method(
24 stream_context: &StreamContext,
25 source_1: &SignalView<'_, Self>,
26 source_2: &SignalView<'_, Self>,
27 destination: &mut SignalViewMut<'_, Destination>,
28 scratch: &mut ScratchBuffer,
29 ) -> Result<()>;
30
31 fn $method(
32 stream_context: &StreamContext,
33 source_1: &SignalView<'_, Self>,
34 source_2: &SignalView<'_, Self>,
35 destination: &mut SignalViewMut<'_, Destination>,
36 ) -> Result<()>;
37 }
38
39 $(
40 impl $trait<$destination_ty> for $source_ty {
41 fn $buffer_method(
42 stream_context: &StreamContext,
43 source: &SignalView<'_, Self>,
44 ) -> Result<usize> {
45 $direct_buffer(stream_context, source)
46 }
47
48 fn $scratch_method(
49 stream_context: &StreamContext,
50 source_1: &SignalView<'_, Self>,
51 source_2: &SignalView<'_, Self>,
52 destination: &mut SignalViewMut<'_, $destination_ty>,
53 scratch: &mut ScratchBuffer,
54 ) -> Result<()> {
55 $direct_scratch(stream_context, source_1, source_2, destination, scratch)
56 }
57
58 fn $method(
59 stream_context: &StreamContext,
60 source_1: &SignalView<'_, Self>,
61 source_2: &SignalView<'_, Self>,
62 destination: &mut SignalViewMut<'_, $destination_ty>,
63 ) -> Result<()> {
64 $direct(stream_context, source_1, source_2, destination)
65 }
66 }
67 )*
68
69 pub fn $buffer_function<Source, Destination>(
70 stream_context: &StreamContext,
71 source: &SignalView<'_, Source>,
72 ) -> Result<usize>
73 where
74 Source: $trait<Destination>,
75 Destination: DataTypeLike,
76 {
77 Source::$buffer_method(stream_context, source)
78 }
79
80 pub fn $scratch_function<Source, Destination>(
81 stream_context: &StreamContext,
82 source_1: &SignalView<'_, Source>,
83 source_2: &SignalView<'_, Source>,
84 destination: &mut SignalViewMut<'_, Destination>,
85 scratch: &mut ScratchBuffer,
86 ) -> Result<()>
87 where
88 Source: $trait<Destination>,
89 Destination: DataTypeLike,
90 {
91 Source::$scratch_method(stream_context, source_1, source_2, destination, scratch)
92 }
93
94 pub fn $function<Source, Destination>(
95 stream_context: &StreamContext,
96 source_1: &SignalView<'_, Source>,
97 source_2: &SignalView<'_, Source>,
98 destination: &mut SignalViewMut<'_, Destination>,
99 ) -> Result<()>
100 where
101 Source: $trait<Destination>,
102 Destination: DataTypeLike,
103 {
104 Source::$method(stream_context, source_1, source_2, destination)
105 }
106 };
107}
108
109macro_rules! impl_signal_scaled_binary_statistic_to_dispatch {
110 (
111 $trait:ident,
112 $buffer_method:ident,
113 $scratch_method:ident,
114 $method:ident,
115 $buffer_function:ident,
116 $scratch_function:ident,
117 $function:ident,
118 [$($source_ty:ty => ($destination_ty:ty, $direct_buffer:ident, $direct_scratch:ident, $direct:ident)),* $(,)?]
119 ) => {
120 pub trait $trait<Destination>: DataTypeLike
121 where
122 Destination: DataTypeLike,
123 {
124 fn $buffer_method(
125 stream_context: &StreamContext,
126 source: &SignalView<'_, Self>,
127 ) -> Result<usize>;
128
129 fn $scratch_method(
130 stream_context: &StreamContext,
131 source_1: &SignalView<'_, Self>,
132 source_2: &SignalView<'_, Self>,
133 destination: &mut SignalViewMut<'_, Destination>,
134 scale_factor: i32,
135 scratch: &mut ScratchBuffer,
136 ) -> Result<()>;
137
138 fn $method(
139 stream_context: &StreamContext,
140 source_1: &SignalView<'_, Self>,
141 source_2: &SignalView<'_, Self>,
142 destination: &mut SignalViewMut<'_, Destination>,
143 scale_factor: i32,
144 ) -> Result<()>;
145 }
146
147 $(
148 impl $trait<$destination_ty> for $source_ty {
149 fn $buffer_method(
150 stream_context: &StreamContext,
151 source: &SignalView<'_, Self>,
152 ) -> Result<usize> {
153 $direct_buffer(stream_context, source)
154 }
155
156 fn $scratch_method(
157 stream_context: &StreamContext,
158 source_1: &SignalView<'_, Self>,
159 source_2: &SignalView<'_, Self>,
160 destination: &mut SignalViewMut<'_, $destination_ty>,
161 scale_factor: i32,
162 scratch: &mut ScratchBuffer,
163 ) -> Result<()> {
164 $direct_scratch(
165 stream_context,
166 source_1,
167 source_2,
168 destination,
169 scale_factor,
170 scratch,
171 )
172 }
173
174 fn $method(
175 stream_context: &StreamContext,
176 source_1: &SignalView<'_, Self>,
177 source_2: &SignalView<'_, Self>,
178 destination: &mut SignalViewMut<'_, $destination_ty>,
179 scale_factor: i32,
180 ) -> Result<()> {
181 $direct(stream_context, source_1, source_2, destination, scale_factor)
182 }
183 }
184 )*
185
186 pub fn $buffer_function<Source, Destination>(
187 stream_context: &StreamContext,
188 source: &SignalView<'_, Source>,
189 ) -> Result<usize>
190 where
191 Source: $trait<Destination>,
192 Destination: DataTypeLike,
193 {
194 Source::$buffer_method(stream_context, source)
195 }
196
197 pub fn $scratch_function<Source, Destination>(
198 stream_context: &StreamContext,
199 source_1: &SignalView<'_, Source>,
200 source_2: &SignalView<'_, Source>,
201 destination: &mut SignalViewMut<'_, Destination>,
202 scale_factor: i32,
203 scratch: &mut ScratchBuffer,
204 ) -> Result<()>
205 where
206 Source: $trait<Destination>,
207 Destination: DataTypeLike,
208 {
209 Source::$scratch_method(
210 stream_context,
211 source_1,
212 source_2,
213 destination,
214 scale_factor,
215 scratch,
216 )
217 }
218
219 pub fn $function<Source, Destination>(
220 stream_context: &StreamContext,
221 source_1: &SignalView<'_, Source>,
222 source_2: &SignalView<'_, Source>,
223 destination: &mut SignalViewMut<'_, Destination>,
224 scale_factor: i32,
225 ) -> Result<()>
226 where
227 Source: $trait<Destination>,
228 Destination: DataTypeLike,
229 {
230 Source::$method(stream_context, source_1, source_2, destination, scale_factor)
231 }
232 };
233}
234
235impl_signal_binary_statistic_to_dispatch!(
236 NormDiffInfTo,
237 norm_diff_inf_buffer_size,
238 norm_diff_inf_to_device_with_scratch,
239 norm_diff_inf_to_device,
240 norm_diff_inf_buffer_size,
241 norm_diff_inf_to_device_with_scratch,
242 norm_diff_inf_to_device,
243 [
244 f32 => (f32, norm_diff_inf_f32_buffer_size, norm_diff_inf_f32_to_device_with_scratch, norm_diff_inf_f32_to_device),
245 f64 => (f64, norm_diff_inf_f64_buffer_size, norm_diff_inf_f64_to_device_with_scratch, norm_diff_inf_f64_to_device),
246 Complex32 => (f32, norm_diff_inf_f32_complex_to_f32_buffer_size, norm_diff_inf_f32_complex_to_f32_to_device_with_scratch, norm_diff_inf_f32_complex_to_f32_to_device),
247 Complex64 => (f64, norm_diff_inf_f64_complex_to_f64_buffer_size, norm_diff_inf_f64_complex_to_f64_to_device_with_scratch, norm_diff_inf_f64_complex_to_f64_to_device),
248 i16 => (f32, norm_diff_inf_i16_to_f32_buffer_size, norm_diff_inf_i16_to_f32_to_device_with_scratch, norm_diff_inf_i16_to_f32_to_device)
249 ]
250);
251
252impl_signal_binary_statistic_to_dispatch!(
253 NormDiffL1To,
254 norm_diff_l1_buffer_size,
255 norm_diff_l1_to_device_with_scratch,
256 norm_diff_l1_to_device,
257 norm_diff_l1_buffer_size,
258 norm_diff_l1_to_device_with_scratch,
259 norm_diff_l1_to_device,
260 [
261 f32 => (f32, norm_diff_l1_f32_buffer_size, norm_diff_l1_f32_to_device_with_scratch, norm_diff_l1_f32_to_device),
262 f64 => (f64, norm_diff_l1_f64_buffer_size, norm_diff_l1_f64_to_device_with_scratch, norm_diff_l1_f64_to_device),
263 Complex32 => (f64, norm_diff_l1_f32_complex_to_f64_buffer_size, norm_diff_l1_f32_complex_to_f64_to_device_with_scratch, norm_diff_l1_f32_complex_to_f64_to_device),
264 Complex64 => (f64, norm_diff_l1_f64_complex_to_f64_buffer_size, norm_diff_l1_f64_complex_to_f64_to_device_with_scratch, norm_diff_l1_f64_complex_to_f64_to_device),
265 i16 => (f32, norm_diff_l1_i16_to_f32_buffer_size, norm_diff_l1_i16_to_f32_to_device_with_scratch, norm_diff_l1_i16_to_f32_to_device)
266 ]
267);
268
269impl_signal_binary_statistic_to_dispatch!(
270 NormDiffL2To,
271 norm_diff_l2_buffer_size,
272 norm_diff_l2_to_device_with_scratch,
273 norm_diff_l2_to_device,
274 norm_diff_l2_buffer_size,
275 norm_diff_l2_to_device_with_scratch,
276 norm_diff_l2_to_device,
277 [
278 f32 => (f32, norm_diff_l2_f32_buffer_size, norm_diff_l2_f32_to_device_with_scratch, norm_diff_l2_f32_to_device),
279 f64 => (f64, norm_diff_l2_f64_buffer_size, norm_diff_l2_f64_to_device_with_scratch, norm_diff_l2_f64_to_device),
280 Complex32 => (f64, norm_diff_l2_f32_complex_to_f64_buffer_size, norm_diff_l2_f32_complex_to_f64_to_device_with_scratch, norm_diff_l2_f32_complex_to_f64_to_device),
281 Complex64 => (f64, norm_diff_l2_f64_complex_to_f64_buffer_size, norm_diff_l2_f64_complex_to_f64_to_device_with_scratch, norm_diff_l2_f64_complex_to_f64_to_device),
282 i16 => (f32, norm_diff_l2_i16_to_f32_buffer_size, norm_diff_l2_i16_to_f32_to_device_with_scratch, norm_diff_l2_i16_to_f32_to_device)
283 ]
284);
285
286impl_signal_scaled_binary_statistic_to_dispatch!(
287 NormDiffInfScaledTo,
288 norm_diff_inf_scaled_buffer_size,
289 norm_diff_inf_scaled_to_device_with_scratch,
290 norm_diff_inf_scaled_to_device,
291 norm_diff_inf_scaled_buffer_size,
292 norm_diff_inf_scaled_to_device_with_scratch,
293 norm_diff_inf_scaled_to_device,
294 [
295 i16 => (i32, norm_diff_inf_i16_to_i32_scaled_buffer_size, norm_diff_inf_i16_to_i32_scaled_to_device_with_scratch, norm_diff_inf_i16_to_i32_scaled_to_device)
296 ]
297);
298
299impl_signal_scaled_binary_statistic_to_dispatch!(
300 NormDiffL1ScaledTo,
301 norm_diff_l1_scaled_buffer_size,
302 norm_diff_l1_scaled_to_device_with_scratch,
303 norm_diff_l1_scaled_to_device,
304 norm_diff_l1_scaled_buffer_size,
305 norm_diff_l1_scaled_to_device_with_scratch,
306 norm_diff_l1_scaled_to_device,
307 [
308 i16 => (i32, norm_diff_l1_i16_to_i32_scaled_buffer_size, norm_diff_l1_i16_to_i32_scaled_to_device_with_scratch, norm_diff_l1_i16_to_i32_scaled_to_device),
309 i16 => (i64, norm_diff_l1_i16_to_i64_scaled_buffer_size, norm_diff_l1_i16_to_i64_scaled_to_device_with_scratch, norm_diff_l1_i16_to_i64_scaled_to_device)
310 ]
311);
312
313impl_signal_scaled_binary_statistic_to_dispatch!(
314 NormDiffL2ScaledTo,
315 norm_diff_l2_scaled_buffer_size,
316 norm_diff_l2_scaled_to_device_with_scratch,
317 norm_diff_l2_scaled_to_device,
318 norm_diff_l2_scaled_buffer_size,
319 norm_diff_l2_scaled_to_device_with_scratch,
320 norm_diff_l2_scaled_to_device,
321 [
322 i16 => (i32, norm_diff_l2_i16_to_i32_scaled_buffer_size, norm_diff_l2_i16_to_i32_scaled_to_device_with_scratch, norm_diff_l2_i16_to_i32_scaled_to_device)
323 ]
324);
325
326impl_signal_scaled_binary_statistic_to_dispatch!(
327 NormDiffL2SquaredScaledTo,
328 norm_diff_l2_squared_scaled_buffer_size,
329 norm_diff_l2_squared_scaled_to_device_with_scratch,
330 norm_diff_l2_squared_scaled_to_device,
331 norm_diff_l2_squared_scaled_buffer_size,
332 norm_diff_l2_squared_scaled_to_device_with_scratch,
333 norm_diff_l2_squared_scaled_to_device,
334 [
335 i16 => (i64, norm_diff_l2_squared_i16_to_i64_scaled_buffer_size, norm_diff_l2_squared_i16_to_i64_scaled_to_device_with_scratch, norm_diff_l2_squared_i16_to_i64_scaled_to_device)
336 ]
337);
338
339impl_signal_binary_statistic_to_dispatch!(
340 DotProductTo,
341 dot_product_buffer_size,
342 dot_product_to_device_with_scratch,
343 dot_product_to_device,
344 dot_product_buffer_size,
345 dot_product_to_device_with_scratch,
346 dot_product_to_device,
347 [
348 f32 => (f32, dot_product_f32_buffer_size, dot_product_f32_to_device_with_scratch, dot_product_f32_to_device),
349 f32 => (f64, dot_product_f32_to_f64_buffer_size, dot_product_f32_to_f64_to_device_with_scratch, dot_product_f32_to_f64_to_device),
350 f64 => (f64, dot_product_f64_buffer_size, dot_product_f64_to_device_with_scratch, dot_product_f64_to_device),
351 Complex32 => (Complex32, dot_product_f32_complex_buffer_size, dot_product_f32_complex_to_device_with_scratch, dot_product_f32_complex_to_device),
352 Complex32 => (Complex64, dot_product_f32_complex_to_f64_complex_buffer_size, dot_product_f32_complex_to_f64_complex_to_device_with_scratch, dot_product_f32_complex_to_f64_complex_to_device),
353 Complex64 => (Complex64, dot_product_f64_complex_buffer_size, dot_product_f64_complex_to_device_with_scratch, dot_product_f64_complex_to_device),
354 i16 => (i64, dot_product_i16_to_i64_buffer_size, dot_product_i16_to_i64_to_device_with_scratch, dot_product_i16_to_i64_to_device),
355 i16 => (f32, dot_product_i16_to_f32_buffer_size, dot_product_i16_to_f32_to_device_with_scratch, dot_product_i16_to_f32_to_device),
356 ComplexI16 => (ComplexI64, dot_product_i16_complex_to_i64_complex_buffer_size, dot_product_i16_complex_to_i64_complex_to_device_with_scratch, dot_product_i16_complex_to_i64_complex_to_device),
357 ComplexI16 => (Complex32, dot_product_i16_complex_to_f32_complex_buffer_size, dot_product_i16_complex_to_f32_complex_to_device_with_scratch, dot_product_i16_complex_to_f32_complex_to_device)
358 ]
359);
360
361impl_signal_scaled_binary_statistic_to_dispatch!(
362 DotProductScaledTo,
363 dot_product_scaled_buffer_size,
364 dot_product_scaled_to_device_with_scratch,
365 dot_product_scaled_to_device,
366 dot_product_scaled_buffer_size,
367 dot_product_scaled_to_device_with_scratch,
368 dot_product_scaled_to_device,
369 [
370 i16 => (i16, dot_product_i16_scaled_buffer_size, dot_product_i16_scaled_to_device_with_scratch, dot_product_i16_scaled_to_device),
371 i16 => (i32, dot_product_i16_to_i32_scaled_buffer_size, dot_product_i16_to_i32_scaled_to_device_with_scratch, dot_product_i16_to_i32_scaled_to_device),
372 i32 => (i32, dot_product_i32_scaled_buffer_size, dot_product_i32_scaled_to_device_with_scratch, dot_product_i32_scaled_to_device),
373 ComplexI16 => (ComplexI16, dot_product_i16_complex_scaled_buffer_size, dot_product_i16_complex_scaled_to_device_with_scratch, dot_product_i16_complex_scaled_to_device),
374 ComplexI16 => (ComplexI32, dot_product_i16_complex_to_i32_complex_scaled_buffer_size, dot_product_i16_complex_to_i32_complex_scaled_to_device_with_scratch, dot_product_i16_complex_to_i32_complex_scaled_to_device),
375 ComplexI32 => (ComplexI32, dot_product_i32_complex_scaled_buffer_size, dot_product_i32_complex_scaled_to_device_with_scratch, dot_product_i32_complex_scaled_to_device)
376 ]
377);
378
379impl_signal_statistic_to_dispatch!(
380 MaxTo,
381 max_buffer_size,
382 max_to_device_with_scratch,
383 max_to_device,
384 max_buffer_size,
385 max_to_device_with_scratch,
386 max_to_device,
387 [
388 i16 => (i16, max_i16_buffer_size, max_i16_to_device_with_scratch, max_i16_to_device),
389 i32 => (i32, max_i32_buffer_size, max_i32_to_device_with_scratch, max_i32_to_device),
390 f32 => (f32, max_f32_buffer_size, max_f32_to_device_with_scratch, max_f32_to_device),
391 f64 => (f64, max_f64_buffer_size, max_f64_to_device_with_scratch, max_f64_to_device)
392 ]
393);
394
395impl_signal_statistic_to_dispatch!(
396 MinTo,
397 min_buffer_size,
398 min_to_device_with_scratch,
399 min_to_device,
400 min_buffer_size,
401 min_to_device_with_scratch,
402 min_to_device,
403 [
404 i16 => (i16, min_i16_buffer_size, min_i16_to_device_with_scratch, min_i16_to_device),
405 i32 => (i32, min_i32_buffer_size, min_i32_to_device_with_scratch, min_i32_to_device),
406 f32 => (f32, min_f32_buffer_size, min_f32_to_device_with_scratch, min_f32_to_device),
407 f64 => (f64, min_f64_buffer_size, min_f64_to_device_with_scratch, min_f64_to_device)
408 ]
409);
410
411impl_signal_statistic_to_dispatch!(
412 MaxAbsoluteTo,
413 max_absolute_buffer_size,
414 max_absolute_to_device_with_scratch,
415 max_absolute_to_device,
416 max_absolute_buffer_size,
417 max_absolute_to_device_with_scratch,
418 max_absolute_to_device,
419 [
420 i16 => (i16, max_absolute_i16_buffer_size, max_absolute_i16_to_device_with_scratch, max_absolute_i16_to_device),
421 i32 => (i32, max_absolute_i32_buffer_size, max_absolute_i32_to_device_with_scratch, max_absolute_i32_to_device)
422 ]
423);
424
425impl_signal_statistic_to_dispatch!(
426 MinAbsoluteTo,
427 min_absolute_buffer_size,
428 min_absolute_to_device_with_scratch,
429 min_absolute_to_device,
430 min_absolute_buffer_size,
431 min_absolute_to_device_with_scratch,
432 min_absolute_to_device,
433 [
434 i16 => (i16, min_absolute_i16_buffer_size, min_absolute_i16_to_device_with_scratch, min_absolute_i16_to_device),
435 i32 => (i32, min_absolute_i32_buffer_size, min_absolute_i32_to_device_with_scratch, min_absolute_i32_to_device)
436 ]
437);