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