Inherit Neg and move neg method into appropriate impls

This commit is contained in:
Brendan Zabarauskas 2012-11-14 10:20:36 +10:00
parent bac59d2332
commit 37d3bcd495
3 changed files with 40 additions and 54 deletions

View file

@ -51,7 +51,7 @@ pub trait Matrix<T, ColVec, RowVec>: Eq, Index<uint, T>, ToPtr<T> {
pure fn row(i: uint) -> RowVec;
}
pub trait NumericMatrix<T, ColVec, RowVec>: Matrix<T, ColVec, RowVec> {
pub trait NumericMatrix<T, ColVec, RowVec>: Matrix<T, ColVec, RowVec>, Neg<self> {
pure fn mul_t(value: T) -> self;
pure fn mul_v(other: &ColVec) -> ColVec;
}
@ -158,6 +158,11 @@ pub impl<T:Copy> Mat2<T>: Matrix<T, Vec2<T>, Vec2<T>> {
}
pub impl<T:Copy Num NumCast> Mat2<T>: NumericMatrix<T, Vec2<T>, Vec2<T>> {
#[inline(always)]
pure fn neg() -> Mat2<T> {
Mat2::from_cols(-self[0], -self[1])
}
#[inline(always)]
pure fn mul_t(value: T) -> Mat2<T> {
Mat2::from_cols(self[0].mul_t(value),
@ -264,13 +269,6 @@ pub impl<T:Copy> Mat2<T>: Index<uint, Vec2<T>> {
}
}
pub impl<T:Copy Neg<T>> Mat2<T>: Neg<Mat2<T>> {
#[inline(always)]
pure fn neg() -> Mat2<T> {
Mat2::from_cols(-self[0], -self[1])
}
}
// TODO: make work for T:Integer
pub impl<T:Copy FuzzyEq> Mat2<T>: Eq {
#[inline(always)]
@ -394,7 +392,12 @@ pub impl<T:Copy> Mat3<T>: Matrix<T, Vec3<T>, Vec3<T>> {
}
}
pub impl<T:Copy Num NumCast> Mat3<T>: NumericMatrix<T, Vec3<T>, Vec3<T>> {
pub impl<T:Copy Num> Mat3<T>: NumericMatrix<T, Vec3<T>, Vec3<T>> {
#[inline(always)]
pure fn neg() -> Mat3<T> {
Mat3::from_cols(-self[0], -self[1], -self[2])
}
#[inline(always)]
pure fn mul_t(value: T) -> Mat3<T> {
Mat3::from_cols(self[0].mul_t(value),
@ -559,13 +562,6 @@ pub impl<T:Copy> Mat3<T>: Index<uint, Vec3<T>> {
}
}
pub impl<T:Copy Neg<T>> Mat3<T>: Neg<Mat3<T>> {
#[inline(always)]
pure fn neg() -> Mat3<T> {
Mat3::from_cols(-self[0], -self[1], -self[2])
}
}
// TODO: make work for T:Integer
pub impl<T:Copy FuzzyEq> Mat3<T>: Eq {
#[inline(always)]
@ -710,7 +706,12 @@ pub impl<T:Copy> Mat4<T>: Matrix<T, Vec4<T>, Vec4<T>> {
}
pub impl<T:Copy Num NumCast FuzzyEq> Mat4<T>: NumericMatrix<T, Vec4<T>, Vec4<T>> {
pub impl<T:Copy Num> Mat4<T>: NumericMatrix<T, Vec4<T>, Vec4<T>> {
#[inline(always)]
pure fn neg() -> Mat4<T> {
Mat4::from_cols(-self[0], -self[1], -self[2], -self[3])
}
#[inline(always)]
pure fn mul_t(value: T) -> Mat4<T> {
Mat4::from_cols(self[0].mul_t(value),
@ -905,13 +906,6 @@ pub impl<T:Copy> Mat4<T>: Index<uint, Vec4<T>> {
}
}
pub impl<T:Copy Neg<T>> Mat4<T>: Neg<Mat4<T>> {
#[inline(always)]
pure fn neg() -> Mat4<T> {
Mat4::from_cols(-self[0], -self[1], -self[2], -self[3])
}
}
// TODO: make work for T:Integer
pub impl<T:Copy FuzzyEq> Mat4<T>: Eq {
#[inline(always)]

View file

@ -23,7 +23,7 @@ pub type dquat4 = Quat<f64>; /// a double-precision floating-point quate
//
// Quaternion
//
pub trait Quaternion<T>: Eq, Index<uint, T>, ToPtr<T> {
pub trait Quaternion<T>: Eq, Index<uint, T>, Neg<self>, ToPtr<T> {
pure fn dim() -> uint;
pure fn mul_t(value: T) -> self;
@ -95,6 +95,11 @@ pub impl<T:Copy Num NumCast Trig Exp Extent Ord FuzzyEq> Quat<T>: Quaternion<T>
#[inline(always)]
pure fn dim() -> uint { 4 }
#[inline(always)]
pure fn neg() -> Quat<T> {
Quat::new(-self[0], -self[1], -self[2], -self[3])
}
#[inline(always)]
pure fn mul_t(value: T) -> Quat<T> {
Quat::new(self[0] * value,
@ -263,13 +268,6 @@ pub impl<T:Copy> Quat<T>: Index<uint, T> {
}
}
pub impl<T:Copy Neg<T>> Quat<T>: Neg<Quat<T>> {
#[inline(always)]
pure fn neg() -> Quat<T> {
Quat::new(-self[0], -self[1], -self[2], -self[3])
}
}
// TODO: make work for T:Integer
pub impl<T:Copy FuzzyEq> Quat<T>: Eq {
#[inline(always)]

View file

@ -35,7 +35,7 @@ pub trait Vector<T>: Eq, Index<uint, T>, ToPtr<T> {
static pure fn dim() -> uint;
}
pub trait NumericVector<T>: Vector<T> {
pub trait NumericVector<T>: Vector<T>, Neg<self>{
pure fn mul_t(value: T) -> self;
pure fn div_t(value: T) -> self;
@ -123,6 +123,11 @@ pub impl<T> Vec2<T>: Vector<T> {
}
pub impl<T:Copy Num> Vec2<T>: NumericVector<T> {
#[inline(always)]
pure fn neg() -> Vec2<T> {
Vec2::new(-self[0], -self[1])
}
#[inline(always)]
pure fn mul_t(value: T) -> Vec2<T> {
Vec2::new(self[0] * value,
@ -189,13 +194,6 @@ pub impl<T:Copy> Vec2<T>: Index<uint, T> {
}
}
pub impl<T:Copy Neg<T>> Vec2<T>: Neg<Vec2<T>> {
#[inline(always)]
pure fn neg() -> Vec2<T> {
Vec2::new(-self[0], -self[1])
}
}
// TODO: make work for T:Integer
pub impl<T:Copy FuzzyEq> Vec2<T>: Eq {
#[inline(always)]
@ -303,6 +301,11 @@ pub impl<T> Vec3<T>: Vector<T> {
}
pub impl<T:Copy Num> Vec3<T>: NumericVector<T> {
#[inline(always)]
pure fn neg() -> Vec3<T> {
Vec3::new(-self[0], -self[1], -self[2])
}
#[inline(always)]
pure fn mul_t(value: T) -> Vec3<T> {
Vec3::new(self[0] * value,
@ -375,13 +378,6 @@ pub impl<T:Copy> Vec3<T>: Index<uint, T> {
}
}
pub impl<T:Copy Neg<T>> Vec3<T>: Neg<Vec3<T>> {
#[inline(always)]
pure fn neg() -> Vec3<T> {
Vec3::new(-self[0], -self[1], -self[2])
}
}
// TODO: make work for T:Integer
pub impl<T:Copy FuzzyEq> Vec3<T>: Eq {
#[inline(always)]
@ -489,6 +485,11 @@ pub impl<T> Vec4<T>: Vector<T> {
}
pub impl<T:Copy Num> Vec4<T>: NumericVector<T> {
#[inline(always)]
pure fn neg() -> Vec4<T> {
Vec4::new(-self[0], -self[1], -self[2], -self[3])
}
#[inline(always)]
pure fn mul_t(value: T) -> Vec4<T> {
Vec4::new(self[0] * value,
@ -567,13 +568,6 @@ pub impl<T:Copy> Vec4<T>: Index<uint, T> {
}
}
pub impl<T:Copy Neg<T>> Vec4<T>: Neg<Vec4<T>> {
#[inline(always)]
pure fn neg() -> Vec4<T> {
Vec4::new(-self[0], -self[1], -self[2], -self[3])
}
}
pub impl<T:Copy FuzzyEq> Vec4<T>: Eq {
#[inline(always)]
pure fn eq(other: &Vec4<T>) -> bool {