1use 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}