Implement Sum for Angle
This commit is contained in:
parent
77260934a1
commit
ff2d15e0ff
4 changed files with 40 additions and 1 deletions
15
src/angle.rs
15
src/angle.rs
|
@ -17,6 +17,7 @@
|
|||
|
||||
use std::fmt;
|
||||
use std::f64;
|
||||
use std::iter;
|
||||
use std::ops::*;
|
||||
|
||||
use rand::{Rand, Rng};
|
||||
|
@ -72,6 +73,20 @@ macro_rules! impl_angle {
|
|||
}
|
||||
}
|
||||
|
||||
impl<S: BaseFloat> iter::Sum<$Angle<S>> for $Angle<S> {
|
||||
#[inline]
|
||||
fn sum<I: Iterator<Item=$Angle<S>>>(iter: I) -> $Angle<S> {
|
||||
iter.fold($Angle::zero(), Add::add)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, S: 'a + BaseFloat> iter::Sum<&'a $Angle<S>> for $Angle<S> {
|
||||
#[inline]
|
||||
fn sum<I: Iterator<Item=&'a $Angle<S>>>(iter: I) -> $Angle<S> {
|
||||
iter.fold($Angle::zero(), Add::add)
|
||||
}
|
||||
}
|
||||
|
||||
impl<S: BaseFloat> Angle for $Angle<S> {
|
||||
type Unitless = S;
|
||||
|
||||
|
|
|
@ -551,6 +551,8 @@ pub trait Angle where
|
|||
Self: Mul<<Self as Angle>::Unitless, Output = Self>,
|
||||
Self: Div<Self, Output = <Self as Angle>::Unitless>,
|
||||
Self: Div<<Self as Angle>::Unitless, Output = Self>,
|
||||
|
||||
Self: iter::Sum,
|
||||
{
|
||||
type Unitless: BaseFloat;
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ extern crate cgmath;
|
|||
use cgmath::{Rad, Deg};
|
||||
|
||||
#[test]
|
||||
fn conv() {
|
||||
fn test_conv() {
|
||||
let angle: Rad<_> = Deg(-5.0f64).into();
|
||||
let angle: Deg<_> = angle.into();
|
||||
assert_ulps_eq!(&angle, &Deg(-5.0f64));
|
||||
|
@ -37,3 +37,23 @@ fn conv() {
|
|||
let angle: Rad<_> = angle.into();
|
||||
assert_ulps_eq!(&angle, &Rad(30.0f64));
|
||||
}
|
||||
|
||||
mod rad {
|
||||
use cgmath::Rad;
|
||||
|
||||
#[test]
|
||||
fn test_iter_sum() {
|
||||
assert_eq!(Rad(2.0) + Rad(3.0) + Rad(4.0), [Rad(2.0), Rad(3.0), Rad(4.0)].iter().sum());
|
||||
assert_eq!(Rad(2.0) + Rad(3.0) + Rad(4.0), [Rad(2.0), Rad(3.0), Rad(4.0)].iter().cloned().sum());
|
||||
}
|
||||
}
|
||||
|
||||
mod deg {
|
||||
use cgmath::Deg;
|
||||
|
||||
#[test]
|
||||
fn test_iter_sum() {
|
||||
assert_eq!(Deg(2.0) + Deg(3.0) + Deg(4.0), [Deg(2.0), Deg(3.0), Deg(4.0)].iter().sum());
|
||||
assert_eq!(Deg(2.0) + Deg(3.0) + Deg(4.0), [Deg(2.0), Deg(3.0), Deg(4.0)].iter().cloned().sum());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,6 +59,7 @@ mod operators {
|
|||
let q3 = Quaternion::from(Euler { x: Rad(1f32), y: Rad(1f32), z: Rad(2f32) });
|
||||
|
||||
assert_eq!(q1 + q2 + q3, [q1, q2, q3].iter().sum());
|
||||
assert_eq!(q1 + q2 + q3, [q1, q2, q3].iter().cloned().sum());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -68,6 +69,7 @@ mod operators {
|
|||
let q3 = Quaternion::from(Euler { x: Rad(1f32), y: Rad(1f32), z: Rad(2f32) });
|
||||
|
||||
assert_eq!(q1 * q2 * q3, [q1, q2, q3].iter().product());
|
||||
assert_eq!(q1 * q2 * q3, [q1, q2, q3].iter().cloned().product());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue