1use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Sub, SubAssign};
2
3macro_rules! create_ops {
4 ($($Trait:ident $func:ident),*) => ($(
5 #[inline]
6 pub fn $func<'out, T>(out: &'out mut [T; 2], a: &[T; 2], b: &[T; 2]) -> &'out mut [T; 2]
7 where
8 for<'a, 'b> &'a T: $Trait<&'b T, Output = T>,
9 {
10 out[0] = $Trait::$func(&a[0], &b[0]);
11 out[1] = $Trait::$func(&a[1], &b[1]);
12 out
13 }
14 )*);
15}
16create_ops!(Add add, Div div, Mul mul, Rem rem, Sub sub);
17
18macro_rules! create_ops_mut {
19 ($($Trait:ident $func:ident $name:ident),*) => ($(
20 #[inline]
21 pub fn $name<'out, T>(a: &'out mut [T; 2], b: &[T; 2]) -> &'out mut [T; 2]
22 where
23 for<'a> T: $Trait<&'a T>,
24 {
25 $Trait::$func(&mut a[0], &b[0]);
26 $Trait::$func(&mut a[1], &b[1]);
27 a
28 }
29 )*);
30}
31create_ops_mut!(
32 AddAssign add_assign add_mut,
33 DivAssign div_assign div_mut,
34 MulAssign mul_assign mul_mut,
35 RemAssign rem_assign rem_mut,
36 SubAssign sub_assign sub_mut
37);
38
39macro_rules! create_ops_scalar {
40 ($($Trait:ident $func:ident $name:ident),*) => ($(
41 #[inline]
42 pub fn $name<'out, T>(out: &'out mut [T; 2], a: &[T; 2], s: &T) -> &'out mut [T; 2]
43 where
44 for<'a, 'b> &'a T: $Trait<&'b T, Output = T>,
45 {
46 out[0] = $Trait::$func(&a[0], s);
47 out[1] = $Trait::$func(&a[1], s);
48 out
49 }
50 )*);
51}
52create_ops_scalar!(Add add sadd, Div div sdiv, Mul mul smul, Rem rem srem, Sub sub ssub);
53
54macro_rules! create_ops_scalar_mut {
55 ($($Trait:ident $func:ident $name:ident),*) => ($(
56 #[inline]
57 pub fn $name<'out, T>(out: &'out mut [T; 2], s: &T) -> &'out mut [T; 2]
58 where
59 for<'a> T: $Trait<&'a T>,
60 {
61 $Trait::$func(&mut out[0], s);
62 $Trait::$func(&mut out[1], s);
63 out
64 }
65 )*);
66}
67create_ops_scalar_mut!(
68 AddAssign add_assign sadd_mut,
69 DivAssign div_assign sdiv_mut,
70 MulAssign mul_assign smul_mut,
71 RemAssign rem_assign srem_mut,
72 SubAssign sub_assign ssub_mut
73);