Skip to main content

singe_npp/signal/
statistics_binary_dispatch.rs

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