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