@@ -105,6 +105,71 @@ fn canonicalize_signed_zero<T: FloatCore>(x: T) -> T {
105105#[ repr( transparent) ]
106106pub struct OrderedFloat < T > ( pub T ) ;
107107
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+
108173#[ cfg( feature = "num-cmp" ) ]
109174mod impl_num_cmp {
110175 use super :: OrderedFloat ;
0 commit comments