@@ -105,6 +105,71 @@ fn canonicalize_signed_zero<T: FloatCore>(x: T) -> T {
105
105
#[ repr( transparent) ]
106
106
pub struct OrderedFloat < T > ( pub T ) ;
107
107
108
+ #[ cfg( feature = "derive-visitor" ) ]
109
+ mod impl_derive_visitor {
110
+ use crate :: OrderedFloat ;
111
+ use derive_visitor:: { Drive , DriveMut , Event , Visitor , VisitorMut } ;
112
+
113
+ impl < T : ' static > Drive for OrderedFloat < T > {
114
+ fn drive < V : Visitor > ( & self , visitor : & mut V ) {
115
+ visitor. visit ( self , Event :: Enter ) ;
116
+ visitor. visit ( self , Event :: Exit ) ;
117
+ }
118
+ }
119
+
120
+ impl < T : ' static > DriveMut for OrderedFloat < T > {
121
+ fn drive_mut < V : VisitorMut > ( & mut self , visitor : & mut V ) {
122
+ visitor. visit ( self , Event :: Enter ) ;
123
+ visitor. visit ( self , Event :: Exit ) ;
124
+ }
125
+ }
126
+
127
+ #[ test]
128
+ pub fn test_derive_visitor ( ) {
129
+ #[ derive( Debug , Clone , PartialEq , Eq , Drive , DriveMut ) ]
130
+ pub enum Literal {
131
+ Null ,
132
+ Float ( OrderedFloat < f64 > ) ,
133
+ }
134
+
135
+ #[ derive( Visitor , VisitorMut ) ]
136
+ #[ visitor( Literal ( enter) ) ]
137
+ struct FloatExpr ( bool ) ;
138
+
139
+ impl FloatExpr {
140
+ fn enter_literal ( & mut self , lit : & Literal ) {
141
+ if let Literal :: Float ( _) = lit {
142
+ self . 0 = true ;
143
+ }
144
+ }
145
+ }
146
+
147
+ assert ! ( {
148
+ let mut visitor = FloatExpr ( false ) ;
149
+ Literal :: Null . drive( & mut visitor) ;
150
+ !visitor. 0
151
+ } ) ;
152
+
153
+ assert ! ( {
154
+ let mut visitor = FloatExpr ( false ) ;
155
+ Literal :: Null . drive_mut( & mut visitor) ;
156
+ !visitor. 0
157
+ } ) ;
158
+
159
+ assert ! ( {
160
+ let mut visitor = FloatExpr ( false ) ;
161
+ Literal :: Float ( OrderedFloat ( 0.0 ) ) . drive( & mut visitor) ;
162
+ visitor. 0
163
+ } ) ;
164
+
165
+ assert ! ( {
166
+ let mut visitor = FloatExpr ( false ) ;
167
+ Literal :: Float ( OrderedFloat ( 0.0 ) ) . drive_mut( & mut visitor) ;
168
+ visitor. 0
169
+ } ) ;
170
+ }
171
+ }
172
+
108
173
#[ cfg( feature = "num-cmp" ) ]
109
174
mod impl_num_cmp {
110
175
use super :: OrderedFloat ;
0 commit comments