From f8e92ed327bb65a78d2eb2c63baa6dbc990f429d Mon Sep 17 00:00:00 2001 From: Richard Dodd Date: Sun, 29 Apr 2018 14:21:42 +0100 Subject: [PATCH] Add is_finite to array and quaternion --- src/point.rs | 4 ++++ src/quaternion.rs | 4 ++++ src/structure.rs | 5 +++++ src/vector.rs | 11 ++++------- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/point.rs b/src/point.rs index df5a299..980d496 100644 --- a/src/point.rs +++ b/src/point.rs @@ -118,6 +118,10 @@ macro_rules! impl_point { fn product(self) -> S where S: Mul { fold_array!(mul, { $(self.$field),+ }) } + + fn is_finite(&self) -> bool where S: BaseFloat { + $(self.$field.is_finite())&&+ + } } impl $PointN { diff --git a/src/quaternion.rs b/src/quaternion.rs index fb07ae4..8723785 100644 --- a/src/quaternion.rs +++ b/src/quaternion.rs @@ -173,6 +173,10 @@ impl Quaternion { (self * scale1 + other * scale2) * Rad::sin(theta).recip() } } + + pub fn is_finite(&self) -> bool { + self.s.is_finite() && self.v.is_finite() + } } impl Zero for Quaternion { diff --git a/src/structure.rs b/src/structure.rs index d165fa1..75eadeb 100644 --- a/src/structure.rs +++ b/src/structure.rs @@ -87,6 +87,11 @@ where fn product(self) -> Self::Element where Self::Element: Mul::Element>; + + /// Whether all elements of the array are finite + fn is_finite(&self) -> bool + where + Self::Element: BaseFloat; } /// Element-wise arithmetic operations. These are supplied for pragmatic diff --git a/src/vector.rs b/src/vector.rs index 05d1ae7..b71c65e 100644 --- a/src/vector.rs +++ b/src/vector.rs @@ -118,13 +118,6 @@ macro_rules! impl_vector { $VectorN::new($($field),+) } - impl $VectorN { - /// True if all entries in the vector are finite - pub fn is_finite(&self) -> bool { - $(self.$field.is_finite())&&+ - } - } - impl $VectorN { /// Component-wise casting to another type. #[inline] @@ -170,6 +163,10 @@ macro_rules! impl_vector { fn product(self) -> S where S: Mul { fold_array!(mul, { $(self.$field),+ }) } + + fn is_finite(&self) -> bool where S: BaseFloat { + $(self.$field.is_finite())&&+ + } } impl Zero for $VectorN {