@@ -37,6 +37,12 @@ pub trait RelativeEq<Rhs = Self>: AbsDiffEq<Rhs>
3737where
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
6773macro_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
119130impl < 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
140156impl < 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
161182impl < ' 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
173199impl < ' 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
190221impl < 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
207243impl < 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
284340macro_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>
348412where
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" ) ) ) ]
370439impl < 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" ) ) ) ]
394468impl < 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" ) ) ) ]
408487impl < 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" ) ) ) ]
432516impl < 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