@@ -173,39 +173,87 @@ impl<T: Float> DerefMut for OrderedFloat<T> {
173173
174174impl < T : Float > Eq for OrderedFloat < T > { }
175175
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 > ;
178178
179- fn add ( self , other : Self ) -> Self {
179+ fn add ( self , other : Self ) -> Self :: Output {
180180 OrderedFloat ( self . 0 + other. 0 )
181181 }
182182}
183183
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 > ;
186186
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 {
188196 OrderedFloat ( self . 0 - other. 0 )
189197 }
190198}
191199
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 > ;
194202
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 {
196212 OrderedFloat ( self . 0 * other. 0 )
197213 }
198214}
199215
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 > ;
202218
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 {
204228 OrderedFloat ( self . 0 / other. 0 )
205229 }
206230}
207231
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 > {
209257 fn min_value ( ) -> Self {
210258 OrderedFloat ( T :: min_value ( ) )
211259 }
@@ -215,7 +263,7 @@ impl<T: Float> Bounded for OrderedFloat<T> {
215263 }
216264}
217265
218- impl < T : Float + FromStr > FromStr for OrderedFloat < T > {
266+ impl < T : FromStr > FromStr for OrderedFloat < T > {
219267 type Err = T :: Err ;
220268
221269 /// 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> {
232280 }
233281}
234282
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 > ;
237285
238- fn neg ( self ) -> Self {
286+ fn neg ( self ) -> Self :: Output {
239287 OrderedFloat ( -self . 0 )
240288 }
241289}
242290
243- impl < T : Float > Zero for OrderedFloat < T > {
291+ impl < T : Zero > Zero for OrderedFloat < T > {
244292 fn zero ( ) -> Self { OrderedFloat ( T :: zero ( ) ) }
245293
246294 fn is_zero ( & self ) -> bool { self . 0 . is_zero ( ) }
247295}
248296
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+
249405/// A wrapper around Floats providing an implementation of Ord and Hash.
250406///
251407/// A NaN value cannot be stored in this type.
0 commit comments