From 37d3bcd49555f1e07992aa0a8d11befa1ed5de9a Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Wed, 14 Nov 2012 10:20:36 +1000 Subject: [PATCH] Inherit Neg and move neg method into appropriate impls --- src/matrix.rs | 42 ++++++++++++++++++------------------------ src/quaternion.rs | 14 ++++++-------- src/vector.rs | 38 ++++++++++++++++---------------------- 3 files changed, 40 insertions(+), 54 deletions(-) diff --git a/src/matrix.rs b/src/matrix.rs index dc350dc..ce2a5e7 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -51,7 +51,7 @@ pub trait Matrix: Eq, Index, ToPtr { pure fn row(i: uint) -> RowVec; } -pub trait NumericMatrix: Matrix { +pub trait NumericMatrix: Matrix, Neg { pure fn mul_t(value: T) -> self; pure fn mul_v(other: &ColVec) -> ColVec; } @@ -158,6 +158,11 @@ pub impl Mat2: Matrix, Vec2> { } pub impl Mat2: NumericMatrix, Vec2> { + #[inline(always)] + pure fn neg() -> Mat2 { + Mat2::from_cols(-self[0], -self[1]) + } + #[inline(always)] pure fn mul_t(value: T) -> Mat2 { Mat2::from_cols(self[0].mul_t(value), @@ -264,13 +269,6 @@ pub impl Mat2: Index> { } } -pub impl> Mat2: Neg> { - #[inline(always)] - pure fn neg() -> Mat2 { - Mat2::from_cols(-self[0], -self[1]) - } -} - // TODO: make work for T:Integer pub impl Mat2: Eq { #[inline(always)] @@ -394,7 +392,12 @@ pub impl Mat3: Matrix, Vec3> { } } -pub impl Mat3: NumericMatrix, Vec3> { +pub impl Mat3: NumericMatrix, Vec3> { + #[inline(always)] + pure fn neg() -> Mat3 { + Mat3::from_cols(-self[0], -self[1], -self[2]) + } + #[inline(always)] pure fn mul_t(value: T) -> Mat3 { Mat3::from_cols(self[0].mul_t(value), @@ -559,13 +562,6 @@ pub impl Mat3: Index> { } } -pub impl> Mat3: Neg> { - #[inline(always)] - pure fn neg() -> Mat3 { - Mat3::from_cols(-self[0], -self[1], -self[2]) - } -} - // TODO: make work for T:Integer pub impl Mat3: Eq { #[inline(always)] @@ -710,7 +706,12 @@ pub impl Mat4: Matrix, Vec4> { } -pub impl Mat4: NumericMatrix, Vec4> { +pub impl Mat4: NumericMatrix, Vec4> { + #[inline(always)] + pure fn neg() -> Mat4 { + Mat4::from_cols(-self[0], -self[1], -self[2], -self[3]) + } + #[inline(always)] pure fn mul_t(value: T) -> Mat4 { Mat4::from_cols(self[0].mul_t(value), @@ -905,13 +906,6 @@ pub impl Mat4: Index> { } } -pub impl> Mat4: Neg> { - #[inline(always)] - pure fn neg() -> Mat4 { - Mat4::from_cols(-self[0], -self[1], -self[2], -self[3]) - } -} - // TODO: make work for T:Integer pub impl Mat4: Eq { #[inline(always)] diff --git a/src/quaternion.rs b/src/quaternion.rs index 5622dbf..14352ba 100644 --- a/src/quaternion.rs +++ b/src/quaternion.rs @@ -23,7 +23,7 @@ pub type dquat4 = Quat; /// a double-precision floating-point quate // // Quaternion // -pub trait Quaternion: Eq, Index, ToPtr { +pub trait Quaternion: Eq, Index, Neg, ToPtr { pure fn dim() -> uint; pure fn mul_t(value: T) -> self; @@ -95,6 +95,11 @@ pub impl Quat: Quaternion #[inline(always)] pure fn dim() -> uint { 4 } + #[inline(always)] + pure fn neg() -> Quat { + Quat::new(-self[0], -self[1], -self[2], -self[3]) + } + #[inline(always)] pure fn mul_t(value: T) -> Quat { Quat::new(self[0] * value, @@ -263,13 +268,6 @@ pub impl Quat: Index { } } -pub impl> Quat: Neg> { - #[inline(always)] - pure fn neg() -> Quat { - Quat::new(-self[0], -self[1], -self[2], -self[3]) - } -} - // TODO: make work for T:Integer pub impl Quat: Eq { #[inline(always)] diff --git a/src/vector.rs b/src/vector.rs index 04fb5a6..18eff52 100644 --- a/src/vector.rs +++ b/src/vector.rs @@ -35,7 +35,7 @@ pub trait Vector: Eq, Index, ToPtr { static pure fn dim() -> uint; } -pub trait NumericVector: Vector { +pub trait NumericVector: Vector, Neg{ pure fn mul_t(value: T) -> self; pure fn div_t(value: T) -> self; @@ -123,6 +123,11 @@ pub impl Vec2: Vector { } pub impl Vec2: NumericVector { + #[inline(always)] + pure fn neg() -> Vec2 { + Vec2::new(-self[0], -self[1]) + } + #[inline(always)] pure fn mul_t(value: T) -> Vec2 { Vec2::new(self[0] * value, @@ -189,13 +194,6 @@ pub impl Vec2: Index { } } -pub impl> Vec2: Neg> { - #[inline(always)] - pure fn neg() -> Vec2 { - Vec2::new(-self[0], -self[1]) - } -} - // TODO: make work for T:Integer pub impl Vec2: Eq { #[inline(always)] @@ -303,6 +301,11 @@ pub impl Vec3: Vector { } pub impl Vec3: NumericVector { + #[inline(always)] + pure fn neg() -> Vec3 { + Vec3::new(-self[0], -self[1], -self[2]) + } + #[inline(always)] pure fn mul_t(value: T) -> Vec3 { Vec3::new(self[0] * value, @@ -375,13 +378,6 @@ pub impl Vec3: Index { } } -pub impl> Vec3: Neg> { - #[inline(always)] - pure fn neg() -> Vec3 { - Vec3::new(-self[0], -self[1], -self[2]) - } -} - // TODO: make work for T:Integer pub impl Vec3: Eq { #[inline(always)] @@ -489,6 +485,11 @@ pub impl Vec4: Vector { } pub impl Vec4: NumericVector { + #[inline(always)] + pure fn neg() -> Vec4 { + Vec4::new(-self[0], -self[1], -self[2], -self[3]) + } + #[inline(always)] pure fn mul_t(value: T) -> Vec4 { Vec4::new(self[0] * value, @@ -567,13 +568,6 @@ pub impl Vec4: Index { } } -pub impl> Vec4: Neg> { - #[inline(always)] - pure fn neg() -> Vec4 { - Vec4::new(-self[0], -self[1], -self[2], -self[3]) - } -} - pub impl Vec4: Eq { #[inline(always)] pure fn eq(other: &Vec4) -> bool {