From a49462426b2f8c3293a915b88439de07b740de38 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 13 Dec 2015 18:35:03 +1100 Subject: [PATCH] Remove ScalarConv trait and Angle::from --- src/angle.rs | 56 ++++++++++++++++++---------------------------------- 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/src/angle.rs b/src/angle.rs index deacd6a..c37fa75 100644 --- a/src/angle.rs +++ b/src/angle.rs @@ -43,45 +43,23 @@ pub struct Deg { pub s: S } impl From> for Deg where S: BaseFloat { #[inline] fn from(r: Rad) -> Deg { - deg(r.s * cast(180.0 / f64::consts::PI).unwrap()) + Deg::new(r.s * cast(180.0 / f64::consts::PI).unwrap()) } } impl From> for Rad where S: BaseFloat { #[inline] fn from(d: Deg) -> Rad { - rad(d.s * cast(f64::consts::PI / 180.0).unwrap()) + Rad::new(d.s * cast(f64::consts::PI / 180.0).unwrap()) } } -/// Private utility functions for converting to/from scalars -trait ScalarConv { - fn from(s: S) -> Self; - fn s<'a>(&'a self) -> &'a S; - fn mut_s<'a>(&'a mut self) -> &'a mut S; -} - -impl ScalarConv for Rad { - #[inline] fn from(s: S) -> Rad { rad(s) } - #[inline] fn s<'a>(&'a self) -> &'a S { &self.s } - #[inline] fn mut_s<'a>(&'a mut self) -> &'a mut S { &mut self.s } -} - -impl ScalarConv for Deg { - #[inline] fn from(s: S) -> Deg { deg(s) } - #[inline] fn s<'a>(&'a self) -> &'a S { &self.s } - #[inline] fn mut_s<'a>(&'a mut self) -> &'a mut S { &mut self.s } -} - /// Operations on angles. pub trait Angle where Self: Copy + Clone, Self: PartialEq + PartialOrd, // FIXME: Ugly type signatures - blocked by rust-lang/rust#24092 Self: ApproxEq::Unitless>, - Self: Into::Unitless>>, - Self: Into::Unitless>>, - Self: ScalarConv<::Unitless>, Self: fmt::Debug, Self: Neg, @@ -97,8 +75,8 @@ pub trait Angle where { type Unitless: BaseFloat; - /// Create a new angle from any other valid angle. - fn from>(theta: A) -> Self; + /// Create an angle from a unitless value. + fn new(value: Self::Unitless) -> Self; /// Return the angle, normalized to the range `[0, full_turn)`. fn normalize(self) -> Self; @@ -151,10 +129,14 @@ macro_rules! impl_angle { type Unitless = S; #[inline] - fn zero() -> $Angle { ScalarConv::from(S::zero()) } + fn new(value: S) -> $Angle { + $Angle { s: value } + } #[inline] - fn from>(theta: A) -> $Angle { theta.into() } + fn zero() -> $Angle { + $Angle::new(S::zero()) + } #[inline] fn normalize(self) -> Self { @@ -162,7 +144,7 @@ macro_rules! impl_angle { if tmp < Self::zero() { tmp + Self::full_turn() } else { tmp } } - #[inline] fn full_turn() -> $Angle { ScalarConv::from(cast($full_turn).unwrap()) } + #[inline] fn full_turn() -> $Angle { $Angle::new(cast($full_turn).unwrap()) } #[inline] fn turn_div_2() -> $Angle { let factor: S = cast(2).unwrap(); $Angle::full_turn() / factor } #[inline] fn turn_div_3() -> $Angle { let factor: S = cast(3).unwrap(); $Angle::full_turn() / factor } #[inline] fn turn_div_4() -> $Angle { let factor: S = cast(4).unwrap(); $Angle::full_turn() / factor } @@ -173,21 +155,21 @@ macro_rules! impl_angle { type Output = $Angle; #[inline] - fn neg(self) -> $Angle { ScalarConv::from(-self.s) } + fn neg(self) -> $Angle { $Angle::new(-self.s) } } impl<'a, S: BaseFloat> Neg for &'a $Angle { type Output = $Angle; #[inline] - fn neg(self) -> $Angle { ScalarConv::from(-self.s) } + fn neg(self) -> $Angle { $Angle::new(-self.s) } } impl_binary_operator!( Add<$Angle > for $Angle { - fn add(lhs, rhs) -> $Angle { ScalarConv::from(lhs.s + rhs.s) } + fn add(lhs, rhs) -> $Angle { $Angle::new(lhs.s + rhs.s) } }); impl_binary_operator!( Sub<$Angle > for $Angle { - fn sub(lhs, rhs) -> $Angle { ScalarConv::from(lhs.s - rhs.s) } + fn sub(lhs, rhs) -> $Angle { $Angle::new(lhs.s - rhs.s) } }); impl_binary_operator!( Div<$Angle > for $Angle { fn div(lhs, rhs) -> S { lhs.s / rhs.s } @@ -197,13 +179,13 @@ macro_rules! impl_angle { }); impl_binary_operator!( Mul for $Angle { - fn mul(lhs, scalar) -> $Angle { ScalarConv::from(lhs.s * scalar) } + fn mul(lhs, scalar) -> $Angle { $Angle::new(lhs.s * scalar) } }); impl_binary_operator!( Div for $Angle { - fn div(lhs, scalar) -> $Angle { ScalarConv::from(lhs.s / scalar) } + fn div(lhs, scalar) -> $Angle { $Angle::new(lhs.s / scalar) } }); impl_binary_operator!( Rem for $Angle { - fn rem(lhs, scalar) -> $Angle { ScalarConv::from(lhs.s % scalar) } + fn rem(lhs, scalar) -> $Angle { $Angle::new(lhs.s % scalar) } }); impl ApproxEq for $Angle { @@ -218,7 +200,7 @@ macro_rules! impl_angle { impl Rand for $Angle { #[inline] fn rand(rng: &mut R) -> $Angle { - ScalarConv::from(rng.gen_range(cast(-$hi).unwrap(), cast($hi).unwrap())) + $Angle::new(rng.gen_range(cast(-$hi).unwrap(), cast($hi).unwrap())) } }