1use crate::core::math::{ArgminZero, ArgminZeroLike};
9use num_complex::Complex;
10
11macro_rules! make_zero {
12 ($t:ty) => {
13 impl ArgminZero for $t {
14 #[allow(clippy::cast_lossless)]
15 #[inline]
16 fn zero() -> $t {
17 0 as $t
18 }
19 }
20 impl ArgminZeroLike for $t {
21 #[allow(clippy::cast_lossless)]
22 #[inline]
23 fn zero_like(&self) -> $t {
24 0 as $t
25 }
26 }
27 };
28}
29
30macro_rules! make_complex_zero {
31 ($t:ty) => {
32 impl ArgminZero for Complex<$t> {
33 #[allow(clippy::cast_lossless)]
34 #[inline]
35 fn zero() -> Complex<$t> {
36 Complex::new(0 as $t, 0 as $t)
37 }
38 }
39 impl ArgminZeroLike for Complex<$t> {
40 #[allow(clippy::cast_lossless)]
41 #[inline]
42 fn zero_like(&self) -> Complex<$t> {
43 Complex::new(0 as $t, 0 as $t)
44 }
45 }
46 };
47}
48
49make_zero!(f32);
50make_zero!(f64);
51make_zero!(i8);
52make_zero!(i16);
53make_zero!(i32);
54make_zero!(i64);
55make_zero!(u8);
56make_zero!(u16);
57make_zero!(u32);
58make_zero!(u64);
59make_zero!(isize);
60make_zero!(usize);
61make_complex_zero!(f32);
62make_complex_zero!(f64);
63make_complex_zero!(i8);
64make_complex_zero!(i16);
65make_complex_zero!(i32);
66make_complex_zero!(i64);
67make_complex_zero!(u8);
68make_complex_zero!(u16);
69make_complex_zero!(u32);
70make_complex_zero!(u64);
71make_complex_zero!(isize);
72make_complex_zero!(usize);
73
74#[cfg(test)]
75mod tests {
76 use super::*;
77 use paste::item;
78
79 macro_rules! make_test {
80 ($t:ty) => {
81 item! {
82 #[test]
83 fn [<test_zero_ $t>]() {
84 let a = <$t as ArgminZero>::zero();
85 assert!(((0 as $t - a) as f64).abs() < std::f64::EPSILON);
86 }
87 }
88
89 item! {
90 #[test]
91 fn [<test_zero_like_ $t>]() {
92 let a = (42 as $t).zero_like();
93 assert!(((0 as $t - a) as f64).abs() < std::f64::EPSILON);
94 }
95 }
96 };
97 }
98
99 make_test!(isize);
100 make_test!(usize);
101 make_test!(i8);
102 make_test!(u8);
103 make_test!(i16);
104 make_test!(u16);
105 make_test!(i32);
106 make_test!(u32);
107 make_test!(i64);
108 make_test!(u64);
109 make_test!(f32);
110 make_test!(f64);
111}