@@ -26,11 +26,11 @@ use core::str::FromStr;
26
26
27
27
#[ cfg( not( feature = "std" ) ) ]
28
28
use num_traits:: float:: FloatCore as Float ;
29
- #[ cfg( feature = "std" ) ]
30
- pub use num_traits:: Float ;
31
29
use num_traits:: {
32
30
AsPrimitive , Bounded , FloatConst , FromPrimitive , Num , NumCast , One , Signed , ToPrimitive , Zero ,
33
31
} ;
32
+ #[ cfg( feature = "std" ) ]
33
+ pub use num_traits:: { Float , Pow } ;
34
34
35
35
// masks for the parts of the IEEE 754 float
36
36
const SIGN_MASK : u64 = 0x8000000000000000u64 ;
@@ -345,6 +345,104 @@ impl_ordered_float_binop! {Mul, mul, MulAssign, mul_assign}
345
345
impl_ordered_float_binop ! { Div , div, DivAssign , div_assign}
346
346
impl_ordered_float_binop ! { Rem , rem, RemAssign , rem_assign}
347
347
348
+ macro_rules! impl_ordered_float_pow {
349
+ ( $inner: ty, $rhs: ty) => {
350
+ #[ cfg( feature = "std" ) ]
351
+ impl Pow <$rhs> for OrderedFloat <$inner> {
352
+ type Output = OrderedFloat <$inner>;
353
+ #[ inline]
354
+ fn pow( self , rhs: $rhs) -> OrderedFloat <$inner> {
355
+ OrderedFloat ( <$inner>:: pow( self . 0 , rhs) )
356
+ }
357
+ }
358
+
359
+ #[ cfg( feature = "std" ) ]
360
+ impl <' a> Pow <& ' a $rhs> for OrderedFloat <$inner> {
361
+ type Output = OrderedFloat <$inner>;
362
+ #[ inline]
363
+ fn pow( self , rhs: & ' a $rhs) -> OrderedFloat <$inner> {
364
+ OrderedFloat ( <$inner>:: pow( self . 0 , * rhs) )
365
+ }
366
+ }
367
+
368
+ #[ cfg( feature = "std" ) ]
369
+ impl <' a> Pow <$rhs> for & ' a OrderedFloat <$inner> {
370
+ type Output = OrderedFloat <$inner>;
371
+ #[ inline]
372
+ fn pow( self , rhs: $rhs) -> OrderedFloat <$inner> {
373
+ OrderedFloat ( <$inner>:: pow( self . 0 , rhs) )
374
+ }
375
+ }
376
+
377
+ #[ cfg( feature = "std" ) ]
378
+ impl <' a, ' b> Pow <& ' a $rhs> for & ' b OrderedFloat <$inner> {
379
+ type Output = OrderedFloat <$inner>;
380
+ #[ inline]
381
+ fn pow( self , rhs: & ' a $rhs) -> OrderedFloat <$inner> {
382
+ OrderedFloat ( <$inner>:: pow( self . 0 , * rhs) )
383
+ }
384
+ }
385
+ } ;
386
+ }
387
+
388
+ impl_ordered_float_pow ! { f32 , i8 }
389
+ impl_ordered_float_pow ! { f32 , i16 }
390
+ impl_ordered_float_pow ! { f32 , u8 }
391
+ impl_ordered_float_pow ! { f32 , u16 }
392
+ impl_ordered_float_pow ! { f32 , i32 }
393
+ impl_ordered_float_pow ! { f64 , i8 }
394
+ impl_ordered_float_pow ! { f64 , i16 }
395
+ impl_ordered_float_pow ! { f64 , u8 }
396
+ impl_ordered_float_pow ! { f64 , u16 }
397
+ impl_ordered_float_pow ! { f64 , i32 }
398
+ impl_ordered_float_pow ! { f32 , f32 }
399
+ impl_ordered_float_pow ! { f64 , f32 }
400
+ impl_ordered_float_pow ! { f64 , f64 }
401
+
402
+ macro_rules! impl_ordered_float_self_pow {
403
+ ( $base: ty, $exp: ty) => {
404
+ #[ cfg( feature = "std" ) ]
405
+ impl Pow <OrderedFloat <$exp>> for OrderedFloat <$base> {
406
+ type Output = OrderedFloat <$base>;
407
+ #[ inline]
408
+ fn pow( self , rhs: OrderedFloat <$exp>) -> OrderedFloat <$base> {
409
+ OrderedFloat ( <$base>:: pow( self . 0 , rhs. 0 ) )
410
+ }
411
+ }
412
+
413
+ #[ cfg( feature = "std" ) ]
414
+ impl <' a> Pow <& ' a OrderedFloat <$exp>> for OrderedFloat <$base> {
415
+ type Output = OrderedFloat <$base>;
416
+ #[ inline]
417
+ fn pow( self , rhs: & ' a OrderedFloat <$exp>) -> OrderedFloat <$base> {
418
+ OrderedFloat ( <$base>:: pow( self . 0 , rhs. 0 ) )
419
+ }
420
+ }
421
+
422
+ #[ cfg( feature = "std" ) ]
423
+ impl <' a> Pow <OrderedFloat <$exp>> for & ' a OrderedFloat <$base> {
424
+ type Output = OrderedFloat <$base>;
425
+ #[ inline]
426
+ fn pow( self , rhs: OrderedFloat <$exp>) -> OrderedFloat <$base> {
427
+ OrderedFloat ( <$base>:: pow( self . 0 , rhs. 0 ) )
428
+ }
429
+ }
430
+
431
+ #[ cfg( feature = "std" ) ]
432
+ impl <' a, ' b> Pow <& ' a OrderedFloat <$exp>> for & ' b OrderedFloat <$base> {
433
+ type Output = OrderedFloat <$base>;
434
+ #[ inline]
435
+ fn pow( self , rhs: & ' a OrderedFloat <$exp>) -> OrderedFloat <$base> {
436
+ OrderedFloat ( <$base>:: pow( self . 0 , rhs. 0 ) )
437
+ }
438
+ }
439
+ } ;
440
+ }
441
+
442
+ impl_ordered_float_self_pow ! { f32 , f32 }
443
+ impl_ordered_float_self_pow ! { f64 , f32 }
444
+ impl_ordered_float_self_pow ! { f64 , f64 }
445
+
348
446
/// Adds a float directly.
349
447
impl < T : Float + Sum > Sum for OrderedFloat < T > {
350
448
fn sum < I : Iterator < Item = OrderedFloat < T > > > ( iter : I ) -> Self {
@@ -1316,6 +1414,106 @@ impl_not_nan_binop! {Mul, mul, MulAssign, mul_assign}
1316
1414
impl_not_nan_binop ! { Div , div, DivAssign , div_assign}
1317
1415
impl_not_nan_binop ! { Rem , rem, RemAssign , rem_assign}
1318
1416
1417
+ // Will panic if NaN value is return from the operation
1418
+ macro_rules! impl_not_nan_pow {
1419
+ ( $inner: ty, $rhs: ty) => {
1420
+ #[ cfg( feature = "std" ) ]
1421
+ impl Pow <$rhs> for NotNan <$inner> {
1422
+ type Output = NotNan <$inner>;
1423
+ #[ inline]
1424
+ fn pow( self , rhs: $rhs) -> NotNan <$inner> {
1425
+ NotNan :: new( <$inner>:: pow( self . 0 , rhs) ) . expect( "Pow resulted in NaN" )
1426
+ }
1427
+ }
1428
+
1429
+ #[ cfg( feature = "std" ) ]
1430
+ impl <' a> Pow <& ' a $rhs> for NotNan <$inner> {
1431
+ type Output = NotNan <$inner>;
1432
+ #[ inline]
1433
+ fn pow( self , rhs: & ' a $rhs) -> NotNan <$inner> {
1434
+ NotNan :: new( <$inner>:: pow( self . 0 , * rhs) ) . expect( "Pow resulted in NaN" )
1435
+ }
1436
+ }
1437
+
1438
+ #[ cfg( feature = "std" ) ]
1439
+ impl <' a> Pow <$rhs> for & ' a NotNan <$inner> {
1440
+ type Output = NotNan <$inner>;
1441
+ #[ inline]
1442
+ fn pow( self , rhs: $rhs) -> NotNan <$inner> {
1443
+ NotNan :: new( <$inner>:: pow( self . 0 , rhs) ) . expect( "Pow resulted in NaN" )
1444
+ }
1445
+ }
1446
+
1447
+ #[ cfg( feature = "std" ) ]
1448
+ impl <' a, ' b> Pow <& ' a $rhs> for & ' b NotNan <$inner> {
1449
+ type Output = NotNan <$inner>;
1450
+ #[ inline]
1451
+ fn pow( self , rhs: & ' a $rhs) -> NotNan <$inner> {
1452
+ NotNan :: new( <$inner>:: pow( self . 0 , * rhs) ) . expect( "Pow resulted in NaN" )
1453
+ }
1454
+ }
1455
+ } ;
1456
+ }
1457
+
1458
+ impl_not_nan_pow ! { f32 , i8 }
1459
+ impl_not_nan_pow ! { f32 , i16 }
1460
+ impl_not_nan_pow ! { f32 , u8 }
1461
+ impl_not_nan_pow ! { f32 , u16 }
1462
+ impl_not_nan_pow ! { f32 , i32 }
1463
+ impl_not_nan_pow ! { f64 , i8 }
1464
+ impl_not_nan_pow ! { f64 , i16 }
1465
+ impl_not_nan_pow ! { f64 , u8 }
1466
+ impl_not_nan_pow ! { f64 , u16 }
1467
+ impl_not_nan_pow ! { f64 , i32 }
1468
+ impl_not_nan_pow ! { f32 , f32 }
1469
+ impl_not_nan_pow ! { f64 , f32 }
1470
+ impl_not_nan_pow ! { f64 , f64 }
1471
+
1472
+ // This also should panic on NaN
1473
+ macro_rules! impl_not_nan_self_pow {
1474
+ ( $base: ty, $exp: ty) => {
1475
+ #[ cfg( feature = "std" ) ]
1476
+ impl Pow <NotNan <$exp>> for NotNan <$base> {
1477
+ type Output = NotNan <$base>;
1478
+ #[ inline]
1479
+ fn pow( self , rhs: NotNan <$exp>) -> NotNan <$base> {
1480
+ NotNan :: new( self . 0 . pow( rhs. 0 ) ) . expect( "Pow resulted in NaN" )
1481
+ }
1482
+ }
1483
+
1484
+ #[ cfg( feature = "std" ) ]
1485
+ impl <' a> Pow <& ' a NotNan <$exp>> for NotNan <$base> {
1486
+ type Output = NotNan <$base>;
1487
+ #[ inline]
1488
+ fn pow( self , rhs: & ' a NotNan <$exp>) -> NotNan <$base> {
1489
+ NotNan :: new( self . 0 . pow( rhs. 0 ) ) . expect( "Pow resulted in NaN" )
1490
+ }
1491
+ }
1492
+
1493
+ #[ cfg( feature = "std" ) ]
1494
+ impl <' a> Pow <NotNan <$exp>> for & ' a NotNan <$base> {
1495
+ type Output = NotNan <$base>;
1496
+ #[ inline]
1497
+ fn pow( self , rhs: NotNan <$exp>) -> NotNan <$base> {
1498
+ NotNan :: new( self . 0 . pow( rhs. 0 ) ) . expect( "Pow resulted in NaN" )
1499
+ }
1500
+ }
1501
+
1502
+ #[ cfg( feature = "std" ) ]
1503
+ impl <' a, ' b> Pow <& ' a NotNan <$exp>> for & ' b NotNan <$base> {
1504
+ type Output = NotNan <$base>;
1505
+ #[ inline]
1506
+ fn pow( self , rhs: & ' a NotNan <$exp>) -> NotNan <$base> {
1507
+ NotNan :: new( self . 0 . pow( rhs. 0 ) ) . expect( "Pow resulted in NaN" )
1508
+ }
1509
+ }
1510
+ } ;
1511
+ }
1512
+
1513
+ impl_not_nan_self_pow ! { f32 , f32 }
1514
+ impl_not_nan_self_pow ! { f64 , f32 }
1515
+ impl_not_nan_self_pow ! { f64 , f64 }
1516
+
1319
1517
impl < T : Float > Neg for NotNan < T > {
1320
1518
type Output = Self ;
1321
1519
0 commit comments