21
21
//! assert_eq!(Duration::new(5, 0), Duration::from_secs(5));
22
22
//! ```
23
23
24
- use fmt;
24
+ use { fmt, u64 } ;
25
25
use iter:: Sum ;
26
26
use ops:: { Add , Sub , Mul , Div , AddAssign , SubAssign , MulAssign , DivAssign } ;
27
- use { u64, u128} ;
28
27
29
28
const NANOS_PER_SEC : u32 = 1_000_000_000 ;
30
29
const NANOS_PER_MILLI : u32 = 1_000_000 ;
@@ -517,22 +516,20 @@ impl Mul<f64> for Duration {
517
516
518
517
fn mul ( self , rhs : f64 ) -> Duration {
519
518
const NPS : f64 = NANOS_PER_SEC as f64 ;
519
+ if rhs. is_sign_negative ( ) {
520
+ panic ! ( "duration can not be multiplied by negative float" ) ;
521
+ }
520
522
let nanos_f64 = rhs * ( NPS * ( self . secs as f64 ) + ( self . nanos as f64 ) ) ;
521
523
if !nanos_f64. is_finite ( ) {
522
524
panic ! ( "got non-finite value when multiplying duration by float" ) ;
523
525
}
524
- if nanos_f64 > ( u128 :: MAX as f64 ) {
526
+ if nanos_f64 > ( ( u64 :: MAX as u128 ) * ( NANOS_PER_SEC as u128 ) ) as f64 {
525
527
panic ! ( "overflow when multiplying duration by float" ) ;
526
528
} ;
527
529
let nanos_u128 = nanos_f64 as u128 ;
528
- let secs = nanos_u128 / ( NANOS_PER_SEC as u128 ) ;
529
- let nanos = nanos_u128 % ( NANOS_PER_SEC as u128 ) ;
530
- if secs > ( u64:: MAX as u128 ) {
531
- panic ! ( "overflow when multiplying duration by float" ) ;
532
- }
533
530
Duration {
534
- secs : secs as u64 ,
535
- nanos : nanos as u32 ,
531
+ secs : ( nanos_u128 / ( NANOS_PER_SEC as u128 ) ) as u64 ,
532
+ nanos : ( nanos_u128 % ( NANOS_PER_SEC as u128 ) ) as u32 ,
536
533
}
537
534
}
538
535
}
@@ -543,22 +540,20 @@ impl Mul<Duration> for f64 {
543
540
544
541
fn mul ( self , rhs : Duration ) -> Duration {
545
542
const NPS : f64 = NANOS_PER_SEC as f64 ;
543
+ if self . is_sign_negative ( ) {
544
+ panic ! ( "duration can not be multiplied by negative float" ) ;
545
+ }
546
546
let nanos_f64 = self * ( NPS * ( rhs. secs as f64 ) + ( rhs. nanos as f64 ) ) ;
547
547
if !nanos_f64. is_finite ( ) {
548
548
panic ! ( "got non-finite value when multiplying float by duration" ) ;
549
549
}
550
- if nanos_f64 > ( u128 :: MAX as f64 ) {
550
+ if nanos_f64 > ( ( u64 :: MAX as u128 ) * ( NANOS_PER_SEC as u128 ) ) as f64 {
551
551
panic ! ( "overflow when multiplying float by duration" ) ;
552
552
} ;
553
553
let nanos_u128 = nanos_f64 as u128 ;
554
- let secs = nanos_u128 / ( NANOS_PER_SEC as u128 ) ;
555
- let nanos = nanos_u128 % ( NANOS_PER_SEC as u128 ) ;
556
- if secs > ( u64:: MAX as u128 ) {
557
- panic ! ( "overflow when multiplying float by duration" ) ;
558
- }
559
554
Duration {
560
- secs : secs as u64 ,
561
- nanos : nanos as u32 ,
555
+ secs : ( nanos_u128 / ( NANOS_PER_SEC as u128 ) ) as u64 ,
556
+ nanos : ( nanos_u128 % ( NANOS_PER_SEC as u128 ) ) as u32 ,
562
557
}
563
558
}
564
559
}
@@ -592,22 +587,20 @@ impl Div<f64> for Duration {
592
587
593
588
fn div ( self , rhs : f64 ) -> Duration {
594
589
const NPS : f64 = NANOS_PER_SEC as f64 ;
590
+ if rhs. is_sign_negative ( ) {
591
+ panic ! ( "duration can not be divided by negative float" ) ;
592
+ }
595
593
let nanos_f64 = ( NPS * ( self . secs as f64 ) + ( self . nanos as f64 ) ) / rhs;
596
594
if !nanos_f64. is_finite ( ) {
597
595
panic ! ( "got non-finite value when dividing duration by float" ) ;
598
596
}
599
- if nanos_f64 > ( u128 :: MAX as f64 ) {
597
+ if nanos_f64 > ( ( u64 :: MAX as u128 ) * ( NANOS_PER_SEC as u128 ) ) as f64 {
600
598
panic ! ( "overflow when dividing duration by float" ) ;
601
599
} ;
602
600
let nanos_u128 = nanos_f64 as u128 ;
603
- let secs = nanos_u128 / ( NANOS_PER_SEC as u128 ) ;
604
- let nanos = nanos_u128 % ( NANOS_PER_SEC as u128 ) ;
605
- if secs > ( u64:: MAX as u128 ) {
606
- panic ! ( "overflow when dividing duration by float" ) ;
607
- }
608
601
Duration {
609
- secs : secs as u64 ,
610
- nanos : nanos as u32 ,
602
+ secs : ( nanos_u128 / ( NANOS_PER_SEC as u128 ) ) as u64 ,
603
+ nanos : ( nanos_u128 % ( NANOS_PER_SEC as u128 ) ) as u32 ,
611
604
}
612
605
}
613
606
}
0 commit comments