Skip to content

Commit 85342ce

Browse files
committed
Add default_relative_epsilon to RelativeEq
1 parent 71c4809 commit 85342ce

File tree

4 files changed

+110
-3
lines changed

4 files changed

+110
-3
lines changed

approx-derive/src/rel_diff_eq.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ impl AbsDiffEqParser {
232232

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

237238
let (impl_generics, ty_generics, _) = self.base_type.generics().split_for_impl();
@@ -251,6 +252,10 @@ impl AbsDiffEqParser {
251252
impl #impl_generics #ApproxName::RelativeEq for #obj_name #ty_generics
252253
#where_clause
253254
{
255+
fn default_relative_epsilon() -> Self::Epsilon {
256+
<#epsilon_type as #ApproxName::RelativeEq>::default_relative_epsilon()
257+
}
258+
254259
fn default_max_relative() -> Self::Epsilon {
255260
#max_relative_default_value
256261
}
@@ -280,6 +285,10 @@ impl AbsDiffEqParser {
280285
impl #impl_generics #ApproxName::RelativeEq for #obj_name #ty_generics
281286
#where_clause
282287
{
288+
fn default_relative_epsilon() -> Self::Epsilon {
289+
<#epsilon_type as #ApproxName::RelativeEq>::default_relative_epsilon()
290+
}
291+
283292
fn default_max_relative() -> Self::Epsilon {
284293
#max_relative_default_value
285294
}

approx/src/abs_diff_eq.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ where
3939
/// The default tolerance to use when testing values that are close together.
4040
///
4141
/// This is used when no `epsilon` value is supplied to the
42-
/// [`abs_diff_eq!`](crate::abs_diff_eq), [`relative_eq!`](crate::relative_eq),
43-
/// or [`ulps_eq!`](crate::ulps_eq) macros.
42+
/// [`abs_diff_eq!`](crate::abs_diff_eq), or [`ulps_eq!`](crate::ulps_eq) macros.
4443
fn default_epsilon() -> Self::Epsilon;
4544

4645
/// A test for equality that uses the absolute difference to compute the approximate

approx/src/lib.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
//! # }
114114
//! # }
115115
//! # impl<T: RelativeEq> RelativeEq for Complex<T> where T::Epsilon: Copy {
116+
//! # fn default_relative_epsilon() -> T::Epsilon { T::default_relative_epsilon() }
116117
//! # fn default_max_relative() -> T::Epsilon { T::default_max_relative() }
117118
//! # fn relative_eq(&self, other: &Self, epsilon: T::Epsilon, max_relative: T::Epsilon)
118119
//! # -> bool {
@@ -163,6 +164,10 @@
163164
//! impl<T: RelativeEq> RelativeEq for Complex<T> where
164165
//! T::Epsilon: Copy,
165166
//! {
167+
//! fn default_relative_epsilon() -> T::Epsilon {
168+
//! T::default_relative_epsilon()
169+
//! }
170+
//!
166171
//! fn default_max_relative() -> T::Epsilon {
167172
//! T::default_max_relative()
168173
//! }
@@ -339,7 +344,7 @@ where
339344
#[inline]
340345
fn default() -> Relative<A, B> {
341346
Relative {
342-
epsilon: A::default_epsilon(),
347+
epsilon: A::default_relative_epsilon(),
343348
max_relative: A::default_max_relative(),
344349
}
345350
}

approx/src/relative_eq.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ pub trait RelativeEq<Rhs = Self>: AbsDiffEq<Rhs>
3737
where
3838
Rhs: ?Sized,
3939
{
40+
/// The default epsilon for testing values that are close to zero
41+
///
42+
/// This is used when no `epsilon` value is supplied to the
43+
/// [`relative_eq`](crate::relative_eq) macro.
44+
fn default_relative_epsilon() -> Self::Epsilon;
45+
4046
/// The default relative tolerance for testing values that are far-apart.
4147
///
4248
/// This is used when no `max_relative` value is supplied to the
@@ -67,6 +73,11 @@ where
6773
macro_rules! impl_relative_eq {
6874
($T:ident) => {
6975
impl RelativeEq for $T {
76+
#[inline]
77+
fn default_relative_epsilon() -> $T {
78+
$T::EPSILON
79+
}
80+
7081
#[inline]
7182
fn default_max_relative() -> $T {
7283
$T::EPSILON
@@ -117,6 +128,11 @@ impl_relative_eq!(f64);
117128
///////////////////////////////////////////////////////////////////////////////////////////////////
118129

119130
impl<T: RelativeEq> RelativeEq for Option<T> {
131+
#[inline]
132+
fn default_relative_epsilon() -> T::Epsilon {
133+
T::default_relative_epsilon()
134+
}
135+
120136
#[inline]
121137
fn default_max_relative() -> T::Epsilon {
122138
T::default_max_relative()
@@ -138,6 +154,11 @@ impl<T: RelativeEq> RelativeEq for Option<T> {
138154
}
139155

140156
impl<T: RelativeEq, E: RelativeEq> RelativeEq for Result<T, E> {
157+
#[inline]
158+
fn default_relative_epsilon() -> (T::Epsilon, E::Epsilon) {
159+
(T::default_relative_epsilon(), E::default_relative_epsilon())
160+
}
161+
141162
#[inline]
142163
fn default_max_relative() -> (T::Epsilon, E::Epsilon) {
143164
(T::default_max_relative(), E::default_max_relative())
@@ -159,6 +180,11 @@ impl<T: RelativeEq, E: RelativeEq> RelativeEq for Result<T, E> {
159180
}
160181

161182
impl<'a, T: RelativeEq + ?Sized> RelativeEq for &'a T {
183+
#[inline]
184+
fn default_relative_epsilon() -> T::Epsilon {
185+
T::default_relative_epsilon()
186+
}
187+
162188
#[inline]
163189
fn default_max_relative() -> T::Epsilon {
164190
T::default_max_relative()
@@ -171,6 +197,11 @@ impl<'a, T: RelativeEq + ?Sized> RelativeEq for &'a T {
171197
}
172198

173199
impl<'a, T: RelativeEq + ?Sized> RelativeEq for &'a mut T {
200+
#[inline]
201+
fn default_relative_epsilon() -> T::Epsilon {
202+
T::default_relative_epsilon()
203+
}
204+
174205
#[inline]
175206
fn default_max_relative() -> T::Epsilon {
176207
T::default_max_relative()
@@ -188,6 +219,11 @@ impl<'a, T: RelativeEq + ?Sized> RelativeEq for &'a mut T {
188219
}
189220

190221
impl<T: RelativeEq + Copy> RelativeEq for cell::Cell<T> {
222+
#[inline]
223+
fn default_relative_epsilon() -> T::Epsilon {
224+
T::default_relative_epsilon()
225+
}
226+
191227
#[inline]
192228
fn default_max_relative() -> T::Epsilon {
193229
T::default_max_relative()
@@ -205,6 +241,11 @@ impl<T: RelativeEq + Copy> RelativeEq for cell::Cell<T> {
205241
}
206242

207243
impl<T: RelativeEq + ?Sized> RelativeEq for cell::RefCell<T> {
244+
#[inline]
245+
fn default_relative_epsilon() -> T::Epsilon {
246+
T::default_relative_epsilon()
247+
}
248+
208249
#[inline]
209250
fn default_max_relative() -> T::Epsilon {
210251
T::default_max_relative()
@@ -226,6 +267,11 @@ where
226267
A: RelativeEq<B>,
227268
A::Epsilon: Clone,
228269
{
270+
#[inline]
271+
fn default_relative_epsilon() -> A::Epsilon {
272+
A::default_relative_epsilon()
273+
}
274+
229275
#[inline]
230276
fn default_max_relative() -> A::Epsilon {
231277
A::default_max_relative()
@@ -246,6 +292,11 @@ where
246292
A: RelativeEq<B>,
247293
A::Epsilon: Clone,
248294
{
295+
#[inline]
296+
fn default_relative_epsilon() -> A::Epsilon {
297+
A::default_relative_epsilon()
298+
}
299+
249300
#[inline]
250301
fn default_max_relative() -> A::Epsilon {
251302
A::default_max_relative()
@@ -266,6 +317,11 @@ where
266317
A: RelativeEq<B>,
267318
A::Epsilon: Clone,
268319
{
320+
#[inline]
321+
fn default_relative_epsilon() -> A::Epsilon {
322+
A::default_relative_epsilon()
323+
}
324+
269325
#[inline]
270326
fn default_max_relative() -> A::Epsilon {
271327
A::default_max_relative()
@@ -284,6 +340,10 @@ where
284340
macro_rules! impl_relative_eq {
285341
() => {
286342
impl RelativeEq for () {
343+
fn default_relative_epsilon() -> Self::Epsilon {
344+
()
345+
}
346+
287347
fn default_max_relative() -> Self::Epsilon {
288348
()
289349
}
@@ -305,6 +365,10 @@ macro_rules! impl_relative_eq {
305365
where
306366
$( [<T $idx>]: RelativeEq, )+
307367
{
368+
fn default_relative_epsilon() -> Self::Epsilon {
369+
($( [<T $idx>]::default_relative_epsilon(), )+)
370+
}
371+
308372
fn default_max_relative() -> Self::Epsilon {
309373
($( [<T $idx>]::default_max_relative(), )+)
310374
}
@@ -348,6 +412,11 @@ impl<T: RelativeEq> RelativeEq for Complex<T>
348412
where
349413
T::Epsilon: Clone,
350414
{
415+
#[inline]
416+
fn default_relative_epsilon() -> T::Epsilon {
417+
T::default_relative_epsilon()
418+
}
419+
351420
#[inline]
352421
fn default_max_relative() -> T::Epsilon {
353422
T::default_max_relative()
@@ -368,6 +437,11 @@ where
368437
#[cfg(feature = "ordered_float")]
369438
#[cfg_attr(docsrs, doc(cfg(feature = "ordered_float")))]
370439
impl<T: RelativeEq + Copy> RelativeEq for NotNan<T> {
440+
#[inline]
441+
fn default_relative_epsilon() -> Self::Epsilon {
442+
T::default_relative_epsilon()
443+
}
444+
371445
#[inline]
372446
fn default_max_relative() -> Self::Epsilon {
373447
T::default_max_relative()
@@ -392,6 +466,11 @@ impl<T: RelativeEq + Copy> RelativeEq for NotNan<T> {
392466
#[cfg(feature = "ordered_float")]
393467
#[cfg_attr(docsrs, doc(cfg(feature = "ordered_float")))]
394468
impl<T: RelativeEq + Float + ordered_float::FloatCore> RelativeEq<T> for NotNan<T> {
469+
#[inline]
470+
fn default_relative_epsilon() -> Self::Epsilon {
471+
T::default_relative_epsilon()
472+
}
473+
395474
#[inline]
396475
fn default_max_relative() -> Self::Epsilon {
397476
T::default_max_relative()
@@ -406,6 +485,11 @@ impl<T: RelativeEq + Float + ordered_float::FloatCore> RelativeEq<T> for NotNan<
406485
#[cfg(feature = "ordered_float")]
407486
#[cfg_attr(docsrs, doc(cfg(feature = "ordered_float")))]
408487
impl<T: RelativeEq + Float + ordered_float::FloatCore> RelativeEq for OrderedFloat<T> {
488+
#[inline]
489+
fn default_relative_epsilon() -> Self::Epsilon {
490+
T::default_relative_epsilon()
491+
}
492+
409493
#[inline]
410494
fn default_max_relative() -> Self::Epsilon {
411495
T::default_max_relative()
@@ -430,6 +514,11 @@ impl<T: RelativeEq + Float + ordered_float::FloatCore> RelativeEq for OrderedFlo
430514
#[cfg(feature = "ordered_float")]
431515
#[cfg_attr(docsrs, doc(cfg(feature = "ordered_float")))]
432516
impl<T: RelativeEq + Float + ordered_float::FloatCore> RelativeEq<T> for OrderedFloat<T> {
517+
#[inline]
518+
fn default_relative_epsilon() -> Self::Epsilon {
519+
T::default_relative_epsilon()
520+
}
521+
433522
#[inline]
434523
fn default_max_relative() -> Self::Epsilon {
435524
T::default_max_relative()
@@ -451,6 +540,11 @@ where
451540
S1: BuildHasher,
452541
S2: BuildHasher,
453542
{
543+
#[inline]
544+
fn default_relative_epsilon() -> V1::Epsilon {
545+
V1::default_relative_epsilon()
546+
}
547+
454548
#[inline]
455549
fn default_max_relative() -> V1::Epsilon {
456550
V1::default_max_relative()

0 commit comments

Comments
 (0)