diff --git a/src/angle.rs b/src/angle.rs index 907e694..51c560d 100644 --- a/src/angle.rs +++ b/src/angle.rs @@ -62,13 +62,11 @@ pub trait Angle where Self: ApproxEq::Unitless>, Self: Neg, - Self: Add, Self: Sub, - Self: Div::Unitless>, - Self: Rem::Unitless>, - + Self: Rem, Self: Mul<::Unitless, Output = Self>, + Self: Div::Unitless>, Self: Div<::Unitless, Output = Self>, Self: Rem<::Unitless, Output = Self>, { @@ -78,7 +76,11 @@ pub trait Angle where fn new(value: Self::Unitless) -> Self; /// Return the angle, normalized to the range `[0, full_turn)`. - fn normalize(self) -> Self; + #[inline] + fn normalize(self) -> Self { + let rem = self % Self::full_turn(); + if rem < Self::zero() { rem + Self::full_turn() } else { rem } + } /// Return the angle rotated by half a turn #[inline] @@ -135,12 +137,6 @@ macro_rules! impl_angle { $Angle::new(S::zero()) } - #[inline] - fn normalize(self) -> Self { - let tmp = self % Self::full_turn().s; - if tmp < Self::zero() { tmp + Self::full_turn() } else { tmp } - } - #[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 } @@ -182,7 +178,7 @@ macro_rules! impl_angle { fn div(lhs, rhs) -> S { lhs.s / rhs.s } }); impl_binary_operator!( Rem<$Angle > for $Angle { - fn rem(lhs, rhs) -> S { lhs.s % rhs.s } + fn rem(lhs, rhs) -> $Angle { $Angle::new(lhs.s % rhs.s) } }); impl_binary_operator!( Mul for $Angle {