diff --git a/src/traits/util/indexable.rs b/src/traits/util/indexable.rs index 287604f..6a8cc6c 100644 --- a/src/traits/util/indexable.rs +++ b/src/traits/util/indexable.rs @@ -61,8 +61,8 @@ pub trait Indexable { } macro_rules! impl_indexable( - ($Self:ty, [$T:ty, ..$n:expr]) => ( - impl Indexable<$T, [$T,..$n]> for $Self { + ($Self:ty, $S:ident, [$T:ty, ..$n:expr]) => ( + impl<$S> Indexable<$T, [$T,..$n]> for $Self { #[inline] fn len(&self) -> uint { $n } diff --git a/src/types/matrix.rs b/src/types/matrix.rs index d82b1d3..abe38b4 100644 --- a/src/types/matrix.rs +++ b/src/types/matrix.rs @@ -75,9 +75,9 @@ impl Mat4 { // Trait impls -impl_indexable!(Mat2, [Vec2, ..2]) -impl_indexable!(Mat3, [Vec3, ..3]) -impl_indexable!(Mat4, [Vec4, ..4]) +impl_indexable!(Mat2, S, [Vec2, ..2]) +impl_indexable!(Mat3, S, [Vec3, ..3]) +impl_indexable!(Mat4, S, [Vec4, ..4]) impl Swappable, [Vec2, ..2]> for Mat2; impl Swappable, [Vec3, ..3]> for Mat3; diff --git a/src/types/point.rs b/src/types/point.rs index 1c879b4..f0410a5 100644 --- a/src/types/point.rs +++ b/src/types/point.rs @@ -60,8 +60,8 @@ impl Sub, Vec3> for Point3 { #[inline(always)] fn sub( // Trait impls -impl_indexable!(Point2, [T, ..2]) -impl_indexable!(Point3, [T, ..3]) +impl_indexable!(Point2, S, [S, ..2]) +impl_indexable!(Point3, S, [S, ..3]) impl Swappable for Point2; impl Swappable for Point3; diff --git a/src/types/vector.rs b/src/types/vector.rs index 39d7329..8e5f120 100644 --- a/src/types/vector.rs +++ b/src/types/vector.rs @@ -18,7 +18,6 @@ use std::num::{Zero, zero}; use std::num::{sqrt, atan2}; use traits::alg::*; -use traits::ext::*; use traits::util::*; #[deriving(Eq, Zero, Clone)] pub struct Vec1 { x: S } @@ -71,28 +70,40 @@ impl_vec_clonable!(Vec6) // Operator impls -macro_rules! impl_vec_ops( - ($vec_ops_mod:ident, $Self:ident <$S:ident>) => ( +macro_rules! impl_vec_common( + ($vec_ops_mod:ident, $Self:ty, [$S:ident, ..$n:expr]) => ( pub mod $vec_ops_mod { use super::*; - use super::super::super::traits::alg::*; + use traits::alg::*; + use traits::ext::*; + use traits::util::*; - impl_scalar_binop!($Self<$S>, Mul, mul) - impl_scalar_binop!($Self<$S>, Div, div) - impl_scalar_binop!($Self<$S>, Rem, rem) - impl_coordinate_binop!($Self<$S>, $Self<$S>, $Self<$S>, Add, add) - impl_coordinate_binop!($Self<$S>, $Self<$S>, $Self<$S>, Sub, sub) - impl_coordinate_op!($Self<$S>, $Self<$S>, Neg, neg) + impl_indexable!($Self, $S, [$S, ..$n]) + impl<$S: Clone + Field> Swappable<$S, [$S, ..$n]> for $Self; + impl<$S: Clone + Field> Coordinate<$S, [$S, ..$n]> for $Self; + + impl_scalar_binop!($Self, Mul, mul) + impl_scalar_binop!($Self, Div, div) + impl_scalar_binop!($Self, Rem, rem) + impl_coordinate_binop!($Self, $Self, $Self, Add, add) + impl_coordinate_binop!($Self, $Self, $Self, Sub, sub) + impl_coordinate_op!($Self, $Self, Neg, neg) + + impl<$S: Field> ScalarMul<$S> for $Self; + impl<$S: Field> Module<$S> for $Self; + impl<$S: Field> VectorSpace<$S> for $Self; + + impl<$S: Clone + Field> VectorExt<$S, [$S, ..$n]> for $Self; } ) ) -impl_vec_ops!(vec1_ops, Vec1) -impl_vec_ops!(vec2_ops, Vec2) -impl_vec_ops!(vec3_ops, Vec3) -impl_vec_ops!(vec4_ops, Vec4) -impl_vec_ops!(vec5_ops, Vec5) -impl_vec_ops!(vec6_ops, Vec6) +impl_vec_common!(vec1_ops, Vec1, [S, ..1]) +impl_vec_common!(vec2_ops, Vec2, [S, ..2]) +impl_vec_common!(vec3_ops, Vec3, [S, ..3]) +impl_vec_common!(vec4_ops, Vec4, [S, ..4]) +impl_vec_common!(vec5_ops, Vec5, [S, ..5]) +impl_vec_common!(vec6_ops, Vec6, [S, ..6]) /// Operations specific to two-dimensional vectors. impl Vec2 { @@ -112,50 +123,6 @@ impl Vec3 { } } -// Trait impls - -impl_indexable!(Vec1, [T, ..1]) -impl_indexable!(Vec2, [T, ..2]) -impl_indexable!(Vec3, [T, ..3]) -impl_indexable!(Vec4, [T, ..4]) -impl_indexable!(Vec5, [T, ..5]) -impl_indexable!(Vec6, [T, ..6]) - -impl Swappable for Vec1; -impl Swappable for Vec2; -impl Swappable for Vec3; -impl Swappable for Vec4; -impl Swappable for Vec5; -impl Swappable for Vec6; - -impl Coordinate for Vec1; -impl Coordinate for Vec2; -impl Coordinate for Vec3; -impl Coordinate for Vec4; -impl Coordinate for Vec5; -impl Coordinate for Vec6; - -impl ScalarMul for Vec1; -impl ScalarMul for Vec2; -impl ScalarMul for Vec3; -impl ScalarMul for Vec4; -impl ScalarMul for Vec5; -impl ScalarMul for Vec6; - -impl Module for Vec1; -impl Module for Vec2; -impl Module for Vec3; -impl Module for Vec4; -impl Module for Vec5; -impl Module for Vec6; - -impl VectorSpace for Vec1; -impl VectorSpace for Vec2; -impl VectorSpace for Vec3; -impl VectorSpace for Vec4; -impl VectorSpace for Vec5; -impl VectorSpace for Vec6; - macro_rules! impl_vec_inner_product( ($Self:ident <$S:ident>) => ( impl<$S:Real + Field + ApproxEq<$S>> InnerProductSpace<$S> for $Self<$S> { @@ -195,10 +162,3 @@ impl> EuclideanSpace for Vec3 { atan2(self.cross(other).length(), self.dot(other)) } } - -impl VectorExt for Vec1; -impl VectorExt for Vec2; -impl VectorExt for Vec3; -impl VectorExt for Vec4; -impl VectorExt for Vec5; -impl VectorExt for Vec6;