vec3/
ops.rs

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);