1
1
use crate :: base:: { TypedValue , ValueAsScalar } ;
2
2
3
3
use super :: { fmt, ValueType } ;
4
- use float_cmp:: approx_eq;
5
4
use std:: convert:: TryFrom ;
6
5
use std:: ops:: { Index , IndexMut } ;
7
6
7
+ #[ cfg( feature = "ordered-float" ) ]
8
+ use ordered_float:: OrderedFloat ;
9
+
10
+ #[ cfg( not( feature = "ordered-float" ) ) ]
11
+ use float_cmp:: approx_eq;
12
+
8
13
mod cmp;
9
14
mod from;
10
15
11
16
/// Static tape node
12
17
#[ derive( Debug , Clone , Copy ) ]
18
+ #[ cfg_attr( feature = "ordered-float" , derive( Eq ) ) ]
13
19
#[ cfg_attr( feature = "c-abi" , repr( C ) ) ]
14
20
#[ cfg_attr( feature = "c-abi" , derive( abi_stable:: StableAbi ) ) ]
21
+
15
22
pub enum StaticNode {
16
23
/// A signed 64 bit integer.
17
24
I64 ( i64 ) ,
@@ -24,7 +31,11 @@ pub enum StaticNode {
24
31
/// An unsigned 128 bit integer.
25
32
U128 ( u128 ) ,
26
33
/// A floating point value
34
+ #[ cfg( not( feature = "ordered-float" ) ) ]
27
35
F64 ( f64 ) ,
36
+ #[ cfg( feature = "ordered-float" ) ]
37
+ /// A floating point value, as an `OrderedFloat` (not allow for Eq)
38
+ F64 ( OrderedFloat < f64 > ) ,
28
39
/// A boolean value
29
40
Bool ( bool ) ,
30
41
/// The null value
@@ -191,7 +202,8 @@ impl ValueAsScalar for StaticNode {
191
202
#[ must_use]
192
203
fn as_f64 ( & self ) -> Option < f64 > {
193
204
match self {
194
- Self :: F64 ( i) => Some ( * i) ,
205
+ #[ allow( clippy:: useless_conversion) ] // .into() required by ordered-float
206
+ Self :: F64 ( i) => Some ( ( * i) . into ( ) ) ,
195
207
_ => None ,
196
208
}
197
209
}
@@ -202,7 +214,8 @@ impl ValueAsScalar for StaticNode {
202
214
#[ allow( clippy:: cast_precision_loss) ]
203
215
fn cast_f64 ( & self ) -> Option < f64 > {
204
216
match self {
205
- Self :: F64 ( i) => Some ( * i) ,
217
+ #[ allow( clippy:: useless_conversion) ] // .into() required by ordered-float
218
+ Self :: F64 ( i) => Some ( ( * i) . into ( ) ) ,
206
219
Self :: I64 ( i) => Some ( * i as f64 ) ,
207
220
Self :: U64 ( i) => Some ( * i as f64 ) ,
208
221
_ => None ,
@@ -214,7 +227,7 @@ impl ValueAsScalar for StaticNode {
214
227
#[ allow( clippy:: cast_precision_loss) ]
215
228
fn cast_f64 ( & self ) -> Option < f64 > {
216
229
match self {
217
- Self :: F64 ( i) => Some ( * i ) ,
230
+ Self :: F64 ( i) => Some ( ( * i ) . into ( ) ) ,
218
231
Self :: I64 ( i) => Some ( * i as f64 ) ,
219
232
Self :: U64 ( i) => Some ( * i as f64 ) ,
220
233
Self :: I128 ( i) => Some ( * i as f64 ) ,
@@ -238,7 +251,10 @@ impl fmt::Display for StaticNode {
238
251
Self :: Bool ( b) => write ! ( f, "{b}" ) ,
239
252
Self :: I64 ( n) => write ! ( f, "{n}" ) ,
240
253
Self :: U64 ( n) => write ! ( f, "{n}" ) ,
254
+ #[ cfg( not( feature = "ordered-float" ) ) ]
241
255
Self :: F64 ( n) => write ! ( f, "{n}" ) ,
256
+ #[ cfg( feature = "ordered-float" ) ]
257
+ Self :: F64 ( n) => write ! ( f, "{}" , n. 0 ) ,
242
258
}
243
259
}
244
260
#[ cfg( feature = "128bit" ) ]
@@ -248,7 +264,10 @@ impl fmt::Display for StaticNode {
248
264
Self :: Bool ( b) => write ! ( f, "{b}" ) ,
249
265
Self :: I64 ( n) => write ! ( f, "{n}" ) ,
250
266
Self :: U64 ( n) => write ! ( f, "{n}" ) ,
267
+ #[ cfg( not( feature = "ordered-float" ) ) ]
251
268
Self :: F64 ( n) => write ! ( f, "{n}" ) ,
269
+ #[ cfg( feature = "ordered-float" ) ]
270
+ Self :: F64 ( n) => write ! ( f, "{}" , n. 0 ) ,
252
271
Self :: I128 ( n) => write ! ( f, "{n}" ) ,
253
272
Self :: U128 ( n) => write ! ( f, "{n}" ) ,
254
273
}
@@ -264,7 +283,10 @@ impl PartialEq for StaticNode {
264
283
match ( self , other) {
265
284
( Self :: Null , Self :: Null ) => true ,
266
285
( Self :: Bool ( v1) , Self :: Bool ( v2) ) => v1. eq ( v2) ,
286
+ #[ cfg( not( feature = "ordered-float" ) ) ]
267
287
( Self :: F64 ( v1) , Self :: F64 ( v2) ) => approx_eq ! ( f64 , * v1, * v2) ,
288
+ #[ cfg( feature = "ordered-float" ) ]
289
+ ( Self :: F64 ( v1) , Self :: F64 ( v2) ) => v1. eq ( v2) ,
268
290
( Self :: U64 ( v1) , Self :: U64 ( v2) ) => v1. eq ( v2) ,
269
291
( Self :: I64 ( v1) , Self :: I64 ( v2) ) => v1. eq ( v2) ,
270
292
( Self :: U64 ( v1) , Self :: I64 ( v2) ) if * v2 >= 0 => ( * v2 as u64 ) . eq ( v1) ,
@@ -280,7 +302,10 @@ impl PartialEq for StaticNode {
280
302
match ( self , other) {
281
303
( Self :: Null , Self :: Null ) => true ,
282
304
( Self :: Bool ( v1) , Self :: Bool ( v2) ) => v1. eq ( v2) ,
305
+ #[ cfg( not( feature = "ordered-float" ) ) ]
283
306
( Self :: F64 ( v1) , Self :: F64 ( v2) ) => approx_eq ! ( f64 , * v1, * v2) ,
307
+ #[ cfg( feature = "ordered-float" ) ]
308
+ ( Self :: F64 ( v1) , Self :: F64 ( v2) ) => v1. eq ( v2) ,
284
309
( Self :: U64 ( v1) , Self :: U64 ( v2) ) => v1. eq ( v2) ,
285
310
( Self :: U128 ( v1) , Self :: U128 ( v2) ) => v1. eq ( v2) ,
286
311
( Self :: I64 ( v1) , Self :: I64 ( v2) ) => v1. eq ( v2) ,
0 commit comments