argmin/core/math/
zero_vec.rs1use 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}