Skip to main content

singe_npp/signal/
statistics_dispatch.rs

1use singe_cuda::types::{Complex32, Complex64};
2
3use crate::{
4    context::StreamContext,
5    error::Result,
6    signal::{
7        statistics::*,
8        view::{SignalView, SignalViewMut},
9    },
10    types::{ComplexI16, ComplexI32, ComplexI64, DataTypeLike, ZeroCrossingType},
11    workspace::ScratchBuffer,
12};
13
14#[path = "statistics_scalar_dispatch.rs"]
15#[macro_use]
16mod scalar_dispatch;
17pub use scalar_dispatch::*;
18
19#[path = "statistics_binary_dispatch.rs"]
20mod binary_dispatch;
21pub use binary_dispatch::*;
22
23macro_rules! impl_signal_indexed_statistic_dispatch {
24    (
25        $trait:ident,
26        $buffer_method:ident,
27        $scratch_method:ident,
28        $method:ident,
29        $buffer_function:ident,
30        $scratch_function:ident,
31        $function:ident,
32        [$($ty:ty => ($direct_buffer:ident, $direct_scratch:ident, $direct:ident)),* $(,)?]
33    ) => {
34        pub trait $trait: DataTypeLike {
35            fn $buffer_method(
36                stream_context: &StreamContext,
37                source: &SignalView<'_, Self>,
38            ) -> Result<usize>;
39
40            fn $scratch_method(
41                stream_context: &StreamContext,
42                source: &SignalView<'_, Self>,
43                value: &mut SignalViewMut<'_, Self>,
44                index: &mut SignalViewMut<'_, i32>,
45                scratch: &mut ScratchBuffer,
46            ) -> Result<()>;
47
48            fn $method(
49                stream_context: &StreamContext,
50                source: &SignalView<'_, Self>,
51                value: &mut SignalViewMut<'_, Self>,
52                index: &mut SignalViewMut<'_, i32>,
53            ) -> Result<()>;
54        }
55
56        $(
57            impl $trait for $ty {
58                fn $buffer_method(
59                    stream_context: &StreamContext,
60                    source: &SignalView<'_, Self>,
61                ) -> Result<usize> {
62                    $direct_buffer(stream_context, source)
63                }
64
65                fn $scratch_method(
66                    stream_context: &StreamContext,
67                    source: &SignalView<'_, Self>,
68                    value: &mut SignalViewMut<'_, Self>,
69                    index: &mut SignalViewMut<'_, i32>,
70                    scratch: &mut ScratchBuffer,
71                ) -> Result<()> {
72                    $direct_scratch(stream_context, source, value, index, scratch)
73                }
74
75                fn $method(
76                    stream_context: &StreamContext,
77                    source: &SignalView<'_, Self>,
78                    value: &mut SignalViewMut<'_, Self>,
79                    index: &mut SignalViewMut<'_, i32>,
80                ) -> Result<()> {
81                    $direct(stream_context, source, value, index)
82                }
83            }
84        )*
85
86        pub fn $buffer_function<T: $trait>(
87            stream_context: &StreamContext,
88            source: &SignalView<'_, T>,
89        ) -> Result<usize> {
90            T::$buffer_method(stream_context, source)
91        }
92
93        pub fn $scratch_function<T: $trait>(
94            stream_context: &StreamContext,
95            source: &SignalView<'_, T>,
96            value: &mut SignalViewMut<'_, T>,
97            index: &mut SignalViewMut<'_, i32>,
98            scratch: &mut ScratchBuffer,
99        ) -> Result<()> {
100            T::$scratch_method(stream_context, source, value, index, scratch)
101        }
102
103        pub fn $function<T: $trait>(
104            stream_context: &StreamContext,
105            source: &SignalView<'_, T>,
106            value: &mut SignalViewMut<'_, T>,
107            index: &mut SignalViewMut<'_, i32>,
108        ) -> Result<()> {
109            T::$method(stream_context, source, value, index)
110        }
111    };
112}
113
114impl_signal_indexed_statistic_dispatch!(
115    MaxIndex,
116    max_index_buffer_size,
117    max_index_to_device_with_scratch,
118    max_index_to_device,
119    max_index_buffer_size,
120    max_index_to_device_with_scratch,
121    max_index_to_device,
122    [
123        i16 => (max_index_i16_buffer_size, max_index_i16_to_device_with_scratch, max_index_i16_to_device),
124        i32 => (max_index_i32_buffer_size, max_index_i32_to_device_with_scratch, max_index_i32_to_device),
125        f32 => (max_index_f32_buffer_size, max_index_f32_to_device_with_scratch, max_index_f32_to_device),
126        f64 => (max_index_f64_buffer_size, max_index_f64_to_device_with_scratch, max_index_f64_to_device)
127    ]
128);
129
130impl_signal_indexed_statistic_dispatch!(
131    MinIndex,
132    min_index_buffer_size,
133    min_index_to_device_with_scratch,
134    min_index_to_device,
135    min_index_buffer_size,
136    min_index_to_device_with_scratch,
137    min_index_to_device,
138    [
139        i16 => (min_index_i16_buffer_size, min_index_i16_to_device_with_scratch, min_index_i16_to_device),
140        i32 => (min_index_i32_buffer_size, min_index_i32_to_device_with_scratch, min_index_i32_to_device),
141        f32 => (min_index_f32_buffer_size, min_index_f32_to_device_with_scratch, min_index_f32_to_device),
142        f64 => (min_index_f64_buffer_size, min_index_f64_to_device_with_scratch, min_index_f64_to_device)
143    ]
144);
145
146impl_signal_indexed_statistic_dispatch!(
147    MaxAbsoluteIndex,
148    max_absolute_index_buffer_size,
149    max_absolute_index_to_device_with_scratch,
150    max_absolute_index_to_device,
151    max_absolute_index_buffer_size,
152    max_absolute_index_to_device_with_scratch,
153    max_absolute_index_to_device,
154    [
155        i16 => (max_absolute_index_i16_buffer_size, max_absolute_index_i16_to_device_with_scratch, max_absolute_index_i16_to_device),
156        i32 => (max_absolute_index_i32_buffer_size, max_absolute_index_i32_to_device_with_scratch, max_absolute_index_i32_to_device)
157    ]
158);
159
160impl_signal_indexed_statistic_dispatch!(
161    MinAbsoluteIndex,
162    min_absolute_index_buffer_size,
163    min_absolute_index_to_device_with_scratch,
164    min_absolute_index_to_device,
165    min_absolute_index_buffer_size,
166    min_absolute_index_to_device_with_scratch,
167    min_absolute_index_to_device,
168    [
169        i16 => (min_absolute_index_i16_buffer_size, min_absolute_index_i16_to_device_with_scratch, min_absolute_index_i16_to_device),
170        i32 => (min_absolute_index_i32_buffer_size, min_absolute_index_i32_to_device_with_scratch, min_absolute_index_i32_to_device)
171    ]
172);
173
174macro_rules! impl_signal_pair_statistic_dispatch {
175    (
176        $trait:ident,
177        $buffer_method:ident,
178        $scratch_method:ident,
179        $method:ident,
180        $buffer_function:ident,
181        $scratch_function:ident,
182        $function:ident,
183        [$($ty:ty => ($direct_buffer:ident, $direct_scratch:ident, $direct:ident)),* $(,)?]
184    ) => {
185        pub trait $trait: DataTypeLike {
186            fn $buffer_method(
187                stream_context: &StreamContext,
188                source: &SignalView<'_, Self>,
189            ) -> Result<usize>;
190
191            fn $scratch_method(
192                stream_context: &StreamContext,
193                source: &SignalView<'_, Self>,
194                min: &mut SignalViewMut<'_, Self>,
195                max: &mut SignalViewMut<'_, Self>,
196                scratch: &mut ScratchBuffer,
197            ) -> Result<()>;
198
199            fn $method(
200                stream_context: &StreamContext,
201                source: &SignalView<'_, Self>,
202                min: &mut SignalViewMut<'_, Self>,
203                max: &mut SignalViewMut<'_, Self>,
204            ) -> Result<()>;
205        }
206
207        $(
208            impl $trait for $ty {
209                fn $buffer_method(
210                    stream_context: &StreamContext,
211                    source: &SignalView<'_, Self>,
212                ) -> Result<usize> {
213                    $direct_buffer(stream_context, source)
214                }
215
216                fn $scratch_method(
217                    stream_context: &StreamContext,
218                    source: &SignalView<'_, Self>,
219                    min: &mut SignalViewMut<'_, Self>,
220                    max: &mut SignalViewMut<'_, Self>,
221                    scratch: &mut ScratchBuffer,
222                ) -> Result<()> {
223                    $direct_scratch(stream_context, source, min, max, scratch)
224                }
225
226                fn $method(
227                    stream_context: &StreamContext,
228                    source: &SignalView<'_, Self>,
229                    min: &mut SignalViewMut<'_, Self>,
230                    max: &mut SignalViewMut<'_, Self>,
231                ) -> Result<()> {
232                    $direct(stream_context, source, min, max)
233                }
234            }
235        )*
236
237        pub fn $buffer_function<T: $trait>(
238            stream_context: &StreamContext,
239            source: &SignalView<'_, T>,
240        ) -> Result<usize> {
241            T::$buffer_method(stream_context, source)
242        }
243
244        pub fn $scratch_function<T: $trait>(
245            stream_context: &StreamContext,
246            source: &SignalView<'_, T>,
247            min: &mut SignalViewMut<'_, T>,
248            max: &mut SignalViewMut<'_, T>,
249            scratch: &mut ScratchBuffer,
250        ) -> Result<()> {
251            T::$scratch_method(stream_context, source, min, max, scratch)
252        }
253
254        pub fn $function<T: $trait>(
255            stream_context: &StreamContext,
256            source: &SignalView<'_, T>,
257            min: &mut SignalViewMut<'_, T>,
258            max: &mut SignalViewMut<'_, T>,
259        ) -> Result<()> {
260            T::$method(stream_context, source, min, max)
261        }
262    };
263}
264
265macro_rules! impl_signal_indexed_pair_statistic_dispatch {
266    (
267        $trait:ident,
268        $buffer_method:ident,
269        $scratch_method:ident,
270        $method:ident,
271        $buffer_function:ident,
272        $scratch_function:ident,
273        $function:ident,
274        [$($ty:ty => ($direct_buffer:ident, $direct_scratch:ident, $direct:ident)),* $(,)?]
275    ) => {
276        pub trait $trait: DataTypeLike {
277            fn $buffer_method(
278                stream_context: &StreamContext,
279                source: &SignalView<'_, Self>,
280            ) -> Result<usize>;
281
282            fn $scratch_method(
283                stream_context: &StreamContext,
284                source: &SignalView<'_, Self>,
285                min: &mut SignalViewMut<'_, Self>,
286                min_index: &mut SignalViewMut<'_, i32>,
287                max: &mut SignalViewMut<'_, Self>,
288                max_index: &mut SignalViewMut<'_, i32>,
289                scratch: &mut ScratchBuffer,
290            ) -> Result<()>;
291
292            fn $method(
293                stream_context: &StreamContext,
294                source: &SignalView<'_, Self>,
295                min: &mut SignalViewMut<'_, Self>,
296                min_index: &mut SignalViewMut<'_, i32>,
297                max: &mut SignalViewMut<'_, Self>,
298                max_index: &mut SignalViewMut<'_, i32>,
299            ) -> Result<()>;
300        }
301
302        $(
303            impl $trait for $ty {
304                fn $buffer_method(
305                    stream_context: &StreamContext,
306                    source: &SignalView<'_, Self>,
307                ) -> Result<usize> {
308                    $direct_buffer(stream_context, source)
309                }
310
311                fn $scratch_method(
312                    stream_context: &StreamContext,
313                    source: &SignalView<'_, Self>,
314                    min: &mut SignalViewMut<'_, Self>,
315                    min_index: &mut SignalViewMut<'_, i32>,
316                    max: &mut SignalViewMut<'_, Self>,
317                    max_index: &mut SignalViewMut<'_, i32>,
318                    scratch: &mut ScratchBuffer,
319                ) -> Result<()> {
320                    $direct_scratch(
321                        stream_context,
322                        source,
323                        min,
324                        min_index,
325                        max,
326                        max_index,
327                        scratch,
328                    )
329                }
330
331                fn $method(
332                    stream_context: &StreamContext,
333                    source: &SignalView<'_, Self>,
334                    min: &mut SignalViewMut<'_, Self>,
335                    min_index: &mut SignalViewMut<'_, i32>,
336                    max: &mut SignalViewMut<'_, Self>,
337                    max_index: &mut SignalViewMut<'_, i32>,
338                ) -> Result<()> {
339                    $direct(stream_context, source, min, min_index, max, max_index)
340                }
341            }
342        )*
343
344        pub fn $buffer_function<T: $trait>(
345            stream_context: &StreamContext,
346            source: &SignalView<'_, T>,
347        ) -> Result<usize> {
348            T::$buffer_method(stream_context, source)
349        }
350
351        pub fn $scratch_function<T: $trait>(
352            stream_context: &StreamContext,
353            source: &SignalView<'_, T>,
354            min: &mut SignalViewMut<'_, T>,
355            min_index: &mut SignalViewMut<'_, i32>,
356            max: &mut SignalViewMut<'_, T>,
357            max_index: &mut SignalViewMut<'_, i32>,
358            scratch: &mut ScratchBuffer,
359        ) -> Result<()> {
360            T::$scratch_method(
361                stream_context,
362                source,
363                min,
364                min_index,
365                max,
366                max_index,
367                scratch,
368            )
369        }
370
371        pub fn $function<T: $trait>(
372            stream_context: &StreamContext,
373            source: &SignalView<'_, T>,
374            min: &mut SignalViewMut<'_, T>,
375            min_index: &mut SignalViewMut<'_, i32>,
376            max: &mut SignalViewMut<'_, T>,
377            max_index: &mut SignalViewMut<'_, i32>,
378        ) -> Result<()> {
379            T::$method(stream_context, source, min, min_index, max, max_index)
380        }
381    };
382}
383
384impl_signal_pair_statistic_dispatch!(
385    MinMax,
386    min_max_buffer_size,
387    min_max_to_device_with_scratch,
388    min_max_to_device,
389    min_max_buffer_size,
390    min_max_to_device_with_scratch,
391    min_max_to_device,
392    [
393        u8 => (min_max_u8_buffer_size, min_max_u8_to_device_with_scratch, min_max_u8_to_device),
394        u16 => (min_max_u16_buffer_size, min_max_u16_to_device_with_scratch, min_max_u16_to_device),
395        i16 => (min_max_i16_buffer_size, min_max_i16_to_device_with_scratch, min_max_i16_to_device),
396        u32 => (min_max_u32_buffer_size, min_max_u32_to_device_with_scratch, min_max_u32_to_device),
397        i32 => (min_max_i32_buffer_size, min_max_i32_to_device_with_scratch, min_max_i32_to_device),
398        f32 => (min_max_f32_buffer_size, min_max_f32_to_device_with_scratch, min_max_f32_to_device),
399        f64 => (min_max_f64_buffer_size, min_max_f64_to_device_with_scratch, min_max_f64_to_device)
400    ]
401);
402
403impl_signal_indexed_pair_statistic_dispatch!(
404    MinMaxIndex,
405    min_max_index_buffer_size,
406    min_max_index_to_device_with_scratch,
407    min_max_index_to_device,
408    min_max_index_buffer_size,
409    min_max_index_to_device_with_scratch,
410    min_max_index_to_device,
411    [
412        u8 => (min_max_index_u8_buffer_size, min_max_index_u8_to_device_with_scratch, min_max_index_u8_to_device),
413        u16 => (min_max_index_u16_buffer_size, min_max_index_u16_to_device_with_scratch, min_max_index_u16_to_device),
414        i16 => (min_max_index_i16_buffer_size, min_max_index_i16_to_device_with_scratch, min_max_index_i16_to_device),
415        u32 => (min_max_index_u32_buffer_size, min_max_index_u32_to_device_with_scratch, min_max_index_u32_to_device),
416        i32 => (min_max_index_i32_buffer_size, min_max_index_i32_to_device_with_scratch, min_max_index_i32_to_device),
417        f32 => (min_max_index_f32_buffer_size, min_max_index_f32_to_device_with_scratch, min_max_index_f32_to_device),
418        f64 => (min_max_index_f64_buffer_size, min_max_index_f64_to_device_with_scratch, min_max_index_f64_to_device)
419    ]
420);
421
422macro_rules! impl_signal_mean_standard_deviation_dispatch {
423    (
424        $trait:ident,
425        $buffer_method:ident,
426        $scratch_method:ident,
427        $method:ident,
428        $buffer_function:ident,
429        $scratch_function:ident,
430        $function:ident,
431        [$($source_ty:ty => ($destination_ty:ty, $direct_buffer:ident, $direct_scratch:ident, $direct:ident)),* $(,)?]
432    ) => {
433        pub trait $trait<Destination>: DataTypeLike
434        where
435            Destination: DataTypeLike,
436        {
437            fn $buffer_method(
438                stream_context: &StreamContext,
439                source: &SignalView<'_, Self>,
440            ) -> Result<usize>;
441
442            fn $scratch_method(
443                stream_context: &StreamContext,
444                source: &SignalView<'_, Self>,
445                mean: &mut SignalViewMut<'_, Destination>,
446                standard_deviation: &mut SignalViewMut<'_, Destination>,
447                scratch: &mut ScratchBuffer,
448            ) -> Result<()>;
449
450            fn $method(
451                stream_context: &StreamContext,
452                source: &SignalView<'_, Self>,
453                mean: &mut SignalViewMut<'_, Destination>,
454                standard_deviation: &mut SignalViewMut<'_, Destination>,
455            ) -> Result<()>;
456        }
457
458        $(
459            impl $trait<$destination_ty> for $source_ty {
460                fn $buffer_method(
461                    stream_context: &StreamContext,
462                    source: &SignalView<'_, Self>,
463                ) -> Result<usize> {
464                    $direct_buffer(stream_context, source)
465                }
466
467                fn $scratch_method(
468                    stream_context: &StreamContext,
469                    source: &SignalView<'_, Self>,
470                    mean: &mut SignalViewMut<'_, $destination_ty>,
471                    standard_deviation: &mut SignalViewMut<'_, $destination_ty>,
472                    scratch: &mut ScratchBuffer,
473                ) -> Result<()> {
474                    $direct_scratch(stream_context, source, mean, standard_deviation, scratch)
475                }
476
477                fn $method(
478                    stream_context: &StreamContext,
479                    source: &SignalView<'_, Self>,
480                    mean: &mut SignalViewMut<'_, $destination_ty>,
481                    standard_deviation: &mut SignalViewMut<'_, $destination_ty>,
482                ) -> Result<()> {
483                    $direct(stream_context, source, mean, standard_deviation)
484                }
485            }
486        )*
487
488        pub fn $buffer_function<Source, Destination>(
489            stream_context: &StreamContext,
490            source: &SignalView<'_, Source>,
491        ) -> Result<usize>
492        where
493            Source: $trait<Destination>,
494            Destination: DataTypeLike,
495        {
496            Source::$buffer_method(stream_context, source)
497        }
498
499        pub fn $scratch_function<Source, Destination>(
500            stream_context: &StreamContext,
501            source: &SignalView<'_, Source>,
502            mean: &mut SignalViewMut<'_, Destination>,
503            standard_deviation: &mut SignalViewMut<'_, Destination>,
504            scratch: &mut ScratchBuffer,
505        ) -> Result<()>
506        where
507            Source: $trait<Destination>,
508            Destination: DataTypeLike,
509        {
510            Source::$scratch_method(stream_context, source, mean, standard_deviation, scratch)
511        }
512
513        pub fn $function<Source, Destination>(
514            stream_context: &StreamContext,
515            source: &SignalView<'_, Source>,
516            mean: &mut SignalViewMut<'_, Destination>,
517            standard_deviation: &mut SignalViewMut<'_, Destination>,
518        ) -> Result<()>
519        where
520            Source: $trait<Destination>,
521            Destination: DataTypeLike,
522        {
523            Source::$method(stream_context, source, mean, standard_deviation)
524        }
525    };
526}
527
528macro_rules! impl_signal_scaled_mean_standard_deviation_dispatch {
529    (
530        $trait:ident,
531        $buffer_method:ident,
532        $scratch_method:ident,
533        $method:ident,
534        $buffer_function:ident,
535        $scratch_function:ident,
536        $function:ident,
537        [$($source_ty:ty => ($destination_ty:ty, $direct_buffer:ident, $direct_scratch:ident, $direct:ident)),* $(,)?]
538    ) => {
539        pub trait $trait<Destination>: DataTypeLike
540        where
541            Destination: DataTypeLike,
542        {
543            fn $buffer_method(
544                stream_context: &StreamContext,
545                source: &SignalView<'_, Self>,
546            ) -> Result<usize>;
547
548            fn $scratch_method(
549                stream_context: &StreamContext,
550                source: &SignalView<'_, Self>,
551                mean: &mut SignalViewMut<'_, Destination>,
552                standard_deviation: &mut SignalViewMut<'_, Destination>,
553                scale_factor: i32,
554                scratch: &mut ScratchBuffer,
555            ) -> Result<()>;
556
557            fn $method(
558                stream_context: &StreamContext,
559                source: &SignalView<'_, Self>,
560                mean: &mut SignalViewMut<'_, Destination>,
561                standard_deviation: &mut SignalViewMut<'_, Destination>,
562                scale_factor: i32,
563            ) -> Result<()>;
564        }
565
566        $(
567            impl $trait<$destination_ty> for $source_ty {
568                fn $buffer_method(
569                    stream_context: &StreamContext,
570                    source: &SignalView<'_, Self>,
571                ) -> Result<usize> {
572                    $direct_buffer(stream_context, source)
573                }
574
575                fn $scratch_method(
576                    stream_context: &StreamContext,
577                    source: &SignalView<'_, Self>,
578                    mean: &mut SignalViewMut<'_, $destination_ty>,
579                    standard_deviation: &mut SignalViewMut<'_, $destination_ty>,
580                    scale_factor: i32,
581                    scratch: &mut ScratchBuffer,
582                ) -> Result<()> {
583                    $direct_scratch(
584                        stream_context,
585                        source,
586                        mean,
587                        standard_deviation,
588                        scale_factor,
589                        scratch,
590                    )
591                }
592
593                fn $method(
594                    stream_context: &StreamContext,
595                    source: &SignalView<'_, Self>,
596                    mean: &mut SignalViewMut<'_, $destination_ty>,
597                    standard_deviation: &mut SignalViewMut<'_, $destination_ty>,
598                    scale_factor: i32,
599                ) -> Result<()> {
600                    $direct(stream_context, source, mean, standard_deviation, scale_factor)
601                }
602            }
603        )*
604
605        pub fn $buffer_function<Source, Destination>(
606            stream_context: &StreamContext,
607            source: &SignalView<'_, Source>,
608        ) -> Result<usize>
609        where
610            Source: $trait<Destination>,
611            Destination: DataTypeLike,
612        {
613            Source::$buffer_method(stream_context, source)
614        }
615
616        pub fn $scratch_function<Source, Destination>(
617            stream_context: &StreamContext,
618            source: &SignalView<'_, Source>,
619            mean: &mut SignalViewMut<'_, Destination>,
620            standard_deviation: &mut SignalViewMut<'_, Destination>,
621            scale_factor: i32,
622            scratch: &mut ScratchBuffer,
623        ) -> Result<()>
624        where
625            Source: $trait<Destination>,
626            Destination: DataTypeLike,
627        {
628            Source::$scratch_method(
629                stream_context,
630                source,
631                mean,
632                standard_deviation,
633                scale_factor,
634                scratch,
635            )
636        }
637
638        pub fn $function<Source, Destination>(
639            stream_context: &StreamContext,
640            source: &SignalView<'_, Source>,
641            mean: &mut SignalViewMut<'_, Destination>,
642            standard_deviation: &mut SignalViewMut<'_, Destination>,
643            scale_factor: i32,
644        ) -> Result<()>
645        where
646            Source: $trait<Destination>,
647            Destination: DataTypeLike,
648        {
649            Source::$method(stream_context, source, mean, standard_deviation, scale_factor)
650        }
651    };
652}
653
654impl_signal_mean_standard_deviation_dispatch!(
655    MeanStandardDeviationTo,
656    mean_standard_deviation_buffer_size,
657    mean_standard_deviation_to_device_with_scratch,
658    mean_standard_deviation_to_device,
659    mean_standard_deviation_buffer_size,
660    mean_standard_deviation_to_device_with_scratch,
661    mean_standard_deviation_to_device,
662    [
663        f32 => (f32, mean_standard_deviation_f32_buffer_size, mean_standard_deviation_f32_to_device_with_scratch, mean_standard_deviation_f32_to_device),
664        f64 => (f64, mean_standard_deviation_f64_buffer_size, mean_standard_deviation_f64_to_device_with_scratch, mean_standard_deviation_f64_to_device)
665    ]
666);
667
668impl_signal_scaled_mean_standard_deviation_dispatch!(
669    MeanStandardDeviationScaledTo,
670    mean_standard_deviation_scaled_buffer_size,
671    mean_standard_deviation_scaled_to_device_with_scratch,
672    mean_standard_deviation_scaled_to_device,
673    mean_standard_deviation_scaled_buffer_size,
674    mean_standard_deviation_scaled_to_device_with_scratch,
675    mean_standard_deviation_scaled_to_device,
676    [
677        i16 => (i16, mean_standard_deviation_i16_scaled_buffer_size, mean_standard_deviation_i16_scaled_to_device_with_scratch, mean_standard_deviation_i16_scaled_to_device),
678        i16 => (i32, mean_standard_deviation_i16_to_i32_scaled_buffer_size, mean_standard_deviation_i16_to_i32_scaled_to_device_with_scratch, mean_standard_deviation_i16_to_i32_scaled_to_device)
679    ]
680);
681
682macro_rules! impl_signal_every_statistic_dispatch {
683    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
684        pub trait $trait: DataTypeLike {
685            fn $method(
686                stream_context: &StreamContext,
687                source: &SignalView<'_, Self>,
688                destination: &mut SignalViewMut<'_, Self>,
689            ) -> Result<()>;
690        }
691
692        $(
693            impl $trait for $ty {
694                fn $method(
695                    stream_context: &StreamContext,
696                    source: &SignalView<'_, Self>,
697                    destination: &mut SignalViewMut<'_, Self>,
698                ) -> Result<()> {
699                    $direct(stream_context, source, destination)
700                }
701            }
702        )*
703
704        pub fn $function<T: $trait>(
705            stream_context: &StreamContext,
706            source: &SignalView<'_, T>,
707            destination: &mut SignalViewMut<'_, T>,
708        ) -> Result<()> {
709            T::$method(stream_context, source, destination)
710        }
711    };
712}
713
714impl_signal_every_statistic_dispatch!(MinEveryInPlace, min_every_in_place, min_every_in_place, [
715    u8 => min_every_u8_in_place,
716    u16 => min_every_u16_in_place,
717    i16 => min_every_i16_in_place,
718    i32 => min_every_i32_in_place,
719    f32 => min_every_f32_in_place,
720    f64 => min_every_f64_in_place
721]);
722
723impl_signal_every_statistic_dispatch!(MaxEveryInPlace, max_every_in_place, max_every_in_place, [
724    u8 => max_every_u8_in_place,
725    u16 => max_every_u16_in_place,
726    i16 => max_every_i16_in_place,
727    i32 => max_every_i32_in_place,
728    f32 => max_every_f32_in_place
729]);
730
731macro_rules! impl_signal_zero_crossing_dispatch {
732    (
733        $trait:ident,
734        $buffer_method:ident,
735        $scratch_method:ident,
736        $method:ident,
737        $buffer_function:ident,
738        $scratch_function:ident,
739        $function:ident,
740        [$($ty:ty => ($direct_buffer:ident, $direct_scratch:ident, $direct:ident)),* $(,)?]
741    ) => {
742        pub trait $trait: DataTypeLike {
743            fn $buffer_method(
744                stream_context: &StreamContext,
745                source: &SignalView<'_, Self>,
746            ) -> Result<usize>;
747
748            fn $scratch_method(
749                stream_context: &StreamContext,
750                source: &SignalView<'_, Self>,
751                destination: &mut SignalViewMut<'_, f32>,
752                zero_crossing_type: ZeroCrossingType,
753                scratch: &mut ScratchBuffer,
754            ) -> Result<()>;
755
756            fn $method(
757                stream_context: &StreamContext,
758                source: &SignalView<'_, Self>,
759                destination: &mut SignalViewMut<'_, f32>,
760                zero_crossing_type: ZeroCrossingType,
761            ) -> Result<()>;
762        }
763
764        $(
765            impl $trait for $ty {
766                fn $buffer_method(
767                    stream_context: &StreamContext,
768                    source: &SignalView<'_, Self>,
769                ) -> Result<usize> {
770                    $direct_buffer(stream_context, source)
771                }
772
773                fn $scratch_method(
774                    stream_context: &StreamContext,
775                    source: &SignalView<'_, Self>,
776                    destination: &mut SignalViewMut<'_, f32>,
777                    zero_crossing_type: ZeroCrossingType,
778                    scratch: &mut ScratchBuffer,
779                ) -> Result<()> {
780                    $direct_scratch(
781                        stream_context,
782                        source,
783                        destination,
784                        zero_crossing_type,
785                        scratch,
786                    )
787                }
788
789                fn $method(
790                    stream_context: &StreamContext,
791                    source: &SignalView<'_, Self>,
792                    destination: &mut SignalViewMut<'_, f32>,
793                    zero_crossing_type: ZeroCrossingType,
794                ) -> Result<()> {
795                    $direct(stream_context, source, destination, zero_crossing_type)
796                }
797            }
798        )*
799
800        pub fn $buffer_function<T: $trait>(
801            stream_context: &StreamContext,
802            source: &SignalView<'_, T>,
803        ) -> Result<usize> {
804            T::$buffer_method(stream_context, source)
805        }
806
807        pub fn $scratch_function<T: $trait>(
808            stream_context: &StreamContext,
809            source: &SignalView<'_, T>,
810            destination: &mut SignalViewMut<'_, f32>,
811            zero_crossing_type: ZeroCrossingType,
812            scratch: &mut ScratchBuffer,
813        ) -> Result<()> {
814            T::$scratch_method(
815                stream_context,
816                source,
817                destination,
818                zero_crossing_type,
819                scratch,
820            )
821        }
822
823        pub fn $function<T: $trait>(
824            stream_context: &StreamContext,
825            source: &SignalView<'_, T>,
826            destination: &mut SignalViewMut<'_, f32>,
827            zero_crossing_type: ZeroCrossingType,
828        ) -> Result<()> {
829            T::$method(stream_context, source, destination, zero_crossing_type)
830        }
831    };
832}
833
834impl_signal_zero_crossing_dispatch!(
835    ZeroCrossingToF32,
836    zero_crossing_to_f32_buffer_size,
837    zero_crossing_to_f32_to_device_with_scratch,
838    zero_crossing_to_f32_to_device,
839    zero_crossing_to_f32_buffer_size,
840    zero_crossing_to_f32_to_device_with_scratch,
841    zero_crossing_to_f32_to_device,
842    [
843        i16 => (zero_crossing_i16_to_f32_buffer_size, zero_crossing_i16_to_f32_to_device_with_scratch, zero_crossing_i16_to_f32_to_device),
844        f32 => (zero_crossing_f32_buffer_size, zero_crossing_f32_to_device_with_scratch, zero_crossing_f32_to_device)
845    ]
846);
847
848macro_rules! impl_signal_error_metric_dispatch {
849    (
850        $trait:ident,
851        $buffer_method:ident,
852        $scratch_method:ident,
853        $method:ident,
854        $buffer_function:ident,
855        $scratch_function:ident,
856        $function:ident,
857        [$($ty:ty => ($direct_buffer:ident, $direct_scratch:ident, $direct:ident)),* $(,)?]
858    ) => {
859        pub trait $trait: DataTypeLike {
860            fn $buffer_method(
861                stream_context: &StreamContext,
862                source: &SignalView<'_, Self>,
863            ) -> Result<usize>;
864
865            fn $scratch_method(
866                stream_context: &StreamContext,
867                source_1: &SignalView<'_, Self>,
868                source_2: &SignalView<'_, Self>,
869                destination: &mut SignalViewMut<'_, f64>,
870                scratch: &mut ScratchBuffer,
871            ) -> Result<()>;
872
873            fn $method(
874                stream_context: &StreamContext,
875                source_1: &SignalView<'_, Self>,
876                source_2: &SignalView<'_, Self>,
877                destination: &mut SignalViewMut<'_, f64>,
878            ) -> Result<()>;
879        }
880
881        $(
882            impl $trait for $ty {
883                fn $buffer_method(
884                    stream_context: &StreamContext,
885                    source: &SignalView<'_, Self>,
886                ) -> Result<usize> {
887                    $direct_buffer(stream_context, source)
888                }
889
890                fn $scratch_method(
891                    stream_context: &StreamContext,
892                    source_1: &SignalView<'_, Self>,
893                    source_2: &SignalView<'_, Self>,
894                    destination: &mut SignalViewMut<'_, f64>,
895                    scratch: &mut ScratchBuffer,
896                ) -> Result<()> {
897                    $direct_scratch(stream_context, source_1, source_2, destination, scratch)
898                }
899
900                fn $method(
901                    stream_context: &StreamContext,
902                    source_1: &SignalView<'_, Self>,
903                    source_2: &SignalView<'_, Self>,
904                    destination: &mut SignalViewMut<'_, f64>,
905                ) -> Result<()> {
906                    $direct(stream_context, source_1, source_2, destination)
907                }
908            }
909        )*
910
911        pub fn $buffer_function<T: $trait>(
912            stream_context: &StreamContext,
913            source: &SignalView<'_, T>,
914        ) -> Result<usize> {
915            T::$buffer_method(stream_context, source)
916        }
917
918        pub fn $scratch_function<T: $trait>(
919            stream_context: &StreamContext,
920            source_1: &SignalView<'_, T>,
921            source_2: &SignalView<'_, T>,
922            destination: &mut SignalViewMut<'_, f64>,
923            scratch: &mut ScratchBuffer,
924        ) -> Result<()> {
925            T::$scratch_method(stream_context, source_1, source_2, destination, scratch)
926        }
927
928        pub fn $function<T: $trait>(
929            stream_context: &StreamContext,
930            source_1: &SignalView<'_, T>,
931            source_2: &SignalView<'_, T>,
932            destination: &mut SignalViewMut<'_, f64>,
933        ) -> Result<()> {
934            T::$method(stream_context, source_1, source_2, destination)
935        }
936    };
937}
938
939impl_signal_error_metric_dispatch!(
940    MaximumError,
941    maximum_error_buffer_size,
942    maximum_error_to_device_with_scratch,
943    maximum_error_to_device,
944    maximum_error_buffer_size,
945    maximum_error_to_device_with_scratch,
946    maximum_error_to_device,
947    [
948        u8 => (maximum_error_u8_buffer_size, maximum_error_u8_to_device_with_scratch, maximum_error_u8_to_device),
949        i8 => (maximum_error_i8_buffer_size, maximum_error_i8_to_device_with_scratch, maximum_error_i8_to_device),
950        u16 => (maximum_error_u16_buffer_size, maximum_error_u16_to_device_with_scratch, maximum_error_u16_to_device),
951        i16 => (maximum_error_i16_buffer_size, maximum_error_i16_to_device_with_scratch, maximum_error_i16_to_device),
952        ComplexI16 => (maximum_error_i16_complex_buffer_size, maximum_error_i16_complex_to_device_with_scratch, maximum_error_i16_complex_to_device),
953        u32 => (maximum_error_u32_buffer_size, maximum_error_u32_to_device_with_scratch, maximum_error_u32_to_device),
954        i32 => (maximum_error_i32_buffer_size, maximum_error_i32_to_device_with_scratch, maximum_error_i32_to_device),
955        ComplexI32 => (maximum_error_i32_complex_buffer_size, maximum_error_i32_complex_to_device_with_scratch, maximum_error_i32_complex_to_device),
956        i64 => (maximum_error_i64_buffer_size, maximum_error_i64_to_device_with_scratch, maximum_error_i64_to_device),
957        ComplexI64 => (maximum_error_i64_complex_buffer_size, maximum_error_i64_complex_to_device_with_scratch, maximum_error_i64_complex_to_device),
958        f32 => (maximum_error_f32_buffer_size, maximum_error_f32_to_device_with_scratch, maximum_error_f32_to_device),
959        Complex32 => (maximum_error_f32_complex_buffer_size, maximum_error_f32_complex_to_device_with_scratch, maximum_error_f32_complex_to_device),
960        f64 => (maximum_error_f64_buffer_size, maximum_error_f64_to_device_with_scratch, maximum_error_f64_to_device),
961        Complex64 => (maximum_error_f64_complex_buffer_size, maximum_error_f64_complex_to_device_with_scratch, maximum_error_f64_complex_to_device)
962    ]
963);
964
965impl_signal_error_metric_dispatch!(
966    AverageError,
967    average_error_buffer_size,
968    average_error_to_device_with_scratch,
969    average_error_to_device,
970    average_error_buffer_size,
971    average_error_to_device_with_scratch,
972    average_error_to_device,
973    [
974        u8 => (average_error_u8_buffer_size, average_error_u8_to_device_with_scratch, average_error_u8_to_device),
975        i8 => (average_error_i8_buffer_size, average_error_i8_to_device_with_scratch, average_error_i8_to_device),
976        u16 => (average_error_u16_buffer_size, average_error_u16_to_device_with_scratch, average_error_u16_to_device),
977        i16 => (average_error_i16_buffer_size, average_error_i16_to_device_with_scratch, average_error_i16_to_device),
978        ComplexI16 => (average_error_i16_complex_buffer_size, average_error_i16_complex_to_device_with_scratch, average_error_i16_complex_to_device),
979        u32 => (average_error_u32_buffer_size, average_error_u32_to_device_with_scratch, average_error_u32_to_device),
980        i32 => (average_error_i32_buffer_size, average_error_i32_to_device_with_scratch, average_error_i32_to_device),
981        ComplexI32 => (average_error_i32_complex_buffer_size, average_error_i32_complex_to_device_with_scratch, average_error_i32_complex_to_device),
982        i64 => (average_error_i64_buffer_size, average_error_i64_to_device_with_scratch, average_error_i64_to_device),
983        ComplexI64 => (average_error_i64_complex_buffer_size, average_error_i64_complex_to_device_with_scratch, average_error_i64_complex_to_device),
984        f32 => (average_error_f32_buffer_size, average_error_f32_to_device_with_scratch, average_error_f32_to_device),
985        Complex32 => (average_error_f32_complex_buffer_size, average_error_f32_complex_to_device_with_scratch, average_error_f32_complex_to_device),
986        f64 => (average_error_f64_buffer_size, average_error_f64_to_device_with_scratch, average_error_f64_to_device),
987        Complex64 => (average_error_f64_complex_buffer_size, average_error_f64_complex_to_device_with_scratch, average_error_f64_complex_to_device)
988    ]
989);
990
991impl_signal_error_metric_dispatch!(
992    MaximumRelativeError,
993    maximum_relative_error_buffer_size,
994    maximum_relative_error_to_device_with_scratch,
995    maximum_relative_error_to_device,
996    maximum_relative_error_buffer_size,
997    maximum_relative_error_to_device_with_scratch,
998    maximum_relative_error_to_device,
999    [
1000        u8 => (maximum_relative_error_u8_buffer_size, maximum_relative_error_u8_to_device_with_scratch, maximum_relative_error_u8_to_device),
1001        i8 => (maximum_relative_error_i8_buffer_size, maximum_relative_error_i8_to_device_with_scratch, maximum_relative_error_i8_to_device),
1002        u16 => (maximum_relative_error_u16_buffer_size, maximum_relative_error_u16_to_device_with_scratch, maximum_relative_error_u16_to_device),
1003        i16 => (maximum_relative_error_i16_buffer_size, maximum_relative_error_i16_to_device_with_scratch, maximum_relative_error_i16_to_device),
1004        ComplexI16 => (maximum_relative_error_i16_complex_buffer_size, maximum_relative_error_i16_complex_to_device_with_scratch, maximum_relative_error_i16_complex_to_device),
1005        u32 => (maximum_relative_error_u32_buffer_size, maximum_relative_error_u32_to_device_with_scratch, maximum_relative_error_u32_to_device),
1006        i32 => (maximum_relative_error_i32_buffer_size, maximum_relative_error_i32_to_device_with_scratch, maximum_relative_error_i32_to_device),
1007        ComplexI32 => (maximum_relative_error_i32_complex_buffer_size, maximum_relative_error_i32_complex_to_device_with_scratch, maximum_relative_error_i32_complex_to_device),
1008        i64 => (maximum_relative_error_i64_buffer_size, maximum_relative_error_i64_to_device_with_scratch, maximum_relative_error_i64_to_device),
1009        ComplexI64 => (maximum_relative_error_i64_complex_buffer_size, maximum_relative_error_i64_complex_to_device_with_scratch, maximum_relative_error_i64_complex_to_device),
1010        f32 => (maximum_relative_error_f32_buffer_size, maximum_relative_error_f32_to_device_with_scratch, maximum_relative_error_f32_to_device),
1011        Complex32 => (maximum_relative_error_f32_complex_buffer_size, maximum_relative_error_f32_complex_to_device_with_scratch, maximum_relative_error_f32_complex_to_device),
1012        f64 => (maximum_relative_error_f64_buffer_size, maximum_relative_error_f64_to_device_with_scratch, maximum_relative_error_f64_to_device),
1013        Complex64 => (maximum_relative_error_f64_complex_buffer_size, maximum_relative_error_f64_complex_to_device_with_scratch, maximum_relative_error_f64_complex_to_device)
1014    ]
1015);
1016
1017impl_signal_error_metric_dispatch!(
1018    AverageRelativeError,
1019    average_relative_error_buffer_size,
1020    average_relative_error_to_device_with_scratch,
1021    average_relative_error_to_device,
1022    average_relative_error_buffer_size,
1023    average_relative_error_to_device_with_scratch,
1024    average_relative_error_to_device,
1025    [
1026        u8 => (average_relative_error_u8_buffer_size, average_relative_error_u8_to_device_with_scratch, average_relative_error_u8_to_device),
1027        i8 => (average_relative_error_i8_buffer_size, average_relative_error_i8_to_device_with_scratch, average_relative_error_i8_to_device),
1028        u16 => (average_relative_error_u16_buffer_size, average_relative_error_u16_to_device_with_scratch, average_relative_error_u16_to_device),
1029        i16 => (average_relative_error_i16_buffer_size, average_relative_error_i16_to_device_with_scratch, average_relative_error_i16_to_device),
1030        ComplexI16 => (average_relative_error_i16_complex_buffer_size, average_relative_error_i16_complex_to_device_with_scratch, average_relative_error_i16_complex_to_device),
1031        u32 => (average_relative_error_u32_buffer_size, average_relative_error_u32_to_device_with_scratch, average_relative_error_u32_to_device),
1032        i32 => (average_relative_error_i32_buffer_size, average_relative_error_i32_to_device_with_scratch, average_relative_error_i32_to_device),
1033        ComplexI32 => (average_relative_error_i32_complex_buffer_size, average_relative_error_i32_complex_to_device_with_scratch, average_relative_error_i32_complex_to_device),
1034        i64 => (average_relative_error_i64_buffer_size, average_relative_error_i64_to_device_with_scratch, average_relative_error_i64_to_device),
1035        ComplexI64 => (average_relative_error_i64_complex_buffer_size, average_relative_error_i64_complex_to_device_with_scratch, average_relative_error_i64_complex_to_device),
1036        f32 => (average_relative_error_f32_buffer_size, average_relative_error_f32_to_device_with_scratch, average_relative_error_f32_to_device),
1037        Complex32 => (average_relative_error_f32_complex_buffer_size, average_relative_error_f32_complex_to_device_with_scratch, average_relative_error_f32_complex_to_device),
1038        f64 => (average_relative_error_f64_buffer_size, average_relative_error_f64_to_device_with_scratch, average_relative_error_f64_to_device),
1039        Complex64 => (average_relative_error_f64_complex_buffer_size, average_relative_error_f64_complex_to_device_with_scratch, average_relative_error_f64_complex_to_device)
1040    ]
1041);