Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions approx-derive/src/rel_diff_eq.rs
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ impl AbsDiffEqParser {

pub fn implement_derive_rel_diff_eq(&self) -> proc_macro2::TokenStream {
let obj_name = &self.base_type.ident();
let epsilon_type = self.get_epsilon_parent_type();
let max_relative_default_value = self.get_max_relative_default_value();

let (impl_generics, ty_generics, _) = self.base_type.generics().split_for_impl();
Expand All @@ -251,6 +252,10 @@ impl AbsDiffEqParser {
impl #impl_generics #ApproxName::RelativeEq for #obj_name #ty_generics
#where_clause
{
fn default_relative_epsilon() -> Self::Epsilon {
<#epsilon_type as #ApproxName::RelativeEq>::default_relative_epsilon()
}

fn default_max_relative() -> Self::Epsilon {
#max_relative_default_value
}
Expand Down Expand Up @@ -280,6 +285,10 @@ impl AbsDiffEqParser {
impl #impl_generics #ApproxName::RelativeEq for #obj_name #ty_generics
#where_clause
{
fn default_relative_epsilon() -> Self::Epsilon {
<#epsilon_type as #ApproxName::RelativeEq>::default_relative_epsilon()
}

fn default_max_relative() -> Self::Epsilon {
#max_relative_default_value
}
Expand Down
3 changes: 1 addition & 2 deletions approx/src/abs_diff_eq.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ where
/// The default tolerance to use when testing values that are close together.
///
/// This is used when no `epsilon` value is supplied to the
/// [`abs_diff_eq!`](crate::abs_diff_eq), [`relative_eq!`](crate::relative_eq),
/// or [`ulps_eq!`](crate::ulps_eq) macros.
/// [`abs_diff_eq!`](crate::abs_diff_eq), or [`ulps_eq!`](crate::ulps_eq) macros.
fn default_epsilon() -> Self::Epsilon;

/// A test for equality that uses the absolute difference to compute the approximate
Expand Down
7 changes: 6 additions & 1 deletion approx/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@
//! # }
//! # }
//! # impl<T: RelativeEq> RelativeEq for Complex<T> where T::Epsilon: Copy {
//! # fn default_relative_epsilon() -> T::Epsilon { T::default_relative_epsilon() }
//! # fn default_max_relative() -> T::Epsilon { T::default_max_relative() }
//! # fn relative_eq(&self, other: &Self, epsilon: T::Epsilon, max_relative: T::Epsilon)
//! # -> bool {
Expand Down Expand Up @@ -163,6 +164,10 @@
//! impl<T: RelativeEq> RelativeEq for Complex<T> where
//! T::Epsilon: Copy,
//! {
//! fn default_relative_epsilon() -> T::Epsilon {
//! T::default_relative_epsilon()
//! }
//!
//! fn default_max_relative() -> T::Epsilon {
//! T::default_max_relative()
//! }
Expand Down Expand Up @@ -339,7 +344,7 @@ where
#[inline]
fn default() -> Relative<A, B> {
Relative {
epsilon: A::default_epsilon(),
epsilon: A::default_relative_epsilon(),
max_relative: A::default_max_relative(),
}
}
Expand Down
94 changes: 94 additions & 0 deletions approx/src/relative_eq.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ pub trait RelativeEq<Rhs = Self>: AbsDiffEq<Rhs>
where
Rhs: ?Sized,
{
/// The default epsilon for testing values that are close to zero
///
/// This is used when no `epsilon` value is supplied to the
/// [`relative_eq`](crate::relative_eq) macro.
fn default_relative_epsilon() -> Self::Epsilon;

/// The default relative tolerance for testing values that are far-apart.
///
/// This is used when no `max_relative` value is supplied to the
Expand Down Expand Up @@ -67,6 +73,11 @@ where
macro_rules! impl_relative_eq {
($T:ident) => {
impl RelativeEq for $T {
#[inline]
fn default_relative_epsilon() -> $T {
$T::MIN_POSITIVE
}

#[inline]
fn default_max_relative() -> $T {
$T::EPSILON
Expand Down Expand Up @@ -117,6 +128,11 @@ impl_relative_eq!(f64);
///////////////////////////////////////////////////////////////////////////////////////////////////

impl<T: RelativeEq> RelativeEq for Option<T> {
#[inline]
fn default_relative_epsilon() -> T::Epsilon {
T::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> T::Epsilon {
T::default_max_relative()
Expand All @@ -138,6 +154,11 @@ impl<T: RelativeEq> RelativeEq for Option<T> {
}

impl<T: RelativeEq, E: RelativeEq> RelativeEq for Result<T, E> {
#[inline]
fn default_relative_epsilon() -> (T::Epsilon, E::Epsilon) {
(T::default_relative_epsilon(), E::default_relative_epsilon())
}

#[inline]
fn default_max_relative() -> (T::Epsilon, E::Epsilon) {
(T::default_max_relative(), E::default_max_relative())
Expand All @@ -159,6 +180,11 @@ impl<T: RelativeEq, E: RelativeEq> RelativeEq for Result<T, E> {
}

impl<'a, T: RelativeEq + ?Sized> RelativeEq for &'a T {
#[inline]
fn default_relative_epsilon() -> T::Epsilon {
T::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> T::Epsilon {
T::default_max_relative()
Expand All @@ -171,6 +197,11 @@ impl<'a, T: RelativeEq + ?Sized> RelativeEq for &'a T {
}

impl<'a, T: RelativeEq + ?Sized> RelativeEq for &'a mut T {
#[inline]
fn default_relative_epsilon() -> T::Epsilon {
T::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> T::Epsilon {
T::default_max_relative()
Expand All @@ -188,6 +219,11 @@ impl<'a, T: RelativeEq + ?Sized> RelativeEq for &'a mut T {
}

impl<T: RelativeEq + Copy> RelativeEq for cell::Cell<T> {
#[inline]
fn default_relative_epsilon() -> T::Epsilon {
T::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> T::Epsilon {
T::default_max_relative()
Expand All @@ -205,6 +241,11 @@ impl<T: RelativeEq + Copy> RelativeEq for cell::Cell<T> {
}

impl<T: RelativeEq + ?Sized> RelativeEq for cell::RefCell<T> {
#[inline]
fn default_relative_epsilon() -> T::Epsilon {
T::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> T::Epsilon {
T::default_max_relative()
Expand All @@ -226,6 +267,11 @@ where
A: RelativeEq<B>,
A::Epsilon: Clone,
{
#[inline]
fn default_relative_epsilon() -> A::Epsilon {
A::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> A::Epsilon {
A::default_max_relative()
Expand All @@ -246,6 +292,11 @@ where
A: RelativeEq<B>,
A::Epsilon: Clone,
{
#[inline]
fn default_relative_epsilon() -> A::Epsilon {
A::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> A::Epsilon {
A::default_max_relative()
Expand All @@ -266,6 +317,11 @@ where
A: RelativeEq<B>,
A::Epsilon: Clone,
{
#[inline]
fn default_relative_epsilon() -> A::Epsilon {
A::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> A::Epsilon {
A::default_max_relative()
Expand All @@ -284,6 +340,10 @@ where
macro_rules! impl_relative_eq {
() => {
impl RelativeEq for () {
fn default_relative_epsilon() -> Self::Epsilon {
()
}

fn default_max_relative() -> Self::Epsilon {
()
}
Expand All @@ -305,6 +365,10 @@ macro_rules! impl_relative_eq {
where
$( [<T $idx>]: RelativeEq, )+
{
fn default_relative_epsilon() -> Self::Epsilon {
($( [<T $idx>]::default_relative_epsilon(), )+)
}

fn default_max_relative() -> Self::Epsilon {
($( [<T $idx>]::default_max_relative(), )+)
}
Expand Down Expand Up @@ -348,6 +412,11 @@ impl<T: RelativeEq> RelativeEq for Complex<T>
where
T::Epsilon: Clone,
{
#[inline]
fn default_relative_epsilon() -> T::Epsilon {
T::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> T::Epsilon {
T::default_max_relative()
Expand All @@ -368,6 +437,11 @@ where
#[cfg(feature = "ordered_float")]
#[cfg_attr(docsrs, doc(cfg(feature = "ordered_float")))]
impl<T: RelativeEq + Copy> RelativeEq for NotNan<T> {
#[inline]
fn default_relative_epsilon() -> Self::Epsilon {
T::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> Self::Epsilon {
T::default_max_relative()
Expand All @@ -392,6 +466,11 @@ impl<T: RelativeEq + Copy> RelativeEq for NotNan<T> {
#[cfg(feature = "ordered_float")]
#[cfg_attr(docsrs, doc(cfg(feature = "ordered_float")))]
impl<T: RelativeEq + Float + ordered_float::FloatCore> RelativeEq<T> for NotNan<T> {
#[inline]
fn default_relative_epsilon() -> Self::Epsilon {
T::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> Self::Epsilon {
T::default_max_relative()
Expand All @@ -406,6 +485,11 @@ impl<T: RelativeEq + Float + ordered_float::FloatCore> RelativeEq<T> for NotNan<
#[cfg(feature = "ordered_float")]
#[cfg_attr(docsrs, doc(cfg(feature = "ordered_float")))]
impl<T: RelativeEq + Float + ordered_float::FloatCore> RelativeEq for OrderedFloat<T> {
#[inline]
fn default_relative_epsilon() -> Self::Epsilon {
T::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> Self::Epsilon {
T::default_max_relative()
Expand All @@ -430,6 +514,11 @@ impl<T: RelativeEq + Float + ordered_float::FloatCore> RelativeEq for OrderedFlo
#[cfg(feature = "ordered_float")]
#[cfg_attr(docsrs, doc(cfg(feature = "ordered_float")))]
impl<T: RelativeEq + Float + ordered_float::FloatCore> RelativeEq<T> for OrderedFloat<T> {
#[inline]
fn default_relative_epsilon() -> Self::Epsilon {
T::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> Self::Epsilon {
T::default_max_relative()
Expand All @@ -451,6 +540,11 @@ where
S1: BuildHasher,
S2: BuildHasher,
{
#[inline]
fn default_relative_epsilon() -> V1::Epsilon {
V1::default_relative_epsilon()
}

#[inline]
fn default_max_relative() -> V1::Epsilon {
V1::default_max_relative()
Expand Down
Loading