Skip to main content

singe_npp/signal/
statistics_scalar_dispatch.rs

1use super::*;
2
3macro_rules! impl_signal_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: &SignalView<'_, Self>,
26                destination: &mut SignalViewMut<'_, Destination>,
27                scratch: &mut ScratchBuffer,
28            ) -> Result<()>;
29
30            fn $method(
31                stream_context: &StreamContext,
32                source: &SignalView<'_, Self>,
33                destination: &mut SignalViewMut<'_, Destination>,
34            ) -> Result<()>;
35        }
36
37        $(
38            impl $trait<$destination_ty> for $source_ty {
39                fn $buffer_method(
40                    stream_context: &StreamContext,
41                    source: &SignalView<'_, Self>,
42                ) -> Result<usize> {
43                    $direct_buffer(stream_context, source)
44                }
45
46                fn $scratch_method(
47                    stream_context: &StreamContext,
48                    source: &SignalView<'_, Self>,
49                    destination: &mut SignalViewMut<'_, $destination_ty>,
50                    scratch: &mut ScratchBuffer,
51                ) -> Result<()> {
52                    $direct_scratch(stream_context, source, destination, scratch)
53                }
54
55                fn $method(
56                    stream_context: &StreamContext,
57                    source: &SignalView<'_, Self>,
58                    destination: &mut SignalViewMut<'_, $destination_ty>,
59                ) -> Result<()> {
60                    $direct(stream_context, source, destination)
61                }
62            }
63        )*
64
65        pub fn $buffer_function<Source, Destination>(
66            stream_context: &StreamContext,
67            source: &SignalView<'_, Source>,
68        ) -> Result<usize>
69        where
70            Source: $trait<Destination>,
71            Destination: DataTypeLike,
72        {
73            Source::$buffer_method(stream_context, source)
74        }
75
76        pub fn $scratch_function<Source, Destination>(
77            stream_context: &StreamContext,
78            source: &SignalView<'_, Source>,
79            destination: &mut SignalViewMut<'_, Destination>,
80            scratch: &mut ScratchBuffer,
81        ) -> Result<()>
82        where
83            Source: $trait<Destination>,
84            Destination: DataTypeLike,
85        {
86            Source::$scratch_method(stream_context, source, destination, scratch)
87        }
88
89        pub fn $function<Source, Destination>(
90            stream_context: &StreamContext,
91            source: &SignalView<'_, Source>,
92            destination: &mut SignalViewMut<'_, Destination>,
93        ) -> Result<()>
94        where
95            Source: $trait<Destination>,
96            Destination: DataTypeLike,
97        {
98            Source::$method(stream_context, source, destination)
99        }
100    };
101}
102
103macro_rules! impl_signal_scaled_statistic_to_dispatch {
104    (
105        $trait:ident,
106        $buffer_method:ident,
107        $scratch_method:ident,
108        $method:ident,
109        $buffer_function:ident,
110        $scratch_function:ident,
111        $function:ident,
112        [$($source_ty:ty => ($destination_ty:ty, $direct_buffer:ident, $direct_scratch:ident, $direct:ident)),* $(,)?]
113    ) => {
114        pub trait $trait<Destination>: DataTypeLike
115        where
116            Destination: DataTypeLike,
117        {
118            fn $buffer_method(
119                stream_context: &StreamContext,
120                source: &SignalView<'_, Self>,
121            ) -> Result<usize>;
122
123            fn $scratch_method(
124                stream_context: &StreamContext,
125                source: &SignalView<'_, Self>,
126                destination: &mut SignalViewMut<'_, Destination>,
127                scale_factor: i32,
128                scratch: &mut ScratchBuffer,
129            ) -> Result<()>;
130
131            fn $method(
132                stream_context: &StreamContext,
133                source: &SignalView<'_, Self>,
134                destination: &mut SignalViewMut<'_, Destination>,
135                scale_factor: i32,
136            ) -> Result<()>;
137        }
138
139        $(
140            impl $trait<$destination_ty> for $source_ty {
141                fn $buffer_method(
142                    stream_context: &StreamContext,
143                    source: &SignalView<'_, Self>,
144                ) -> Result<usize> {
145                    $direct_buffer(stream_context, source)
146                }
147
148                fn $scratch_method(
149                    stream_context: &StreamContext,
150                    source: &SignalView<'_, Self>,
151                    destination: &mut SignalViewMut<'_, $destination_ty>,
152                    scale_factor: i32,
153                    scratch: &mut ScratchBuffer,
154                ) -> Result<()> {
155                    $direct_scratch(stream_context, source, destination, scale_factor, scratch)
156                }
157
158                fn $method(
159                    stream_context: &StreamContext,
160                    source: &SignalView<'_, Self>,
161                    destination: &mut SignalViewMut<'_, $destination_ty>,
162                    scale_factor: i32,
163                ) -> Result<()> {
164                    $direct(stream_context, source, destination, scale_factor)
165                }
166            }
167        )*
168
169        pub fn $buffer_function<Source, Destination>(
170            stream_context: &StreamContext,
171            source: &SignalView<'_, Source>,
172        ) -> Result<usize>
173        where
174            Source: $trait<Destination>,
175            Destination: DataTypeLike,
176        {
177            Source::$buffer_method(stream_context, source)
178        }
179
180        pub fn $scratch_function<Source, Destination>(
181            stream_context: &StreamContext,
182            source: &SignalView<'_, Source>,
183            destination: &mut SignalViewMut<'_, Destination>,
184            scale_factor: i32,
185            scratch: &mut ScratchBuffer,
186        ) -> Result<()>
187        where
188            Source: $trait<Destination>,
189            Destination: DataTypeLike,
190        {
191            Source::$scratch_method(stream_context, source, destination, scale_factor, scratch)
192        }
193
194        pub fn $function<Source, Destination>(
195            stream_context: &StreamContext,
196            source: &SignalView<'_, Source>,
197            destination: &mut SignalViewMut<'_, Destination>,
198            scale_factor: i32,
199        ) -> Result<()>
200        where
201            Source: $trait<Destination>,
202            Destination: DataTypeLike,
203        {
204            Source::$method(stream_context, source, destination, scale_factor)
205        }
206    };
207}
208
209impl_signal_statistic_to_dispatch!(
210    SumTo,
211    sum_buffer_size,
212    sum_to_device_with_scratch,
213    sum_to_device,
214    sum_buffer_size,
215    sum_to_device_with_scratch,
216    sum_to_device,
217    [
218        f32 => (f32, sum_f32_buffer_size, sum_f32_to_device_with_scratch, sum_f32_to_device),
219        Complex32 => (Complex32, sum_f32_complex_buffer_size, sum_f32_complex_to_device_with_scratch, sum_f32_complex_to_device),
220        f64 => (f64, sum_f64_buffer_size, sum_f64_to_device_with_scratch, sum_f64_to_device),
221        Complex64 => (Complex64, sum_f64_complex_buffer_size, sum_f64_complex_to_device_with_scratch, sum_f64_complex_to_device)
222    ]
223);
224
225impl_signal_scaled_statistic_to_dispatch!(
226    SumScaledTo,
227    sum_scaled_buffer_size,
228    sum_scaled_to_device_with_scratch,
229    sum_scaled_to_device,
230    sum_scaled_buffer_size,
231    sum_scaled_to_device_with_scratch,
232    sum_scaled_to_device,
233    [
234        i16 => (i16, sum_i16_scaled_buffer_size, sum_i16_scaled_to_device_with_scratch, sum_i16_scaled_to_device),
235        i16 => (i32, sum_i16_to_i32_scaled_buffer_size, sum_i16_to_i32_scaled_to_device_with_scratch, sum_i16_to_i32_scaled_to_device),
236        i32 => (i32, sum_i32_scaled_buffer_size, sum_i32_scaled_to_device_with_scratch, sum_i32_scaled_to_device),
237        ComplexI16 => (ComplexI16, sum_i16_complex_scaled_buffer_size, sum_i16_complex_scaled_to_device_with_scratch, sum_i16_complex_scaled_to_device),
238        ComplexI16 => (ComplexI32, sum_i16_complex_to_i32_complex_scaled_buffer_size, sum_i16_complex_to_i32_complex_scaled_to_device_with_scratch, sum_i16_complex_to_i32_complex_scaled_to_device)
239    ]
240);
241
242impl_signal_statistic_to_dispatch!(
243    SumNaturalLogarithmTo,
244    sum_natural_logarithm_buffer_size,
245    sum_natural_logarithm_to_device_with_scratch,
246    sum_natural_logarithm_to_device,
247    sum_natural_logarithm_buffer_size,
248    sum_natural_logarithm_to_device_with_scratch,
249    sum_natural_logarithm_to_device,
250    [
251        f32 => (f32, sum_natural_logarithm_f32_buffer_size, sum_natural_logarithm_f32_to_device_with_scratch, sum_natural_logarithm_f32_to_device),
252        f32 => (f64, sum_natural_logarithm_f32_to_f64_buffer_size, sum_natural_logarithm_f32_to_f64_to_device_with_scratch, sum_natural_logarithm_f32_to_f64_to_device),
253        f64 => (f64, sum_natural_logarithm_f64_buffer_size, sum_natural_logarithm_f64_to_device_with_scratch, sum_natural_logarithm_f64_to_device),
254        i16 => (f32, sum_natural_logarithm_i16_to_f32_buffer_size, sum_natural_logarithm_i16_to_f32_to_device_with_scratch, sum_natural_logarithm_i16_to_f32_to_device)
255    ]
256);
257
258impl_signal_statistic_to_dispatch!(
259    MeanTo,
260    mean_buffer_size,
261    mean_to_device_with_scratch,
262    mean_to_device,
263    mean_buffer_size,
264    mean_to_device_with_scratch,
265    mean_to_device,
266    [
267        f32 => (f32, mean_f32_buffer_size, mean_f32_to_device_with_scratch, mean_f32_to_device),
268        Complex32 => (Complex32, mean_f32_complex_buffer_size, mean_f32_complex_to_device_with_scratch, mean_f32_complex_to_device),
269        f64 => (f64, mean_f64_buffer_size, mean_f64_to_device_with_scratch, mean_f64_to_device),
270        Complex64 => (Complex64, mean_f64_complex_buffer_size, mean_f64_complex_to_device_with_scratch, mean_f64_complex_to_device)
271    ]
272);
273
274impl_signal_scaled_statistic_to_dispatch!(
275    MeanScaledTo,
276    mean_scaled_buffer_size,
277    mean_scaled_to_device_with_scratch,
278    mean_scaled_to_device,
279    mean_scaled_buffer_size,
280    mean_scaled_to_device_with_scratch,
281    mean_scaled_to_device,
282    [
283        i16 => (i16, mean_i16_scaled_buffer_size, mean_i16_scaled_to_device_with_scratch, mean_i16_scaled_to_device),
284        i32 => (i32, mean_i32_scaled_buffer_size, mean_i32_scaled_to_device_with_scratch, mean_i32_scaled_to_device),
285        ComplexI16 => (ComplexI16, mean_i16_complex_scaled_buffer_size, mean_i16_complex_scaled_to_device_with_scratch, mean_i16_complex_scaled_to_device)
286    ]
287);
288
289impl_signal_statistic_to_dispatch!(
290    StandardDeviationTo,
291    standard_deviation_buffer_size,
292    standard_deviation_to_device_with_scratch,
293    standard_deviation_to_device,
294    standard_deviation_buffer_size,
295    standard_deviation_to_device_with_scratch,
296    standard_deviation_to_device,
297    [
298        f32 => (f32, standard_deviation_f32_buffer_size, standard_deviation_f32_to_device_with_scratch, standard_deviation_f32_to_device),
299        f64 => (f64, standard_deviation_f64_buffer_size, standard_deviation_f64_to_device_with_scratch, standard_deviation_f64_to_device)
300    ]
301);
302
303impl_signal_scaled_statistic_to_dispatch!(
304    StandardDeviationScaledTo,
305    standard_deviation_scaled_buffer_size,
306    standard_deviation_scaled_to_device_with_scratch,
307    standard_deviation_scaled_to_device,
308    standard_deviation_scaled_buffer_size,
309    standard_deviation_scaled_to_device_with_scratch,
310    standard_deviation_scaled_to_device,
311    [
312        i16 => (i16, standard_deviation_i16_scaled_buffer_size, standard_deviation_i16_scaled_to_device_with_scratch, standard_deviation_i16_scaled_to_device),
313        i16 => (i32, standard_deviation_i16_to_i32_scaled_buffer_size, standard_deviation_i16_to_i32_scaled_to_device_with_scratch, standard_deviation_i16_to_i32_scaled_to_device)
314    ]
315);
316
317impl_signal_statistic_to_dispatch!(
318    NormInfTo,
319    norm_inf_buffer_size,
320    norm_inf_to_device_with_scratch,
321    norm_inf_to_device,
322    norm_inf_buffer_size,
323    norm_inf_to_device_with_scratch,
324    norm_inf_to_device,
325    [
326        f32 => (f32, norm_inf_f32_buffer_size, norm_inf_f32_to_device_with_scratch, norm_inf_f32_to_device),
327        f64 => (f64, norm_inf_f64_buffer_size, norm_inf_f64_to_device_with_scratch, norm_inf_f64_to_device),
328        Complex32 => (f32, norm_inf_f32_complex_to_f32_buffer_size, norm_inf_f32_complex_to_f32_to_device_with_scratch, norm_inf_f32_complex_to_f32_to_device),
329        Complex64 => (f64, norm_inf_f64_complex_to_f64_buffer_size, norm_inf_f64_complex_to_f64_to_device_with_scratch, norm_inf_f64_complex_to_f64_to_device),
330        i16 => (f32, norm_inf_i16_to_f32_buffer_size, norm_inf_i16_to_f32_to_device_with_scratch, norm_inf_i16_to_f32_to_device)
331    ]
332);
333
334impl_signal_scaled_statistic_to_dispatch!(
335    NormInfScaledTo,
336    norm_inf_scaled_buffer_size,
337    norm_inf_scaled_to_device_with_scratch,
338    norm_inf_scaled_to_device,
339    norm_inf_scaled_buffer_size,
340    norm_inf_scaled_to_device_with_scratch,
341    norm_inf_scaled_to_device,
342    [
343        i16 => (i32, norm_inf_i16_to_i32_scaled_buffer_size, norm_inf_i16_to_i32_scaled_to_device_with_scratch, norm_inf_i16_to_i32_scaled_to_device)
344    ]
345);
346
347impl_signal_statistic_to_dispatch!(
348    NormL1To,
349    norm_l1_buffer_size,
350    norm_l1_to_device_with_scratch,
351    norm_l1_to_device,
352    norm_l1_buffer_size,
353    norm_l1_to_device_with_scratch,
354    norm_l1_to_device,
355    [
356        f32 => (f32, norm_l1_f32_buffer_size, norm_l1_f32_to_device_with_scratch, norm_l1_f32_to_device),
357        f64 => (f64, norm_l1_f64_buffer_size, norm_l1_f64_to_device_with_scratch, norm_l1_f64_to_device),
358        Complex32 => (f64, norm_l1_f32_complex_to_f64_buffer_size, norm_l1_f32_complex_to_f64_to_device_with_scratch, norm_l1_f32_complex_to_f64_to_device),
359        Complex64 => (f64, norm_l1_f64_complex_to_f64_buffer_size, norm_l1_f64_complex_to_f64_to_device_with_scratch, norm_l1_f64_complex_to_f64_to_device),
360        i16 => (f32, norm_l1_i16_to_f32_buffer_size, norm_l1_i16_to_f32_to_device_with_scratch, norm_l1_i16_to_f32_to_device)
361    ]
362);
363
364impl_signal_scaled_statistic_to_dispatch!(
365    NormL1ScaledTo,
366    norm_l1_scaled_buffer_size,
367    norm_l1_scaled_to_device_with_scratch,
368    norm_l1_scaled_to_device,
369    norm_l1_scaled_buffer_size,
370    norm_l1_scaled_to_device_with_scratch,
371    norm_l1_scaled_to_device,
372    [
373        i16 => (i32, norm_l1_i16_to_i32_scaled_buffer_size, norm_l1_i16_to_i32_scaled_to_device_with_scratch, norm_l1_i16_to_i32_scaled_to_device),
374        i16 => (i64, norm_l1_i16_to_i64_scaled_buffer_size, norm_l1_i16_to_i64_scaled_to_device_with_scratch, norm_l1_i16_to_i64_scaled_to_device)
375    ]
376);
377
378impl_signal_statistic_to_dispatch!(
379    NormL2To,
380    norm_l2_buffer_size,
381    norm_l2_to_device_with_scratch,
382    norm_l2_to_device,
383    norm_l2_buffer_size,
384    norm_l2_to_device_with_scratch,
385    norm_l2_to_device,
386    [
387        f32 => (f32, norm_l2_f32_buffer_size, norm_l2_f32_to_device_with_scratch, norm_l2_f32_to_device),
388        f64 => (f64, norm_l2_f64_buffer_size, norm_l2_f64_to_device_with_scratch, norm_l2_f64_to_device),
389        Complex32 => (f64, norm_l2_f32_complex_to_f64_buffer_size, norm_l2_f32_complex_to_f64_to_device_with_scratch, norm_l2_f32_complex_to_f64_to_device),
390        Complex64 => (f64, norm_l2_f64_complex_to_f64_buffer_size, norm_l2_f64_complex_to_f64_to_device_with_scratch, norm_l2_f64_complex_to_f64_to_device),
391        i16 => (f32, norm_l2_i16_to_f32_buffer_size, norm_l2_i16_to_f32_to_device_with_scratch, norm_l2_i16_to_f32_to_device)
392    ]
393);
394
395impl_signal_scaled_statistic_to_dispatch!(
396    NormL2ScaledTo,
397    norm_l2_scaled_buffer_size,
398    norm_l2_scaled_to_device_with_scratch,
399    norm_l2_scaled_to_device,
400    norm_l2_scaled_buffer_size,
401    norm_l2_scaled_to_device_with_scratch,
402    norm_l2_scaled_to_device,
403    [
404        i16 => (i32, norm_l2_i16_to_i32_scaled_buffer_size, norm_l2_i16_to_i32_scaled_to_device_with_scratch, norm_l2_i16_to_i32_scaled_to_device)
405    ]
406);
407
408impl_signal_scaled_statistic_to_dispatch!(
409    NormL2SquaredScaledTo,
410    norm_l2_squared_scaled_buffer_size,
411    norm_l2_squared_scaled_to_device_with_scratch,
412    norm_l2_squared_scaled_to_device,
413    norm_l2_squared_scaled_buffer_size,
414    norm_l2_squared_scaled_to_device_with_scratch,
415    norm_l2_squared_scaled_to_device,
416    [
417        i16 => (i64, norm_l2_squared_i16_to_i64_scaled_buffer_size, norm_l2_squared_i16_to_i64_scaled_to_device_with_scratch, norm_l2_squared_i16_to_i64_scaled_to_device)
418    ]
419);