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