argmin/core/math/
zero_vec.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::ArgminZeroLike;
9
10impl<T> ArgminZeroLike for Vec<T>
11where
12    T: ArgminZeroLike + Clone,
13{
14    #[inline]
15    fn zero_like(&self) -> Vec<T> {
16        if !self.is_empty() {
17            vec![self[0].zero_like(); self.len()]
18        } else {
19            vec![]
20        }
21    }
22}
23
24#[cfg(test)]
25mod tests {
26    use super::*;
27    use paste::item;
28
29    macro_rules! make_test {
30        ($t:ty) => {
31            item! {
32                #[test]
33                fn [<test_zero_like_ $t>]() {
34                    let t: Vec<$t> = vec![];
35                    let a = t.zero_like();
36                    assert_eq!(t, a);
37                }
38            }
39
40            item! {
41                #[test]
42                fn [<test_zero_like_2_ $t>]() {
43                    let a = (vec![42 as $t; 4]).zero_like();
44                    for i in 0..4 {
45                        assert!(((0 as $t - a[i]) as f64).abs() < std::f64::EPSILON);
46                    }
47                }
48            }
49
50            item! {
51                #[test]
52                fn [<test_2d_zero_like_ $t>]() {
53                    let t: Vec<Vec<$t>> = vec![];
54                    let a = t.zero_like();
55                    assert_eq!(t, a);
56                }
57            }
58
59            item! {
60                #[test]
61                fn [<test_2d_zero_like_2_ $t>]() {
62                    let a = (vec![vec![42 as $t; 2]; 2]).zero_like();
63                    for i in 0..2 {
64                        for j in 0..2 {
65                            assert!(((0 as $t - a[i][j]) as f64).abs() < std::f64::EPSILON);
66                        }
67                    }
68                }
69            }
70        };
71    }
72
73    make_test!(isize);
74    make_test!(usize);
75    make_test!(i8);
76    make_test!(u8);
77    make_test!(i16);
78    make_test!(u16);
79    make_test!(i32);
80    make_test!(u32);
81    make_test!(i64);
82    make_test!(u64);
83    make_test!(f32);
84    make_test!(f64);
85}