Skip to main content

singe_npp/signal/
arithmetic_binary_ops.rs

1use super::*;
2
3impl_binary_operation!(add_i16, i16, nppsAdd_16s_Ctx);
4impl_binary_operation!(add_u16, u16, nppsAdd_16u_Ctx);
5impl_binary_operation!(add_u32, u32, nppsAdd_32u_Ctx);
6impl_binary_operation!(add_f32, f32, nppsAdd_32f_Ctx);
7impl_binary_operation!(add_f64, f64, nppsAdd_64f_Ctx);
8impl_binary_operation!(add_f32_complex, Complex32, nppsAdd_32fc_Ctx);
9impl_binary_operation!(add_f64_complex, Complex64, nppsAdd_64fc_Ctx);
10impl_reversed_binary_operation!(subtract_i16, i16, nppsSub_16s_Ctx);
11impl_reversed_binary_operation!(subtract_f32, f32, nppsSub_32f_Ctx);
12impl_reversed_binary_operation!(subtract_f64, f64, nppsSub_64f_Ctx);
13impl_reversed_binary_operation!(subtract_f32_complex, Complex32, nppsSub_32fc_Ctx);
14impl_reversed_binary_operation!(subtract_f64_complex, Complex64, nppsSub_64fc_Ctx);
15impl_binary_operation!(multiply_i16, i16, nppsMul_16s_Ctx);
16impl_binary_operation!(multiply_f32, f32, nppsMul_32f_Ctx);
17impl_binary_operation!(multiply_f64, f64, nppsMul_64f_Ctx);
18impl_binary_operation!(multiply_f32_complex, Complex32, nppsMul_32fc_Ctx);
19impl_binary_operation!(multiply_f64_complex, Complex64, nppsMul_64fc_Ctx);
20impl_reversed_binary_operation!(divide_f32, f32, nppsDiv_32f_Ctx);
21impl_reversed_binary_operation!(divide_f64, f64, nppsDiv_64f_Ctx);
22impl_reversed_binary_operation!(divide_f32_complex, Complex32, nppsDiv_32fc_Ctx);
23impl_reversed_binary_operation!(divide_f64_complex, Complex64, nppsDiv_64fc_Ctx);
24impl_binary_operation!(and_u8, u8, nppsAnd_8u_Ctx);
25impl_binary_operation!(and_u16, u16, nppsAnd_16u_Ctx);
26impl_binary_operation!(and_u32, u32, nppsAnd_32u_Ctx);
27impl_binary_operation!(or_u8, u8, nppsOr_8u_Ctx);
28impl_binary_operation!(or_u16, u16, nppsOr_16u_Ctx);
29impl_binary_operation!(or_u32, u32, nppsOr_32u_Ctx);
30impl_binary_operation!(xor_u8, u8, nppsXor_8u_Ctx);
31impl_binary_operation!(xor_u16, u16, nppsXor_16u_Ctx);
32impl_binary_operation!(xor_u32, u32, nppsXor_32u_Ctx);
33
34impl_mixed_binary_operation!(add_u8_to_u16, u8, u16, nppsAdd_8u16u_Ctx);
35impl_mixed_binary_operation!(add_i16_to_f32, i16, f32, nppsAdd_16s32f_Ctx);
36impl_reversed_mixed_binary_operation!(subtract_i16_to_f32, i16, f32, nppsSub_16s32f_Ctx);
37impl_mixed_binary_operation!(multiply_u8_to_u16, u8, u16, nppsMul_8u16u_Ctx);
38impl_mixed_binary_operation!(multiply_i16_to_f32, i16, f32, nppsMul_16s32f_Ctx);
39impl_heterogeneous_binary_operation!(
40    multiply_f32_with_f32_complex,
41    f32,
42    Complex32,
43    Complex32,
44    nppsMul_32f32fc_Ctx
45);
46
47impl_scaled_binary_operation!(add_u8_scaled, u8, nppsAdd_8u_Sfs_Ctx);
48impl_scaled_binary_operation!(add_u16_scaled, u16, nppsAdd_16u_Sfs_Ctx);
49impl_scaled_binary_operation!(add_i16_scaled, i16, nppsAdd_16s_Sfs_Ctx);
50impl_scaled_binary_operation!(add_i32_scaled, i32, nppsAdd_32s_Sfs_Ctx);
51impl_scaled_binary_operation!(add_i64_scaled, i64, nppsAdd_64s_Sfs_Ctx);
52impl_scaled_binary_operation!(add_i16_complex_scaled, ComplexI16, nppsAdd_16sc_Sfs_Ctx);
53impl_scaled_binary_operation!(add_i32_complex_scaled, ComplexI32, nppsAdd_32sc_Sfs_Ctx);
54impl_reversed_scaled_binary_operation!(subtract_u8_scaled, u8, nppsSub_8u_Sfs_Ctx);
55impl_reversed_scaled_binary_operation!(subtract_u16_scaled, u16, nppsSub_16u_Sfs_Ctx);
56impl_reversed_scaled_binary_operation!(subtract_i16_scaled, i16, nppsSub_16s_Sfs_Ctx);
57impl_reversed_scaled_binary_operation!(subtract_i32_scaled, i32, nppsSub_32s_Sfs_Ctx);
58impl_reversed_scaled_binary_operation!(
59    subtract_i16_complex_scaled,
60    ComplexI16,
61    nppsSub_16sc_Sfs_Ctx
62);
63impl_reversed_scaled_binary_operation!(
64    subtract_i32_complex_scaled,
65    ComplexI32,
66    nppsSub_32sc_Sfs_Ctx
67);
68impl_scaled_binary_operation!(multiply_u8_scaled, u8, nppsMul_8u_Sfs_Ctx);
69impl_scaled_binary_operation!(multiply_u16_scaled, u16, nppsMul_16u_Sfs_Ctx);
70impl_scaled_binary_operation!(multiply_i16_scaled, i16, nppsMul_16s_Sfs_Ctx);
71impl_scaled_binary_operation!(multiply_i32_scaled, i32, nppsMul_32s_Sfs_Ctx);
72impl_scaled_binary_operation!(
73    multiply_i16_complex_scaled,
74    ComplexI16,
75    nppsMul_16sc_Sfs_Ctx
76);
77impl_scaled_binary_operation!(
78    multiply_i32_complex_scaled,
79    ComplexI32,
80    nppsMul_32sc_Sfs_Ctx
81);
82impl_scaled_heterogeneous_binary_operation!(
83    multiply_u16_with_i16_scaled,
84    u16,
85    i16,
86    i16,
87    nppsMul_16u16s_Sfs_Ctx
88);
89impl_scaled_mixed_binary_operation!(multiply_i16_to_i32_scaled, i16, i32, nppsMul_16s32s_Sfs_Ctx);
90impl_scaled_heterogeneous_binary_operation!(
91    multiply_i32_with_i32_complex_scaled,
92    i32,
93    ComplexI32,
94    ComplexI32,
95    nppsMul_32s32sc_Sfs_Ctx
96);
97impl_scaled_binary_operation!(multiply_low_i32_scaled, i32, nppsMul_Low_32s_Sfs_Ctx);
98impl_reversed_scaled_binary_operation!(divide_u8_scaled, u8, nppsDiv_8u_Sfs_Ctx);
99impl_reversed_scaled_binary_operation!(divide_u16_scaled, u16, nppsDiv_16u_Sfs_Ctx);
100impl_reversed_scaled_binary_operation!(divide_i16_scaled, i16, nppsDiv_16s_Sfs_Ctx);
101impl_reversed_scaled_binary_operation!(divide_i32_scaled, i32, nppsDiv_32s_Sfs_Ctx);
102impl_reversed_scaled_binary_operation!(divide_i16_complex_scaled, ComplexI16, nppsDiv_16sc_Sfs_Ctx);
103impl_reversed_scaled_heterogeneous_binary_operation!(
104    divide_i32_by_i16_scaled,
105    i32,
106    i16,
107    i16,
108    nppsDiv_32s16s_Sfs_Ctx
109);
110impl_reversed_scaled_round_binary_operation!(divide_u8_scaled_round, u8, nppsDiv_Round_8u_Sfs_Ctx);
111impl_reversed_scaled_round_binary_operation!(
112    divide_u16_scaled_round,
113    u16,
114    nppsDiv_Round_16u_Sfs_Ctx
115);
116impl_reversed_scaled_round_binary_operation!(
117    divide_i16_scaled_round,
118    i16,
119    nppsDiv_Round_16s_Sfs_Ctx
120);
121
122impl_binary_operation_in_place!(add_i16_in_place, i16, nppsAdd_16s_I_Ctx);
123impl_binary_operation_in_place!(add_f32_in_place, f32, nppsAdd_32f_I_Ctx);
124impl_binary_operation_in_place!(add_f64_in_place, f64, nppsAdd_64f_I_Ctx);
125impl_binary_operation_in_place!(add_f32_complex_in_place, Complex32, nppsAdd_32fc_I_Ctx);
126impl_binary_operation_in_place!(add_f64_complex_in_place, Complex64, nppsAdd_64fc_I_Ctx);
127impl_binary_operation_in_place!(subtract_i16_in_place, i16, nppsSub_16s_I_Ctx);
128impl_binary_operation_in_place!(subtract_f32_in_place, f32, nppsSub_32f_I_Ctx);
129impl_binary_operation_in_place!(subtract_f64_in_place, f64, nppsSub_64f_I_Ctx);
130impl_binary_operation_in_place!(subtract_f32_complex_in_place, Complex32, nppsSub_32fc_I_Ctx);
131impl_binary_operation_in_place!(subtract_f64_complex_in_place, Complex64, nppsSub_64fc_I_Ctx);
132impl_binary_operation_in_place!(multiply_i16_in_place, i16, nppsMul_16s_I_Ctx);
133impl_binary_operation_in_place!(multiply_f32_in_place, f32, nppsMul_32f_I_Ctx);
134impl_binary_operation_in_place!(multiply_f64_in_place, f64, nppsMul_64f_I_Ctx);
135impl_binary_operation_in_place!(multiply_f32_complex_in_place, Complex32, nppsMul_32fc_I_Ctx);
136impl_binary_operation_in_place!(multiply_f64_complex_in_place, Complex64, nppsMul_64fc_I_Ctx);
137impl_binary_operation_in_place!(divide_f32_in_place, f32, nppsDiv_32f_I_Ctx);
138impl_binary_operation_in_place!(divide_f64_in_place, f64, nppsDiv_64f_I_Ctx);
139impl_binary_operation_in_place!(divide_f32_complex_in_place, Complex32, nppsDiv_32fc_I_Ctx);
140impl_binary_operation_in_place!(divide_f64_complex_in_place, Complex64, nppsDiv_64fc_I_Ctx);
141impl_binary_operation_in_place!(and_u8_in_place, u8, nppsAnd_8u_I_Ctx);
142impl_binary_operation_in_place!(and_u16_in_place, u16, nppsAnd_16u_I_Ctx);
143impl_binary_operation_in_place!(and_u32_in_place, u32, nppsAnd_32u_I_Ctx);
144impl_binary_operation_in_place!(or_u8_in_place, u8, nppsOr_8u_I_Ctx);
145impl_binary_operation_in_place!(or_u16_in_place, u16, nppsOr_16u_I_Ctx);
146impl_binary_operation_in_place!(or_u32_in_place, u32, nppsOr_32u_I_Ctx);
147impl_binary_operation_in_place!(xor_u8_in_place, u8, nppsXor_8u_I_Ctx);
148impl_binary_operation_in_place!(xor_u16_in_place, u16, nppsXor_16u_I_Ctx);
149impl_binary_operation_in_place!(xor_u32_in_place, u32, nppsXor_32u_I_Ctx);
150impl_mixed_binary_operation_in_place!(add_i16_to_i32_in_place, i16, i32, nppsAdd_16s32s_I_Ctx);
151impl_heterogeneous_binary_operation_in_place!(
152    multiply_f32_complex_by_f32_in_place,
153    f32,
154    Complex32,
155    nppsMul_32f32fc_I_Ctx
156);
157
158impl_scaled_binary_operation_in_place!(add_u8_scaled_in_place, u8, nppsAdd_8u_ISfs_Ctx);
159impl_scaled_binary_operation_in_place!(add_u16_scaled_in_place, u16, nppsAdd_16u_ISfs_Ctx);
160impl_scaled_binary_operation_in_place!(add_i16_scaled_in_place, i16, nppsAdd_16s_ISfs_Ctx);
161impl_scaled_binary_operation_in_place!(add_i32_scaled_in_place, i32, nppsAdd_32s_ISfs_Ctx);
162impl_scaled_binary_operation_in_place!(
163    add_i16_complex_scaled_in_place,
164    ComplexI16,
165    nppsAdd_16sc_ISfs_Ctx
166);
167impl_scaled_binary_operation_in_place!(
168    add_i32_complex_scaled_in_place,
169    ComplexI32,
170    nppsAdd_32sc_ISfs_Ctx
171);
172impl_scaled_binary_operation_in_place!(subtract_u8_scaled_in_place, u8, nppsSub_8u_ISfs_Ctx);
173impl_scaled_binary_operation_in_place!(subtract_u16_scaled_in_place, u16, nppsSub_16u_ISfs_Ctx);
174impl_scaled_binary_operation_in_place!(subtract_i16_scaled_in_place, i16, nppsSub_16s_ISfs_Ctx);
175impl_scaled_binary_operation_in_place!(subtract_i32_scaled_in_place, i32, nppsSub_32s_ISfs_Ctx);
176impl_scaled_binary_operation_in_place!(
177    subtract_i16_complex_scaled_in_place,
178    ComplexI16,
179    nppsSub_16sc_ISfs_Ctx
180);
181impl_scaled_binary_operation_in_place!(
182    subtract_i32_complex_scaled_in_place,
183    ComplexI32,
184    nppsSub_32sc_ISfs_Ctx
185);
186impl_scaled_binary_operation_in_place!(multiply_u8_scaled_in_place, u8, nppsMul_8u_ISfs_Ctx);
187impl_scaled_binary_operation_in_place!(multiply_u16_scaled_in_place, u16, nppsMul_16u_ISfs_Ctx);
188impl_scaled_binary_operation_in_place!(multiply_i16_scaled_in_place, i16, nppsMul_16s_ISfs_Ctx);
189impl_scaled_binary_operation_in_place!(multiply_i32_scaled_in_place, i32, nppsMul_32s_ISfs_Ctx);
190impl_scaled_binary_operation_in_place!(
191    multiply_i16_complex_scaled_in_place,
192    ComplexI16,
193    nppsMul_16sc_ISfs_Ctx
194);
195impl_scaled_binary_operation_in_place!(
196    multiply_i32_complex_scaled_in_place,
197    ComplexI32,
198    nppsMul_32sc_ISfs_Ctx
199);
200impl_scaled_heterogeneous_binary_operation_in_place!(
201    multiply_i32_complex_by_i32_scaled_in_place,
202    i32,
203    ComplexI32,
204    nppsMul_32s32sc_ISfs_Ctx
205);
206impl_scaled_binary_operation_in_place!(divide_u8_scaled_in_place, u8, nppsDiv_8u_ISfs_Ctx);
207impl_scaled_binary_operation_in_place!(divide_u16_scaled_in_place, u16, nppsDiv_16u_ISfs_Ctx);
208impl_scaled_binary_operation_in_place!(divide_i16_scaled_in_place, i16, nppsDiv_16s_ISfs_Ctx);
209impl_scaled_binary_operation_in_place!(divide_i32_scaled_in_place, i32, nppsDiv_32s_ISfs_Ctx);
210impl_scaled_binary_operation_in_place!(
211    divide_i16_complex_scaled_in_place,
212    ComplexI16,
213    nppsDiv_16sc_ISfs_Ctx
214);
215impl_scaled_round_binary_operation_in_place!(
216    divide_u8_scaled_round_in_place,
217    u8,
218    nppsDiv_Round_8u_ISfs_Ctx
219);
220impl_scaled_round_binary_operation_in_place!(
221    divide_u16_scaled_round_in_place,
222    u16,
223    nppsDiv_Round_16u_ISfs_Ctx
224);
225impl_scaled_round_binary_operation_in_place!(
226    divide_i16_scaled_round_in_place,
227    i16,
228    nppsDiv_Round_16s_ISfs_Ctx
229);
230
231impl_destination_update_operation!(add_product_f32, f32, nppsAddProduct_32f_Ctx);
232impl_destination_update_operation!(add_product_f64, f64, nppsAddProduct_64f_Ctx);
233impl_destination_update_operation!(add_product_f32_complex, Complex32, nppsAddProduct_32fc_Ctx);
234impl_destination_update_operation!(add_product_f64_complex, Complex64, nppsAddProduct_64fc_Ctx);
235impl_scaled_destination_update_operation!(
236    add_product_i16_scaled,
237    i16,
238    i16,
239    nppsAddProduct_16s_Sfs_Ctx
240);
241impl_scaled_destination_update_operation!(
242    add_product_i32_scaled,
243    i32,
244    i32,
245    nppsAddProduct_32s_Sfs_Ctx
246);
247impl_scaled_destination_update_operation!(
248    add_product_i16_to_i32_scaled,
249    i16,
250    i32,
251    nppsAddProduct_16s32s_Sfs_Ctx
252);
253
254impl_unary_operation!(absolute_i16, i16, nppsAbs_16s_Ctx);
255impl_unary_operation!(absolute_i32, i32, nppsAbs_32s_Ctx);
256impl_unary_operation!(absolute_f32, f32, nppsAbs_32f_Ctx);
257impl_unary_operation!(absolute_f64, f64, nppsAbs_64f_Ctx);
258impl_unary_operation!(exponent_f32, f32, nppsExp_32f_Ctx);
259impl_unary_operation!(exponent_f64, f64, nppsExp_64f_Ctx);
260impl_mixed_unary_operation!(exponent_f32_to_f64, f32, f64, nppsExp_32f64f_Ctx);
261impl_scaled_unary_operation!(exponent_i16_scaled, i16, nppsExp_16s_Sfs_Ctx);
262impl_scaled_unary_operation!(exponent_i32_scaled, i32, nppsExp_32s_Sfs_Ctx);
263impl_scaled_unary_operation!(exponent_i64_scaled, i64, nppsExp_64s_Sfs_Ctx);
264impl_unary_operation!(natural_logarithm_f32, f32, nppsLn_32f_Ctx);
265impl_unary_operation!(natural_logarithm_f64, f64, nppsLn_64f_Ctx);
266impl_mixed_unary_operation!(natural_logarithm_f64_to_f32, f64, f32, nppsLn_64f32f_Ctx);
267impl_scaled_unary_operation!(natural_logarithm_i16_scaled, i16, nppsLn_16s_Sfs_Ctx);
268impl_scaled_unary_operation!(natural_logarithm_i32_scaled, i32, nppsLn_32s_Sfs_Ctx);
269impl_scaled_mixed_unary_operation!(
270    natural_logarithm_i32_to_i16_scaled,
271    i32,
272    i16,
273    nppsLn_32s16s_Sfs_Ctx
274);
275impl_scaled_unary_operation!(ten_times_log10_i32_scaled, i32, npps10Log10_32s_Sfs_Ctx);
276impl_unary_operation!(arctangent_f32, f32, nppsArctan_32f_Ctx);
277impl_unary_operation!(arctangent_f64, f64, nppsArctan_64f_Ctx);
278impl_unary_operation!(cube_root_f32, f32, nppsCubrt_32f_Ctx);
279impl_scaled_mixed_unary_operation!(
280    cube_root_i32_to_i16_scaled,
281    i32,
282    i16,
283    nppsCubrt_32s16s_Sfs_Ctx
284);
285impl_unary_operation!(not_u8, u8, nppsNot_8u_Ctx);
286impl_unary_operation!(not_u16, u16, nppsNot_16u_Ctx);
287impl_unary_operation!(not_u32, u32, nppsNot_32u_Ctx);
288impl_unary_operation!(square_f32, f32, nppsSqr_32f_Ctx);
289impl_unary_operation!(square_f64, f64, nppsSqr_64f_Ctx);
290impl_unary_operation!(square_f32_complex, Complex32, nppsSqr_32fc_Ctx);
291impl_unary_operation!(square_f64_complex, Complex64, nppsSqr_64fc_Ctx);
292impl_scaled_unary_operation!(square_u8_scaled, u8, nppsSqr_8u_Sfs_Ctx);
293impl_scaled_unary_operation!(square_u16_scaled, u16, nppsSqr_16u_Sfs_Ctx);
294impl_scaled_unary_operation!(square_i16_scaled, i16, nppsSqr_16s_Sfs_Ctx);
295impl_scaled_unary_operation!(square_i16_complex_scaled, ComplexI16, nppsSqr_16sc_Sfs_Ctx);
296impl_unary_operation!(square_root_f32, f32, nppsSqrt_32f_Ctx);
297impl_unary_operation!(square_root_f64, f64, nppsSqrt_64f_Ctx);
298impl_unary_operation!(square_root_f32_complex, Complex32, nppsSqrt_32fc_Ctx);
299impl_unary_operation!(square_root_f64_complex, Complex64, nppsSqrt_64fc_Ctx);
300impl_scaled_unary_operation!(square_root_u8_scaled, u8, nppsSqrt_8u_Sfs_Ctx);
301impl_scaled_unary_operation!(square_root_u16_scaled, u16, nppsSqrt_16u_Sfs_Ctx);
302impl_scaled_unary_operation!(square_root_i16_scaled, i16, nppsSqrt_16s_Sfs_Ctx);
303impl_scaled_unary_operation!(
304    square_root_i16_complex_scaled,
305    ComplexI16,
306    nppsSqrt_16sc_Sfs_Ctx
307);
308impl_scaled_unary_operation!(square_root_i64_scaled, i64, nppsSqrt_64s_Sfs_Ctx);
309impl_scaled_mixed_unary_operation!(
310    square_root_i32_to_i16_scaled,
311    i32,
312    i16,
313    nppsSqrt_32s16s_Sfs_Ctx
314);
315impl_scaled_mixed_unary_operation!(
316    square_root_i64_to_i16_scaled,
317    i64,
318    i16,
319    nppsSqrt_64s16s_Sfs_Ctx
320);
321
322impl_unary_operation_in_place!(absolute_i16_in_place, i16, nppsAbs_16s_I_Ctx);
323impl_unary_operation_in_place!(absolute_i32_in_place, i32, nppsAbs_32s_I_Ctx);
324impl_unary_operation_in_place!(absolute_f32_in_place, f32, nppsAbs_32f_I_Ctx);
325impl_unary_operation_in_place!(absolute_f64_in_place, f64, nppsAbs_64f_I_Ctx);
326impl_unary_operation_in_place!(exponent_f32_in_place, f32, nppsExp_32f_I_Ctx);
327impl_unary_operation_in_place!(exponent_f64_in_place, f64, nppsExp_64f_I_Ctx);
328impl_scaled_unary_operation_in_place!(exponent_i16_scaled_in_place, i16, nppsExp_16s_ISfs_Ctx);
329impl_scaled_unary_operation_in_place!(exponent_i32_scaled_in_place, i32, nppsExp_32s_ISfs_Ctx);
330impl_scaled_unary_operation_in_place!(exponent_i64_scaled_in_place, i64, nppsExp_64s_ISfs_Ctx);
331impl_unary_operation_in_place!(natural_logarithm_f32_in_place, f32, nppsLn_32f_I_Ctx);
332impl_unary_operation_in_place!(natural_logarithm_f64_in_place, f64, nppsLn_64f_I_Ctx);
333impl_scaled_unary_operation_in_place!(
334    natural_logarithm_i16_scaled_in_place,
335    i16,
336    nppsLn_16s_ISfs_Ctx
337);
338impl_scaled_unary_operation_in_place!(
339    natural_logarithm_i32_scaled_in_place,
340    i32,
341    nppsLn_32s_ISfs_Ctx
342);
343impl_scaled_unary_operation_in_place!(
344    ten_times_log10_i32_scaled_in_place,
345    i32,
346    npps10Log10_32s_ISfs_Ctx
347);
348impl_unary_operation_in_place!(arctangent_f32_in_place, f32, nppsArctan_32f_I_Ctx);
349impl_unary_operation_in_place!(arctangent_f64_in_place, f64, nppsArctan_64f_I_Ctx);
350impl_unary_operation_in_place!(not_u8_in_place, u8, nppsNot_8u_I_Ctx);
351impl_unary_operation_in_place!(not_u16_in_place, u16, nppsNot_16u_I_Ctx);
352impl_unary_operation_in_place!(not_u32_in_place, u32, nppsNot_32u_I_Ctx);
353impl_unary_operation_in_place!(square_f32_in_place, f32, nppsSqr_32f_I_Ctx);
354impl_unary_operation_in_place!(square_f64_in_place, f64, nppsSqr_64f_I_Ctx);
355impl_unary_operation_in_place!(square_f32_complex_in_place, Complex32, nppsSqr_32fc_I_Ctx);
356impl_unary_operation_in_place!(square_f64_complex_in_place, Complex64, nppsSqr_64fc_I_Ctx);
357impl_scaled_unary_operation_in_place!(square_u8_scaled_in_place, u8, nppsSqr_8u_ISfs_Ctx);
358impl_scaled_unary_operation_in_place!(square_u16_scaled_in_place, u16, nppsSqr_16u_ISfs_Ctx);
359impl_scaled_unary_operation_in_place!(square_i16_scaled_in_place, i16, nppsSqr_16s_ISfs_Ctx);
360impl_scaled_unary_operation_in_place!(
361    square_i16_complex_scaled_in_place,
362    ComplexI16,
363    nppsSqr_16sc_ISfs_Ctx
364);
365impl_unary_operation_in_place!(square_root_f32_in_place, f32, nppsSqrt_32f_I_Ctx);
366impl_unary_operation_in_place!(square_root_f64_in_place, f64, nppsSqrt_64f_I_Ctx);
367impl_unary_operation_in_place!(
368    square_root_f32_complex_in_place,
369    Complex32,
370    nppsSqrt_32fc_I_Ctx
371);
372impl_unary_operation_in_place!(
373    square_root_f64_complex_in_place,
374    Complex64,
375    nppsSqrt_64fc_I_Ctx
376);
377impl_scaled_unary_operation_in_place!(square_root_u8_scaled_in_place, u8, nppsSqrt_8u_ISfs_Ctx);
378impl_scaled_unary_operation_in_place!(square_root_u16_scaled_in_place, u16, nppsSqrt_16u_ISfs_Ctx);
379impl_scaled_unary_operation_in_place!(square_root_i16_scaled_in_place, i16, nppsSqrt_16s_ISfs_Ctx);
380impl_scaled_unary_operation_in_place!(
381    square_root_i16_complex_scaled_in_place,
382    ComplexI16,
383    nppsSqrt_16sc_ISfs_Ctx
384);
385impl_scaled_unary_operation_in_place!(square_root_i64_scaled_in_place, i64, nppsSqrt_64s_ISfs_Ctx);
386
387impl_normalize!(normalize_f32, f32, nppsNormalize_32f_Ctx);
388impl_normalize!(normalize_f64, f64, nppsNormalize_64f_Ctx);
389impl_complex_normalize!(
390    normalize_f32_complex,
391    Complex32,
392    f32,
393    nppsNormalize_32fc_Ctx
394);
395impl_complex_normalize!(
396    normalize_f64_complex,
397    Complex64,
398    f64,
399    nppsNormalize_64fc_Ctx
400);
401impl_scaled_normalize!(normalize_i16_scaled, i16, nppsNormalize_16s_Sfs_Ctx);
402impl_scaled_normalize!(
403    normalize_i16_complex_scaled,
404    ComplexI16,
405    nppsNormalize_16sc_Sfs_Ctx
406);
407
408impl_parameterized_unary_operation_in_place!(cauchy_f32_in_place, f32, f32, nppsCauchy_32f_I_Ctx);
409impl_parameterized_unary_operation_in_place!(
410    cauchy_derivative_f32_in_place,
411    f32,
412    f32,
413    nppsCauchyD_32f_I_Ctx
414);
415
416macro_rules! impl_signal_binary_dispatch {
417    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
418        pub trait $trait: DataTypeLike {
419            fn $method(
420                stream_context: &StreamContext,
421                left: &SignalView<'_, Self>,
422                right: &SignalView<'_, Self>,
423                destination: &mut SignalViewMut<'_, Self>,
424            ) -> Result<()>;
425        }
426
427        $(
428            impl $trait for $ty {
429                fn $method(
430                    stream_context: &StreamContext,
431                    left: &SignalView<'_, Self>,
432                    right: &SignalView<'_, Self>,
433                    destination: &mut SignalViewMut<'_, Self>,
434                ) -> Result<()> {
435                    $direct(stream_context, left, right, destination)
436                }
437            }
438        )*
439
440        pub fn $function<T: $trait>(
441            stream_context: &StreamContext,
442            left: &SignalView<'_, T>,
443            right: &SignalView<'_, T>,
444            destination: &mut SignalViewMut<'_, T>,
445        ) -> Result<()> {
446            T::$method(stream_context, left, right, destination)
447        }
448    };
449}
450
451macro_rules! impl_signal_binary_in_place_dispatch {
452    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
453        pub trait $trait: DataTypeLike {
454            fn $method(
455                stream_context: &StreamContext,
456                signal: &SignalView<'_, Self>,
457                destination: &mut SignalViewMut<'_, Self>,
458            ) -> Result<()>;
459        }
460
461        $(
462            impl $trait for $ty {
463                fn $method(
464                    stream_context: &StreamContext,
465                    signal: &SignalView<'_, Self>,
466                    destination: &mut SignalViewMut<'_, Self>,
467                ) -> Result<()> {
468                    $direct(stream_context, signal, destination)
469                }
470            }
471        )*
472
473        pub fn $function<T: $trait>(
474            stream_context: &StreamContext,
475            signal: &SignalView<'_, T>,
476            destination: &mut SignalViewMut<'_, T>,
477        ) -> Result<()> {
478            T::$method(stream_context, signal, destination)
479        }
480    };
481}
482
483macro_rules! impl_signal_scaled_binary_dispatch {
484    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
485        pub trait $trait: DataTypeLike {
486            fn $method(
487                stream_context: &StreamContext,
488                left: &SignalView<'_, Self>,
489                right: &SignalView<'_, Self>,
490                destination: &mut SignalViewMut<'_, Self>,
491                scale_factor: i32,
492            ) -> Result<()>;
493        }
494
495        $(
496            impl $trait for $ty {
497                fn $method(
498                    stream_context: &StreamContext,
499                    left: &SignalView<'_, Self>,
500                    right: &SignalView<'_, Self>,
501                    destination: &mut SignalViewMut<'_, Self>,
502                    scale_factor: i32,
503                ) -> Result<()> {
504                    $direct(stream_context, left, right, destination, scale_factor)
505                }
506            }
507        )*
508
509        pub fn $function<T: $trait>(
510            stream_context: &StreamContext,
511            left: &SignalView<'_, T>,
512            right: &SignalView<'_, T>,
513            destination: &mut SignalViewMut<'_, T>,
514            scale_factor: i32,
515        ) -> Result<()> {
516            T::$method(stream_context, left, right, destination, scale_factor)
517        }
518    };
519}
520
521macro_rules! impl_signal_scaled_binary_in_place_dispatch {
522    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
523        pub trait $trait: DataTypeLike {
524            fn $method(
525                stream_context: &StreamContext,
526                signal: &SignalView<'_, Self>,
527                destination: &mut SignalViewMut<'_, Self>,
528                scale_factor: i32,
529            ) -> Result<()>;
530        }
531
532        $(
533            impl $trait for $ty {
534                fn $method(
535                    stream_context: &StreamContext,
536                    signal: &SignalView<'_, Self>,
537                    destination: &mut SignalViewMut<'_, Self>,
538                    scale_factor: i32,
539                ) -> Result<()> {
540                    $direct(stream_context, signal, destination, scale_factor)
541                }
542            }
543        )*
544
545        pub fn $function<T: $trait>(
546            stream_context: &StreamContext,
547            signal: &SignalView<'_, T>,
548            destination: &mut SignalViewMut<'_, T>,
549            scale_factor: i32,
550        ) -> Result<()> {
551            T::$method(stream_context, signal, destination, scale_factor)
552        }
553    };
554}
555
556macro_rules! impl_signal_scaled_round_binary_dispatch {
557    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
558        pub trait $trait: DataTypeLike {
559            fn $method(
560                stream_context: &StreamContext,
561                left: &SignalView<'_, Self>,
562                right: &SignalView<'_, Self>,
563                destination: &mut SignalViewMut<'_, Self>,
564                scale_factor: i32,
565                round_mode: RoundMode,
566            ) -> Result<()>;
567        }
568
569        $(
570            impl $trait for $ty {
571                fn $method(
572                    stream_context: &StreamContext,
573                    left: &SignalView<'_, Self>,
574                    right: &SignalView<'_, Self>,
575                    destination: &mut SignalViewMut<'_, Self>,
576                    scale_factor: i32,
577                    round_mode: RoundMode,
578                ) -> Result<()> {
579                    $direct(stream_context, left, right, destination, scale_factor, round_mode)
580                }
581            }
582        )*
583
584        pub fn $function<T: $trait>(
585            stream_context: &StreamContext,
586            left: &SignalView<'_, T>,
587            right: &SignalView<'_, T>,
588            destination: &mut SignalViewMut<'_, T>,
589            scale_factor: i32,
590            round_mode: RoundMode,
591        ) -> Result<()> {
592            T::$method(stream_context, left, right, destination, scale_factor, round_mode)
593        }
594    };
595}
596
597macro_rules! impl_signal_scaled_round_binary_in_place_dispatch {
598    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
599        pub trait $trait: DataTypeLike {
600            fn $method(
601                stream_context: &StreamContext,
602                signal: &SignalView<'_, Self>,
603                destination: &mut SignalViewMut<'_, Self>,
604                scale_factor: i32,
605                round_mode: RoundMode,
606            ) -> Result<()>;
607        }
608
609        $(
610            impl $trait for $ty {
611                fn $method(
612                    stream_context: &StreamContext,
613                    signal: &SignalView<'_, Self>,
614                    destination: &mut SignalViewMut<'_, Self>,
615                    scale_factor: i32,
616                    round_mode: RoundMode,
617                ) -> Result<()> {
618                    $direct(stream_context, signal, destination, scale_factor, round_mode)
619                }
620            }
621        )*
622
623        pub fn $function<T: $trait>(
624            stream_context: &StreamContext,
625            signal: &SignalView<'_, T>,
626            destination: &mut SignalViewMut<'_, T>,
627            scale_factor: i32,
628            round_mode: RoundMode,
629        ) -> Result<()> {
630            T::$method(stream_context, signal, destination, scale_factor, round_mode)
631        }
632    };
633}
634
635impl_signal_binary_dispatch!(Add, add, add, [
636    i16 => add_i16,
637    u16 => add_u16,
638    u32 => add_u32,
639    f32 => add_f32,
640    f64 => add_f64,
641    Complex32 => add_f32_complex,
642    Complex64 => add_f64_complex
643]);
644impl_signal_binary_dispatch!(Subtract, subtract, subtract, [
645    i16 => subtract_i16,
646    f32 => subtract_f32,
647    f64 => subtract_f64,
648    Complex32 => subtract_f32_complex,
649    Complex64 => subtract_f64_complex
650]);
651impl_signal_binary_dispatch!(Multiply, multiply, multiply, [
652    i16 => multiply_i16,
653    f32 => multiply_f32,
654    f64 => multiply_f64,
655    Complex32 => multiply_f32_complex,
656    Complex64 => multiply_f64_complex
657]);
658impl_signal_binary_dispatch!(Divide, divide, divide, [
659    f32 => divide_f32,
660    f64 => divide_f64,
661    Complex32 => divide_f32_complex,
662    Complex64 => divide_f64_complex
663]);
664impl_signal_binary_dispatch!(And, and, and, [
665    u8 => and_u8,
666    u16 => and_u16,
667    u32 => and_u32
668]);
669impl_signal_binary_dispatch!(Or, or, or, [
670    u8 => or_u8,
671    u16 => or_u16,
672    u32 => or_u32
673]);
674impl_signal_binary_dispatch!(Xor, xor, xor, [
675    u8 => xor_u8,
676    u16 => xor_u16,
677    u32 => xor_u32
678]);
679
680impl_signal_binary_in_place_dispatch!(AddInPlace, add_in_place, add_in_place, [
681    i16 => add_i16_in_place,
682    f32 => add_f32_in_place,
683    f64 => add_f64_in_place,
684    Complex32 => add_f32_complex_in_place,
685    Complex64 => add_f64_complex_in_place
686]);
687impl_signal_binary_in_place_dispatch!(SubtractInPlace, subtract_in_place, subtract_in_place, [
688    i16 => subtract_i16_in_place,
689    f32 => subtract_f32_in_place,
690    f64 => subtract_f64_in_place,
691    Complex32 => subtract_f32_complex_in_place,
692    Complex64 => subtract_f64_complex_in_place
693]);
694impl_signal_binary_in_place_dispatch!(MultiplyInPlace, multiply_in_place, multiply_in_place, [
695    i16 => multiply_i16_in_place,
696    f32 => multiply_f32_in_place,
697    f64 => multiply_f64_in_place,
698    Complex32 => multiply_f32_complex_in_place,
699    Complex64 => multiply_f64_complex_in_place
700]);
701impl_signal_binary_in_place_dispatch!(DivideInPlace, divide_in_place, divide_in_place, [
702    f32 => divide_f32_in_place,
703    f64 => divide_f64_in_place,
704    Complex32 => divide_f32_complex_in_place,
705    Complex64 => divide_f64_complex_in_place
706]);
707impl_signal_binary_in_place_dispatch!(AndInPlace, and_in_place, and_in_place, [
708    u8 => and_u8_in_place,
709    u16 => and_u16_in_place,
710    u32 => and_u32_in_place
711]);
712impl_signal_binary_in_place_dispatch!(OrInPlace, or_in_place, or_in_place, [
713    u8 => or_u8_in_place,
714    u16 => or_u16_in_place,
715    u32 => or_u32_in_place
716]);
717impl_signal_binary_in_place_dispatch!(XorInPlace, xor_in_place, xor_in_place, [
718    u8 => xor_u8_in_place,
719    u16 => xor_u16_in_place,
720    u32 => xor_u32_in_place
721]);
722
723impl_signal_scaled_binary_dispatch!(AddScaled, add_scaled, add_scaled, [
724    u8 => add_u8_scaled,
725    u16 => add_u16_scaled,
726    i16 => add_i16_scaled,
727    i32 => add_i32_scaled,
728    i64 => add_i64_scaled,
729    ComplexI16 => add_i16_complex_scaled,
730    ComplexI32 => add_i32_complex_scaled
731]);
732impl_signal_scaled_binary_dispatch!(SubtractScaled, subtract_scaled, subtract_scaled, [
733    u8 => subtract_u8_scaled,
734    u16 => subtract_u16_scaled,
735    i16 => subtract_i16_scaled,
736    i32 => subtract_i32_scaled,
737    ComplexI16 => subtract_i16_complex_scaled,
738    ComplexI32 => subtract_i32_complex_scaled
739]);
740impl_signal_scaled_binary_dispatch!(MultiplyScaled, multiply_scaled, multiply_scaled, [
741    u8 => multiply_u8_scaled,
742    u16 => multiply_u16_scaled,
743    i16 => multiply_i16_scaled,
744    i32 => multiply_i32_scaled,
745    ComplexI16 => multiply_i16_complex_scaled,
746    ComplexI32 => multiply_i32_complex_scaled
747]);
748impl_signal_scaled_binary_dispatch!(DivideScaled, divide_scaled, divide_scaled, [
749    u8 => divide_u8_scaled,
750    u16 => divide_u16_scaled,
751    i16 => divide_i16_scaled,
752    i32 => divide_i32_scaled,
753    ComplexI16 => divide_i16_complex_scaled
754]);
755impl_signal_scaled_round_binary_dispatch!(DivideScaledRound, divide_scaled_round, divide_scaled_round, [
756    u8 => divide_u8_scaled_round,
757    u16 => divide_u16_scaled_round,
758    i16 => divide_i16_scaled_round
759]);
760
761impl_signal_scaled_binary_in_place_dispatch!(AddScaledInPlace, add_scaled_in_place, add_scaled_in_place, [
762    u8 => add_u8_scaled_in_place,
763    u16 => add_u16_scaled_in_place,
764    i16 => add_i16_scaled_in_place,
765    i32 => add_i32_scaled_in_place,
766    ComplexI16 => add_i16_complex_scaled_in_place,
767    ComplexI32 => add_i32_complex_scaled_in_place
768]);
769impl_signal_scaled_binary_in_place_dispatch!(SubtractScaledInPlace, subtract_scaled_in_place, subtract_scaled_in_place, [
770    u8 => subtract_u8_scaled_in_place,
771    u16 => subtract_u16_scaled_in_place,
772    i16 => subtract_i16_scaled_in_place,
773    i32 => subtract_i32_scaled_in_place,
774    ComplexI16 => subtract_i16_complex_scaled_in_place,
775    ComplexI32 => subtract_i32_complex_scaled_in_place
776]);
777impl_signal_scaled_binary_in_place_dispatch!(MultiplyScaledInPlace, multiply_scaled_in_place, multiply_scaled_in_place, [
778    u8 => multiply_u8_scaled_in_place,
779    u16 => multiply_u16_scaled_in_place,
780    i16 => multiply_i16_scaled_in_place,
781    i32 => multiply_i32_scaled_in_place,
782    ComplexI16 => multiply_i16_complex_scaled_in_place,
783    ComplexI32 => multiply_i32_complex_scaled_in_place
784]);
785impl_signal_scaled_binary_in_place_dispatch!(DivideScaledInPlace, divide_scaled_in_place, divide_scaled_in_place, [
786    u8 => divide_u8_scaled_in_place,
787    u16 => divide_u16_scaled_in_place,
788    i16 => divide_i16_scaled_in_place,
789    i32 => divide_i32_scaled_in_place,
790    ComplexI16 => divide_i16_complex_scaled_in_place
791]);
792impl_signal_scaled_round_binary_in_place_dispatch!(DivideScaledRoundInPlace, divide_scaled_round_in_place, divide_scaled_round_in_place, [
793    u8 => divide_u8_scaled_round_in_place,
794    u16 => divide_u16_scaled_round_in_place,
795    i16 => divide_i16_scaled_round_in_place
796]);