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