@@ -173,39 +173,87 @@ impl<T: Float> DerefMut for OrderedFloat<T> {
173
173
174
174
impl < T : Float > Eq for OrderedFloat < T > { }
175
175
176
- impl < T : Float > Add for OrderedFloat < T > {
177
- type Output = Self ;
176
+ impl < T : Add > Add for OrderedFloat < T > {
177
+ type Output = OrderedFloat < T :: Output > ;
178
178
179
- fn add ( self , other : Self ) -> Self {
179
+ fn add ( self , other : Self ) -> Self :: Output {
180
180
OrderedFloat ( self . 0 + other. 0 )
181
181
}
182
182
}
183
183
184
- impl < T : Float > Sub for OrderedFloat < T > {
185
- type Output = Self ;
184
+ impl < T : Add > Add < T > for OrderedFloat < T > {
185
+ type Output = OrderedFloat < T :: Output > ;
186
186
187
- fn sub ( self , other : Self ) -> Self {
187
+ fn add ( self , other : T ) -> Self :: Output {
188
+ OrderedFloat ( self . 0 + other)
189
+ }
190
+ }
191
+
192
+ impl < T : Sub > Sub for OrderedFloat < T > {
193
+ type Output = OrderedFloat < T :: Output > ;
194
+
195
+ fn sub ( self , other : Self ) -> Self :: Output {
188
196
OrderedFloat ( self . 0 - other. 0 )
189
197
}
190
198
}
191
199
192
- impl < T : Float > Mul for OrderedFloat < T > {
193
- type Output = Self ;
200
+ impl < T : Sub > Sub < T > for OrderedFloat < T > {
201
+ type Output = OrderedFloat < T :: Output > ;
194
202
195
- fn mul ( self , other : Self ) -> Self {
203
+ fn sub ( self , other : T ) -> Self :: Output {
204
+ OrderedFloat ( self . 0 - other)
205
+ }
206
+ }
207
+
208
+ impl < T : Mul > Mul for OrderedFloat < T > {
209
+ type Output = OrderedFloat < T :: Output > ;
210
+
211
+ fn mul ( self , other : Self ) -> Self :: Output {
196
212
OrderedFloat ( self . 0 * other. 0 )
197
213
}
198
214
}
199
215
200
- impl < T : Float > Div for OrderedFloat < T > {
201
- type Output = Self ;
216
+ impl < T : Mul > Mul < T > for OrderedFloat < T > {
217
+ type Output = OrderedFloat < T :: Output > ;
202
218
203
- fn div ( self , other : Self ) -> Self {
219
+ fn mul ( self , other : T ) -> Self :: Output {
220
+ OrderedFloat ( self . 0 * other)
221
+ }
222
+ }
223
+
224
+ impl < T : Div > Div for OrderedFloat < T > {
225
+ type Output = OrderedFloat < T :: Output > ;
226
+
227
+ fn div ( self , other : Self ) -> Self :: Output {
204
228
OrderedFloat ( self . 0 / other. 0 )
205
229
}
206
230
}
207
231
208
- impl < T : Float > Bounded for OrderedFloat < T > {
232
+ impl < T : Div > Div < T > for OrderedFloat < T > {
233
+ type Output = OrderedFloat < T :: Output > ;
234
+
235
+ fn div ( self , other : T ) -> Self :: Output {
236
+ OrderedFloat ( self . 0 / other)
237
+ }
238
+ }
239
+
240
+ impl < T : Rem > Rem for OrderedFloat < T > {
241
+ type Output = OrderedFloat < T :: Output > ;
242
+
243
+ fn rem ( self , other : Self ) -> Self :: Output {
244
+ OrderedFloat ( self . 0 % other. 0 )
245
+ }
246
+ }
247
+
248
+ impl < T : Rem > Rem < T > for OrderedFloat < T > {
249
+ type Output = OrderedFloat < T :: Output > ;
250
+
251
+ fn rem ( self , other : T ) -> Self :: Output {
252
+ OrderedFloat ( self . 0 % other)
253
+ }
254
+ }
255
+
256
+ impl < T : Bounded > Bounded for OrderedFloat < T > {
209
257
fn min_value ( ) -> Self {
210
258
OrderedFloat ( T :: min_value ( ) )
211
259
}
@@ -215,7 +263,7 @@ impl<T: Float> Bounded for OrderedFloat<T> {
215
263
}
216
264
}
217
265
218
- impl < T : Float + FromStr > FromStr for OrderedFloat < T > {
266
+ impl < T : FromStr > FromStr for OrderedFloat < T > {
219
267
type Err = T :: Err ;
220
268
221
269
/// Convert a &str to `OrderedFloat`. Returns an error if the string fails to parse.
@@ -232,20 +280,128 @@ impl<T: Float + FromStr> FromStr for OrderedFloat<T> {
232
280
}
233
281
}
234
282
235
- impl < T : Float > Neg for OrderedFloat < T > {
236
- type Output = Self ;
283
+ impl < T : Neg > Neg for OrderedFloat < T > {
284
+ type Output = OrderedFloat < T :: Output > ;
237
285
238
- fn neg ( self ) -> Self {
286
+ fn neg ( self ) -> Self :: Output {
239
287
OrderedFloat ( -self . 0 )
240
288
}
241
289
}
242
290
243
- impl < T : Float > Zero for OrderedFloat < T > {
291
+ impl < T : Zero > Zero for OrderedFloat < T > {
244
292
fn zero ( ) -> Self { OrderedFloat ( T :: zero ( ) ) }
245
293
246
294
fn is_zero ( & self ) -> bool { self . 0 . is_zero ( ) }
247
295
}
248
296
297
+ impl < T : One > One for OrderedFloat < T > {
298
+ fn one ( ) -> Self { OrderedFloat ( T :: one ( ) ) }
299
+ }
300
+
301
+ impl < T : NumCast > NumCast for OrderedFloat < T > {
302
+ fn from < F : ToPrimitive > ( n : F ) -> Option < Self > {
303
+ T :: from ( n) . map ( OrderedFloat )
304
+ }
305
+ }
306
+
307
+ impl < T : FromPrimitive > FromPrimitive for OrderedFloat < T > {
308
+ fn from_i64 ( n : i64 ) -> Option < Self > { T :: from_i64 ( n) . map ( OrderedFloat ) }
309
+ fn from_u64 ( n : u64 ) -> Option < Self > { T :: from_u64 ( n) . map ( OrderedFloat ) }
310
+ fn from_isize ( n : isize ) -> Option < Self > { T :: from_isize ( n) . map ( OrderedFloat ) }
311
+ fn from_i8 ( n : i8 ) -> Option < Self > { T :: from_i8 ( n) . map ( OrderedFloat ) }
312
+ fn from_i16 ( n : i16 ) -> Option < Self > { T :: from_i16 ( n) . map ( OrderedFloat ) }
313
+ fn from_i32 ( n : i32 ) -> Option < Self > { T :: from_i32 ( n) . map ( OrderedFloat ) }
314
+ fn from_usize ( n : usize ) -> Option < Self > { T :: from_usize ( n) . map ( OrderedFloat ) }
315
+ fn from_u8 ( n : u8 ) -> Option < Self > { T :: from_u8 ( n) . map ( OrderedFloat ) }
316
+ fn from_u16 ( n : u16 ) -> Option < Self > { T :: from_u16 ( n) . map ( OrderedFloat ) }
317
+ fn from_u32 ( n : u32 ) -> Option < Self > { T :: from_u32 ( n) . map ( OrderedFloat ) }
318
+ fn from_f32 ( n : f32 ) -> Option < Self > { T :: from_f32 ( n) . map ( OrderedFloat ) }
319
+ fn from_f64 ( n : f64 ) -> Option < Self > { T :: from_f64 ( n) . map ( OrderedFloat ) }
320
+ }
321
+
322
+ impl < T : ToPrimitive > ToPrimitive for OrderedFloat < T > {
323
+ fn to_i64 ( & self ) -> Option < i64 > { self . 0 . to_i64 ( ) }
324
+ fn to_u64 ( & self ) -> Option < u64 > { self . 0 . to_u64 ( ) }
325
+ fn to_isize ( & self ) -> Option < isize > { self . 0 . to_isize ( ) }
326
+ fn to_i8 ( & self ) -> Option < i8 > { self . 0 . to_i8 ( ) }
327
+ fn to_i16 ( & self ) -> Option < i16 > { self . 0 . to_i16 ( ) }
328
+ fn to_i32 ( & self ) -> Option < i32 > { self . 0 . to_i32 ( ) }
329
+ fn to_usize ( & self ) -> Option < usize > { self . 0 . to_usize ( ) }
330
+ fn to_u8 ( & self ) -> Option < u8 > { self . 0 . to_u8 ( ) }
331
+ fn to_u16 ( & self ) -> Option < u16 > { self . 0 . to_u16 ( ) }
332
+ fn to_u32 ( & self ) -> Option < u32 > { self . 0 . to_u32 ( ) }
333
+ fn to_f32 ( & self ) -> Option < f32 > { self . 0 . to_f32 ( ) }
334
+ fn to_f64 ( & self ) -> Option < f64 > { self . 0 . to_f64 ( ) }
335
+ }
336
+
337
+ impl < T : Float > Float for OrderedFloat < T > {
338
+ fn nan ( ) -> Self { OrderedFloat ( T :: nan ( ) ) }
339
+ fn infinity ( ) -> Self { OrderedFloat ( T :: infinity ( ) ) }
340
+ fn neg_infinity ( ) -> Self { OrderedFloat ( T :: neg_infinity ( ) ) }
341
+ fn neg_zero ( ) -> Self { OrderedFloat ( T :: neg_zero ( ) ) }
342
+ fn min_value ( ) -> Self { OrderedFloat ( T :: min_value ( ) ) }
343
+ fn min_positive_value ( ) -> Self { OrderedFloat ( T :: min_positive_value ( ) ) }
344
+ fn max_value ( ) -> Self { OrderedFloat ( T :: max_value ( ) ) }
345
+ fn is_nan ( self ) -> bool { self . 0 . is_nan ( ) }
346
+ fn is_infinite ( self ) -> bool { self . 0 . is_infinite ( ) }
347
+ fn is_finite ( self ) -> bool { self . 0 . is_finite ( ) }
348
+ fn is_normal ( self ) -> bool { self . 0 . is_normal ( ) }
349
+ fn classify ( self ) -> std:: num:: FpCategory { self . 0 . classify ( ) }
350
+ fn floor ( self ) -> Self { OrderedFloat ( self . 0 . floor ( ) ) }
351
+ fn ceil ( self ) -> Self { OrderedFloat ( self . 0 . ceil ( ) ) }
352
+ fn round ( self ) -> Self { OrderedFloat ( self . 0 . round ( ) ) }
353
+ fn trunc ( self ) -> Self { OrderedFloat ( self . 0 . trunc ( ) ) }
354
+ fn fract ( self ) -> Self { OrderedFloat ( self . 0 . fract ( ) ) }
355
+ fn abs ( self ) -> Self { OrderedFloat ( self . 0 . abs ( ) ) }
356
+ fn signum ( self ) -> Self { OrderedFloat ( self . 0 . signum ( ) ) }
357
+ fn is_sign_positive ( self ) -> bool { self . 0 . is_sign_positive ( ) }
358
+ fn is_sign_negative ( self ) -> bool { self . 0 . is_sign_negative ( ) }
359
+ fn mul_add ( self , a : Self , b : Self ) -> Self { OrderedFloat ( self . 0 . mul_add ( a. 0 , b. 0 ) ) }
360
+ fn recip ( self ) -> Self { OrderedFloat ( self . 0 . recip ( ) ) }
361
+ fn powi ( self , n : i32 ) -> Self { OrderedFloat ( self . 0 . powi ( n) ) }
362
+ fn powf ( self , n : Self ) -> Self { OrderedFloat ( self . 0 . powf ( n. 0 ) ) }
363
+ fn sqrt ( self ) -> Self { OrderedFloat ( self . 0 . sqrt ( ) ) }
364
+ fn exp ( self ) -> Self { OrderedFloat ( self . 0 . exp ( ) ) }
365
+ fn exp2 ( self ) -> Self { OrderedFloat ( self . 0 . exp2 ( ) ) }
366
+ fn ln ( self ) -> Self { OrderedFloat ( self . 0 . ln ( ) ) }
367
+ fn log ( self , base : Self ) -> Self { OrderedFloat ( self . 0 . log ( base. 0 ) ) }
368
+ fn log2 ( self ) -> Self { OrderedFloat ( self . 0 . log2 ( ) ) }
369
+ fn log10 ( self ) -> Self { OrderedFloat ( self . 0 . log10 ( ) ) }
370
+ fn max ( self , other : Self ) -> Self { OrderedFloat ( self . 0 . max ( other. 0 ) ) }
371
+ fn min ( self , other : Self ) -> Self { OrderedFloat ( self . 0 . min ( other. 0 ) ) }
372
+ fn abs_sub ( self , other : Self ) -> Self { OrderedFloat ( self . 0 . abs_sub ( other. 0 ) ) }
373
+ fn cbrt ( self ) -> Self { OrderedFloat ( self . 0 . cbrt ( ) ) }
374
+ fn hypot ( self , other : Self ) -> Self { OrderedFloat ( self . 0 . hypot ( other. 0 ) ) }
375
+ fn sin ( self ) -> Self { OrderedFloat ( self . 0 . sin ( ) ) }
376
+ fn cos ( self ) -> Self { OrderedFloat ( self . 0 . cos ( ) ) }
377
+ fn tan ( self ) -> Self { OrderedFloat ( self . 0 . tan ( ) ) }
378
+ fn asin ( self ) -> Self { OrderedFloat ( self . 0 . asin ( ) ) }
379
+ fn acos ( self ) -> Self { OrderedFloat ( self . 0 . acos ( ) ) }
380
+ fn atan ( self ) -> Self { OrderedFloat ( self . 0 . atan ( ) ) }
381
+ fn atan2 ( self , other : Self ) -> Self { OrderedFloat ( self . 0 . atan2 ( other. 0 ) ) }
382
+ fn sin_cos ( self ) -> ( Self , Self ) {
383
+ let ( a, b) = self . 0 . sin_cos ( ) ;
384
+ ( OrderedFloat ( a) , OrderedFloat ( b) )
385
+ }
386
+ fn exp_m1 ( self ) -> Self { OrderedFloat ( self . 0 . exp_m1 ( ) ) }
387
+ fn ln_1p ( self ) -> Self { OrderedFloat ( self . 0 . ln_1p ( ) ) }
388
+ fn sinh ( self ) -> Self { OrderedFloat ( self . 0 . sinh ( ) ) }
389
+ fn cosh ( self ) -> Self { OrderedFloat ( self . 0 . cosh ( ) ) }
390
+ fn tanh ( self ) -> Self { OrderedFloat ( self . 0 . tanh ( ) ) }
391
+ fn asinh ( self ) -> Self { OrderedFloat ( self . 0 . asinh ( ) ) }
392
+ fn acosh ( self ) -> Self { OrderedFloat ( self . 0 . acosh ( ) ) }
393
+ fn atanh ( self ) -> Self { OrderedFloat ( self . 0 . atanh ( ) ) }
394
+ fn integer_decode ( self ) -> ( u64 , i16 , i8 ) { self . 0 . integer_decode ( ) }
395
+ }
396
+
397
+
398
+ impl < T : Float + Num > Num for OrderedFloat < T > {
399
+ type FromStrRadixErr = T :: FromStrRadixErr ;
400
+ fn from_str_radix ( str : & str , radix : u32 ) -> Result < Self , Self :: FromStrRadixErr > {
401
+ T :: from_str_radix ( str, radix) . map ( OrderedFloat )
402
+ }
403
+ }
404
+
249
405
/// A wrapper around Floats providing an implementation of Ord and Hash.
250
406
///
251
407
/// A NaN value cannot be stored in this type.
0 commit comments