1
1
use num_traits:: Float ;
2
- use approx:: ApproxEq ;
2
+
3
+ use approx:: { AbsDiffEq , RelativeEq , UlpsEq } ;
3
4
4
5
use { cast, Component , Lab , LabHue , Lch , RgbHue , Xyz , Yxy } ;
5
6
use white_point:: WhitePoint ;
6
7
7
8
macro_rules! impl_eq {
8
9
( $self_ty: ident , [ $( $element: ident) ,+] ) => {
9
- impl <Wp , T > ApproxEq for $self_ty<Wp , T >
10
- where T : Component + Float + ApproxEq ,
10
+ impl <Wp , T > AbsDiffEq for $self_ty<Wp , T >
11
+ where T : Component + Float + AbsDiffEq ,
11
12
T :: Epsilon : Copy + Float ,
12
- Wp : WhitePoint
13
+ Wp : WhitePoint + PartialEq
13
14
{
14
- type Epsilon = < T as ApproxEq > :: Epsilon ;
15
+ type Epsilon = T :: Epsilon ;
15
16
16
17
fn default_epsilon( ) -> Self :: Epsilon {
17
18
T :: default_epsilon( )
18
19
}
19
- fn default_max_relative( ) -> Self :: Epsilon {
20
- T :: default_max_relative( )
20
+
21
+ fn abs_diff_eq( & self , other: & Self , epsilon: T :: Epsilon ) -> bool {
22
+ $( self . $element. abs_diff_eq( & other. $element, epsilon) ) &&+
21
23
}
22
- fn default_max_ulps ( ) -> u32 {
23
- T :: default_max_ulps ( )
24
+ fn abs_diff_ne ( & self , other : & Self , epsilon : T :: Epsilon ) -> bool {
25
+ $ ( self . $element . abs_diff_ne ( & other . $element , epsilon ) ) ||+
24
26
}
25
- fn relative_eq( & self , other: & Self , epsilon: Self :: Epsilon , max_relative: Self :: Epsilon ) -> bool {
27
+ }
28
+
29
+ impl <Wp , T > RelativeEq for $self_ty<Wp , T >
30
+ where T : Component + Float + RelativeEq ,
31
+ T :: Epsilon : Copy + Float ,
32
+ Wp : WhitePoint + PartialEq
33
+ {
34
+ fn default_max_relative( ) -> T :: Epsilon {
35
+ T :: default_max_relative( )
36
+ }
37
+
38
+ fn relative_eq( & self , other: & Self , epsilon: T :: Epsilon , max_relative: T :: Epsilon ) -> bool {
26
39
$( self . $element. relative_eq( & other. $element, epsilon, max_relative) ) &&+
27
40
}
28
- fn ulps_eq ( & self , other: & Self , epsilon: Self :: Epsilon , max_ulps : u32 ) -> bool {
29
- $( self . $element. ulps_eq ( & other. $element, epsilon, max_ulps ) ) && +
41
+ fn relative_ne ( & self , other: & Self , epsilon: T :: Epsilon , max_relative : T :: Epsilon ) -> bool {
42
+ $( self . $element. relative_ne ( & other. $element, epsilon, max_relative ) ) || +
30
43
}
44
+ }
31
45
32
- fn relative_ne( & self , other: & Self , epsilon: Self :: Epsilon , max_relative: Self :: Epsilon ) -> bool {
33
- $( self . $element. relative_ne( & other. $element, epsilon, max_relative) ) &&+
46
+ impl <Wp , T > UlpsEq for $self_ty<Wp , T >
47
+ where T : Component + Float + UlpsEq ,
48
+ T :: Epsilon : Copy + Float ,
49
+ Wp : WhitePoint + PartialEq
50
+ {
51
+ fn default_max_ulps( ) -> u32 {
52
+ T :: default_max_ulps( )
34
53
}
35
- fn ulps_ne( & self , other: & Self , epsilon: Self :: Epsilon , max_ulps: u32 ) -> bool {
36
- $( self . $element. ulps_ne( & other. $element, epsilon, max_ulps) ) &&+
54
+
55
+ fn ulps_eq( & self , other: & Self , epsilon: T :: Epsilon , max_ulps: u32 ) -> bool {
56
+ $( self . $element. ulps_eq( & other. $element, epsilon, max_ulps) ) &&+
57
+ }
58
+ fn ulps_ne( & self , other: & Self , epsilon: T :: Epsilon , max_ulps: u32 ) -> bool {
59
+ $( self . $element. ulps_ne( & other. $element, epsilon, max_ulps) ) ||+
37
60
}
38
61
}
39
62
}
@@ -54,39 +77,58 @@ impl_eq!(Lch, [l, chroma, hue]);
54
77
// ulps. Because of this we loose some precision for values close to 0.0.
55
78
macro_rules! impl_eq_hue {
56
79
( $self_ty: ident ) => {
57
- impl <T : Float + ApproxEq > ApproxEq for $self_ty<T >
58
- where < T as ApproxEq > :: Epsilon : Float
80
+ impl <T : Float + AbsDiffEq > AbsDiffEq for $self_ty<T >
81
+ where T :: Epsilon : Float
59
82
{
60
- type Epsilon = < T as ApproxEq > :: Epsilon ;
83
+ type Epsilon = T :: Epsilon ;
61
84
62
85
fn default_epsilon( ) -> Self :: Epsilon {
63
86
T :: default_epsilon( ) * cast( 180.0 )
64
87
}
88
+
89
+ fn abs_diff_eq( & self , other: & Self , epsilon: T :: Epsilon ) -> bool {
90
+ let diff: T = ( * self - * other) . to_degrees( ) ;
91
+ T :: abs_diff_eq( & diff, & T :: zero( ) , epsilon)
92
+ }
93
+ fn abs_diff_ne( & self , other: & Self , epsilon: T :: Epsilon ) -> bool {
94
+ let diff: T = ( * self - * other) . to_degrees( ) ;
95
+ T :: abs_diff_ne( & diff, & T :: zero( ) , epsilon)
96
+ }
97
+ }
98
+
99
+ impl <T : Float + RelativeEq > RelativeEq for $self_ty<T >
100
+ where T :: Epsilon : Float
101
+ {
65
102
fn default_max_relative( ) -> Self :: Epsilon {
66
103
T :: default_max_relative( ) * cast( 180.0 )
67
104
}
68
- fn default_max_ulps( ) -> u32 {
69
- T :: default_max_ulps( ) * 180
70
- }
71
- fn relative_eq( & self , other: & Self , epsilon: Self :: Epsilon , max_relative: Self :: Epsilon ) -> bool {
105
+
106
+ fn relative_eq( & self , other: & Self , epsilon: T :: Epsilon , max_relative: T :: Epsilon ) -> bool {
72
107
let diff: T = ( * self - * other) . to_degrees( ) ;
73
108
T :: relative_eq( & diff, & T :: zero( ) , epsilon, max_relative)
74
109
}
75
- fn ulps_eq ( & self , other: & Self , epsilon: Self :: Epsilon , max_ulps : u32 ) -> bool {
110
+ fn relative_ne ( & self , other: & Self , epsilon: Self :: Epsilon , max_relative : Self :: Epsilon ) -> bool {
76
111
let diff: T = ( * self - * other) . to_degrees( ) ;
77
- T :: ulps_eq ( & diff, & T :: zero( ) , epsilon, max_ulps )
112
+ T :: relative_ne ( & diff, & T :: zero( ) , epsilon, max_relative )
78
113
}
114
+ }
79
115
80
- fn relative_ne( & self , other: & Self , epsilon: Self :: Epsilon , max_relative: Self :: Epsilon ) -> bool {
116
+ impl <T : Float + UlpsEq > UlpsEq for $self_ty<T >
117
+ where T :: Epsilon : Float
118
+ {
119
+ fn default_max_ulps( ) -> u32 {
120
+ T :: default_max_ulps( ) * 180
121
+ }
122
+
123
+ fn ulps_eq( & self , other: & Self , epsilon: T :: Epsilon , max_ulps: u32 ) -> bool {
81
124
let diff: T = ( * self - * other) . to_degrees( ) ;
82
- T :: relative_ne ( & diff, & T :: zero( ) , epsilon, max_relative )
125
+ T :: ulps_eq ( & diff, & T :: zero( ) , epsilon, max_ulps )
83
126
}
84
127
fn ulps_ne( & self , other: & Self , epsilon: Self :: Epsilon , max_ulps: u32 ) -> bool {
85
128
let diff: T = ( * self - * other) . to_degrees( ) ;
86
129
T :: ulps_ne( & diff, & T :: zero( ) , epsilon, max_ulps)
87
130
}
88
131
}
89
-
90
132
}
91
133
}
92
134
0 commit comments