argmin_math/vec/
zero.rs

1// Copyright 2018-2024 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::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 approx::assert_relative_eq;
28    use paste::item;
29
30    macro_rules! make_test {
31        ($t:ty) => {
32            item! {
33                #[test]
34                fn [<test_zero_like_ $t>]() {
35                    let t: Vec<$t> = vec![];
36                    let a = t.zero_like();
37                    assert_eq!(t, a);
38                }
39            }
40
41            item! {
42                #[test]
43                fn [<test_zero_like_2_ $t>]() {
44                    let a = (vec![42 as $t; 4]).zero_like();
45                    for i in 0..4 {
46                        assert_relative_eq!(0 as f64, a[i] as f64, epsilon = f64::EPSILON);
47                    }
48                }
49            }
50
51            item! {
52                #[test]
53                fn [<test_2d_zero_like_ $t>]() {
54                    let t: Vec<Vec<$t>> = vec![];
55                    let a = t.zero_like();
56                    assert_eq!(t, a);
57                }
58            }
59
60            item! {
61                #[test]
62                fn [<test_2d_zero_like_2_ $t>]() {
63                    let a = (vec![vec![42 as $t; 2]; 2]).zero_like();
64                    for i in 0..2 {
65                        for j in 0..2 {
66                            assert_relative_eq!(0 as f64, a[i][j] as f64, epsilon = f64::EPSILON);
67                        }
68                    }
69                }
70            }
71        };
72    }
73
74    make_test!(i8);
75    make_test!(u8);
76    make_test!(i16);
77    make_test!(u16);
78    make_test!(i32);
79    make_test!(u32);
80    make_test!(i64);
81    make_test!(u64);
82    make_test!(f32);
83    make_test!(f64);
84}