From 338c4947359915ddcc4a83bfab7ca977178785f7 Mon Sep 17 00:00:00 2001 From: Cameron Hart Date: Sat, 2 Jan 2016 00:09:11 +1100 Subject: [PATCH] Make macro usage more like existing style --- src/macros.rs | 26 +++++++------------------- src/vector.rs | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/macros.rs b/src/macros.rs index fc5d43f..c4d60a2 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -106,26 +106,14 @@ macro_rules! impl_operator { let ($lhs, $rhs) = (self, other); $body } } - }; -} -macro_rules! impl_scalar_ops { - ($VectorN:ident<$S:ident> { $($field:ident),+ }) => { - impl_operator!(Add<$VectorN<$S>> for $S { - fn add(scalar, vector) -> $VectorN<$S> { $VectorN::new($(scalar + vector.$field),+) } - }); - impl_operator!(Sub<$VectorN<$S>> for $S { - fn sub(scalar, vector) -> $VectorN<$S> { $VectorN::new($(scalar - vector.$field),+) } - }); - impl_operator!(Mul<$VectorN<$S>> for $S { - fn mul(scalar, vector) -> $VectorN<$S> { $VectorN::new($(scalar * vector.$field),+) } - }); - impl_operator!(Div<$VectorN<$S>> for $S { - fn div(scalar, vector) -> $VectorN<$S> { $VectorN::new($(scalar / vector.$field),+) } - }); - impl_operator!(Rem<$VectorN<$S>> for $S { - fn rem(scalar, vector) -> $VectorN<$S> { $VectorN::new($(scalar % vector.$field),+) } - }); + impl<'a> $Op<&'a $Rhs<$S>> for $Lhs { + type Output = $Output; + #[inline] + fn $op(self, other: &'a $Rhs<$S>) -> $Output { + let ($lhs, $rhs) = (self, other); $body + } + } }; } diff --git a/src/vector.rs b/src/vector.rs index 0d47c75..75e4e1e 100644 --- a/src/vector.rs +++ b/src/vector.rs @@ -278,6 +278,19 @@ macro_rules! impl_vector { fn rem_assign(&mut self, other) { $(self.$field %= other.$field);+ } }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_scalar_ops!($VectorN { $($field),+ }); + impl_index_operators!($VectorN, $n, S, usize); impl_index_operators!($VectorN, $n, [S], Range); impl_index_operators!($VectorN, $n, [S], RangeTo); @@ -286,20 +299,30 @@ macro_rules! impl_vector { } } -macro_rules! impl_vector_scalar_ops { - ($($S:ident)*) => ($( - impl_scalar_ops!(Vector2<$S> { x, y }); - impl_scalar_ops!(Vector3<$S> { x, y, z }); - impl_scalar_ops!(Vector4<$S> { x, y, z, w }); - )*) +macro_rules! impl_scalar_ops { + ($VectorN:ident<$S:ident> { $($field:ident),+ }) => { + impl_operator!(Add<$VectorN<$S>> for $S { + fn add(scalar, vector) -> $VectorN<$S> { $VectorN::new($(scalar + vector.$field),+) } + }); + impl_operator!(Sub<$VectorN<$S>> for $S { + fn sub(scalar, vector) -> $VectorN<$S> { $VectorN::new($(scalar - vector.$field),+) } + }); + impl_operator!(Mul<$VectorN<$S>> for $S { + fn mul(scalar, vector) -> $VectorN<$S> { $VectorN::new($(scalar * vector.$field),+) } + }); + impl_operator!(Div<$VectorN<$S>> for $S { + fn div(scalar, vector) -> $VectorN<$S> { $VectorN::new($(scalar / vector.$field),+) } + }); + impl_operator!(Rem<$VectorN<$S>> for $S { + fn rem(scalar, vector) -> $VectorN<$S> { $VectorN::new($(scalar % vector.$field),+) } + }); + }; } impl_vector!(Vector2 { x, y }, 2, vec2); impl_vector!(Vector3 { x, y, z }, 3, vec3); impl_vector!(Vector4 { x, y, z, w }, 4, vec4); -impl_vector_scalar_ops!(usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64); - impl_fixed_array_conversions!(Vector2 { x: 0, y: 1 }, 2); impl_fixed_array_conversions!(Vector3 { x: 0, y: 1, z: 2 }, 3); impl_fixed_array_conversions!(Vector4 { x: 0, y: 1, z: 2, w: 3 }, 4);