argmin/core/math/
zero.rs

1// Copyright 2018-2020 argmin developers
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
5// http://opensource.org/licenses/MIT>, at your option. This file may not be
6// copied, modified, or distributed except according to those terms.
7
8use 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}