1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
use super::{construct::*}; use approx::*; impl<T: Clone, U> AbsDiffEq for Construct<T, U> where T: AbsDiffEq<Epsilon=T>, U: AbsDiffEq<Epsilon=T> { type Epsilon = T; fn default_epsilon() -> Self::Epsilon { T::default_epsilon() } fn abs_diff_eq(&self, other: &Self, epsilon: Self::Epsilon) -> bool { abs_diff_eq!(self.re_ref(), other.re_ref(), epsilon=epsilon.clone()) && abs_diff_eq!(self.im_ref(), other.im_ref(), epsilon=epsilon) } } impl<T: Clone, U> RelativeEq for Construct<T, U> where T: RelativeEq<Epsilon=T>, U: RelativeEq<Epsilon=T> { fn default_max_relative() -> Self::Epsilon { T::default_max_relative() } fn relative_eq(&self, other: &Self, epsilon: Self::Epsilon, max_relative: Self::Epsilon) -> bool { relative_eq!(self.re_ref(), other.re_ref(), epsilon=epsilon.clone(), max_relative=max_relative.clone()) && relative_eq!(self.im_ref(), other.im_ref(), epsilon=epsilon, max_relative=max_relative) } } impl<T: Clone, U> UlpsEq for Construct<T, U> where T: UlpsEq<Epsilon=T>, U: UlpsEq<Epsilon=T> { fn default_max_ulps() -> u32 { T::default_max_ulps() } fn ulps_eq(&self, other: &Self, epsilon: Self::Epsilon, max_ulps: u32) -> bool { ulps_eq!(self.re_ref(), other.re_ref(), epsilon=epsilon.clone(), max_ulps=max_ulps.clone()) && ulps_eq!(self.im_ref(), other.im_ref(), epsilon=epsilon, max_ulps=max_ulps) } }