File tree Expand file tree Collapse file tree 3 files changed +45
-1
lines changed Expand file tree Collapse file tree 3 files changed +45
-1
lines changed Original file line number Diff line number Diff line change @@ -16,6 +16,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
16
16
ones Swift marks as ` @Sendable ` ).
17
17
* Made some common methods in ` AppKit ` safe.
18
18
* Added missing ` NSCopying ` and ` NSMutableCopying ` zone methods.
19
+ * Added ` Eq ` and ` Ord ` implementations for ` NSNumber ` , since its
20
+ handling of floating point values allows it.
19
21
20
22
### Changed
21
23
* Moved the ` ns_string! ` macro to ` icrate::Foundation::ns_string ` . The old
Original file line number Diff line number Diff line change @@ -217,13 +217,33 @@ impl PartialEq for NSNumber {
217
217
}
218
218
}
219
219
220
+ /// Beware: This uses the Objective-C method "isEqualToNumber:", which has
221
+ /// different floating point NaN semantics than Rust!
222
+ //
223
+ // This is valid since the following pass (i.e. Objective-C says that two NaNs
224
+ // are equal):
225
+ // ```
226
+ // let nan = NSNumber::from_f32(f32::NAN);
227
+ // assert_eq!(nan, nan);
228
+ // ```
229
+ impl Eq for NSNumber { }
230
+
220
231
/// Beware: This uses the Objective-C method "compare:", which has different
221
232
/// floating point NaN semantics than Rust!
222
233
impl PartialOrd for NSNumber {
223
234
#[ doc( alias = "compare:" ) ]
224
235
fn partial_cmp ( & self , other : & Self ) -> Option < Ordering > {
236
+ Some ( self . cmp ( other) )
237
+ }
238
+ }
239
+
240
+ /// Beware: This uses the Objective-C method "compare:", which has different
241
+ /// floating point NaN semantics than Rust!
242
+ impl Ord for NSNumber {
243
+ #[ doc( alias = "compare:" ) ]
244
+ fn cmp ( & self , other : & Self ) -> Ordering {
225
245
// Use Objective-C semantics for comparison
226
- Some ( self . compare ( other) . into ( ) )
246
+ self . compare ( other) . into ( )
227
247
}
228
248
}
229
249
Original file line number Diff line number Diff line change @@ -88,6 +88,28 @@ fn equality() {
88
88
assert_ne ! ( val1, val4) ;
89
89
}
90
90
91
+ #[ test]
92
+ #[ cfg_attr( feature = "gnustep-1-7" , ignore = "GNUStep handles NaNs differently" ) ]
93
+ fn nan_equality ( ) {
94
+ let nan = NSNumber :: new_f32 ( f32:: NAN ) ;
95
+ let nan2 = NSNumber :: new_f32 ( f32:: NAN ) ;
96
+ let neg_nan = NSNumber :: new_f32 ( -f32:: NAN ) ;
97
+ assert_eq ! ( nan, nan) ;
98
+ assert_eq ! ( nan, nan2) ;
99
+ assert_eq ! ( neg_nan, neg_nan) ;
100
+ assert_eq ! ( nan, neg_nan) ;
101
+ }
102
+
103
+ // Ensure that comparisons are made on the number, and not the bits of the floating point value
104
+ #[ test]
105
+ fn float_int_equality ( ) {
106
+ let val1 = NSNumber :: new_f32 ( 1.0 ) ;
107
+ let val2 = NSNumber :: new_u32 ( 1 ) ;
108
+ let val3 = NSNumber :: new_u32 ( 1.0f32 . to_bits ( ) ) ;
109
+ assert_eq ! ( val1, val2) ;
110
+ assert_ne ! ( val1, val3) ;
111
+ }
112
+
91
113
#[ test]
92
114
#[ cfg( feature = "Foundation_NSString" ) ]
93
115
fn display_debug ( ) {
You can’t perform that action at this time.
0 commit comments