1
- extern crate cast;
2
- extern crate rand;
3
-
1
+ use rand:: seq:: SliceRandom ;
2
+ use rand:: Rng ;
4
3
use std:: collections:: HashMap ;
5
4
use std:: fmt;
6
5
use std:: fmt:: Write as FmtWrite ;
@@ -10,9 +9,6 @@ use std::io::Write;
10
9
use std:: path:: PathBuf ;
11
10
use std:: { env, mem} ;
12
11
13
- use self :: cast:: { f32, f64, i128, i32, i64, u128, u32, u64} ;
14
- use self :: rand:: Rng ;
15
-
16
12
const NTESTS : usize = 1_000 ;
17
13
18
14
fn main ( ) {
@@ -397,7 +393,7 @@ fn main() {
397
393
if a. 0 . is_nan ( ) {
398
394
return None ;
399
395
}
400
- Some ( f64 ( a. 0 ) )
396
+ Some ( f64:: from ( a. 0 ) )
401
397
} ,
402
398
"builtins::float::extend::__extendsfdf2(a)" ,
403
399
) ;
@@ -407,100 +403,100 @@ fn main() {
407
403
if a. 0 . is_nan ( ) {
408
404
return None ;
409
405
}
410
- Some ( f64 ( a. 0 ) )
406
+ Some ( f64:: from ( a. 0 ) )
411
407
} ,
412
408
"builtins::float::extend::__extendsfdf2vfp(a)" ,
413
409
) ;
414
410
}
415
411
416
412
// float/conv.rs
417
413
gen (
418
- |a : MyF64 | i64 ( a. 0 ) . ok ( ) ,
414
+ |a : MyF64 | i64:: cast ( a. 0 ) ,
419
415
"builtins::float::conv::__fixdfdi(a)" ,
420
416
) ;
421
417
gen (
422
- |a : MyF64 | i32 ( a. 0 ) . ok ( ) ,
418
+ |a : MyF64 | i32:: cast ( a. 0 ) ,
423
419
"builtins::float::conv::__fixdfsi(a)" ,
424
420
) ;
425
421
gen (
426
- |a : MyF32 | i64 ( a. 0 ) . ok ( ) ,
422
+ |a : MyF32 | i64:: cast ( a. 0 ) ,
427
423
"builtins::float::conv::__fixsfdi(a)" ,
428
424
) ;
429
425
gen (
430
- |a : MyF32 | i32 ( a. 0 ) . ok ( ) ,
426
+ |a : MyF32 | i32:: cast ( a. 0 ) ,
431
427
"builtins::float::conv::__fixsfsi(a)" ,
432
428
) ;
433
429
gen (
434
- |a : MyF32 | i128 ( a. 0 ) . ok ( ) ,
430
+ |a : MyF32 | i128:: cast ( a. 0 ) ,
435
431
"builtins::float::conv::__fixsfti(a)" ,
436
432
) ;
437
433
gen (
438
- |a : MyF64 | i128 ( a. 0 ) . ok ( ) ,
434
+ |a : MyF64 | i128:: cast ( a. 0 ) ,
439
435
"builtins::float::conv::__fixdfti(a)" ,
440
436
) ;
441
437
gen (
442
- |a : MyF64 | u64 ( a. 0 ) . ok ( ) ,
438
+ |a : MyF64 | u64:: cast ( a. 0 ) ,
443
439
"builtins::float::conv::__fixunsdfdi(a)" ,
444
440
) ;
445
441
gen (
446
- |a : MyF64 | u32 ( a. 0 ) . ok ( ) ,
442
+ |a : MyF64 | u32:: cast ( a. 0 ) ,
447
443
"builtins::float::conv::__fixunsdfsi(a)" ,
448
444
) ;
449
445
gen (
450
- |a : MyF32 | u64 ( a. 0 ) . ok ( ) ,
446
+ |a : MyF32 | u64:: cast ( a. 0 ) ,
451
447
"builtins::float::conv::__fixunssfdi(a)" ,
452
448
) ;
453
449
gen (
454
- |a : MyF32 | u32 ( a. 0 ) . ok ( ) ,
450
+ |a : MyF32 | u32:: cast ( a. 0 ) ,
455
451
"builtins::float::conv::__fixunssfsi(a)" ,
456
452
) ;
457
453
gen (
458
- |a : MyF32 | u128 ( a. 0 ) . ok ( ) ,
454
+ |a : MyF32 | u128:: cast ( a. 0 ) ,
459
455
"builtins::float::conv::__fixunssfti(a)" ,
460
456
) ;
461
457
gen (
462
- |a : MyF64 | u128 ( a. 0 ) . ok ( ) ,
458
+ |a : MyF64 | u128:: cast ( a. 0 ) ,
463
459
"builtins::float::conv::__fixunsdfti(a)" ,
464
460
) ;
465
461
gen (
466
- |a : MyI64 | Some ( f64 ( a. 0 ) ) ,
462
+ |a : MyI64 | Some ( a. 0 as f64 ) ,
467
463
"builtins::float::conv::__floatdidf(a)" ,
468
464
) ;
469
465
gen (
470
- |a : MyI32 | Some ( f64 ( a. 0 ) ) ,
466
+ |a : MyI32 | Some ( a. 0 as f64 ) ,
471
467
"builtins::float::conv::__floatsidf(a)" ,
472
468
) ;
473
469
gen (
474
- |a : MyI32 | Some ( f32 ( a. 0 ) ) ,
470
+ |a : MyI32 | Some ( a. 0 as f32 ) ,
475
471
"builtins::float::conv::__floatsisf(a)" ,
476
472
) ;
477
473
gen (
478
- |a : MyU64 | Some ( f64 ( a. 0 ) ) ,
474
+ |a : MyU64 | Some ( a. 0 as f64 ) ,
479
475
"builtins::float::conv::__floatundidf(a)" ,
480
476
) ;
481
477
gen (
482
- |a : MyU32 | Some ( f64 ( a. 0 ) ) ,
478
+ |a : MyU32 | Some ( a. 0 as f64 ) ,
483
479
"builtins::float::conv::__floatunsidf(a)" ,
484
480
) ;
485
481
gen (
486
- |a : MyU32 | Some ( f32 ( a. 0 ) ) ,
482
+ |a : MyU32 | Some ( a. 0 as f32 ) ,
487
483
"builtins::float::conv::__floatunsisf(a)" ,
488
484
) ;
489
485
gen (
490
- |a : MyU128 | f32 ( a. 0 ) . ok ( ) ,
486
+ |a : MyU128 | Some ( a. 0 as f32 ) ,
491
487
"builtins::float::conv::__floatuntisf(a)" ,
492
488
) ;
493
489
if !target_arch_mips {
494
490
gen (
495
- |a : MyI128 | Some ( f32 ( a. 0 ) ) ,
491
+ |a : MyI128 | Some ( a. 0 as f32 ) ,
496
492
"builtins::float::conv::__floattisf(a)" ,
497
493
) ;
498
494
gen (
499
- |a : MyI128 | Some ( f64 ( a. 0 ) ) ,
495
+ |a : MyI128 | Some ( a. 0 as f64 ) ,
500
496
"builtins::float::conv::__floattidf(a)" ,
501
497
) ;
502
498
gen (
503
- |a : MyU128 | Some ( f64 ( a. 0 ) ) ,
499
+ |a : MyU128 | Some ( a. 0 as f64 ) ,
504
500
"builtins::float::conv::__floatuntidf(a)" ,
505
501
) ;
506
502
}
@@ -996,7 +992,7 @@ macro_rules! gen_float {
996
992
$significand_bits: expr) => {
997
993
pub fn $name<R >( rng: & mut R ) -> $fty
998
994
where
999
- R : Rng ,
995
+ R : Rng + ? Sized ,
1000
996
{
1001
997
const BITS : u8 = $bits;
1002
998
const SIGNIFICAND_BITS : u8 = $significand_bits;
@@ -1015,9 +1011,9 @@ macro_rules! gen_float {
1015
1011
}
1016
1012
}
1017
1013
1018
- if rng. gen_weighted_bool ( 10 ) {
1014
+ if rng. gen_range ( 0 , 10 ) == 1 {
1019
1015
// Special values
1020
- * rng . choose ( & [
1016
+ * [
1021
1017
-0.0 ,
1022
1018
0.0 ,
1023
1019
:: std:: $fty:: MIN ,
@@ -1026,9 +1022,10 @@ macro_rules! gen_float {
1026
1022
:: std:: $fty:: NAN ,
1027
1023
:: std:: $fty:: INFINITY ,
1028
1024
-:: std:: $fty:: INFINITY ,
1029
- ] )
1025
+ ]
1026
+ . choose( rng)
1030
1027
. unwrap( )
1031
- } else if rng. gen_weighted_bool ( 10 ) {
1028
+ } else if rng. gen_range ( 0 , 10 ) == 1 {
1032
1029
// NaN patterns
1033
1030
mk_f32( rng. gen ( ) , rng. gen ( ) , 0 )
1034
1031
} else if rng. gen ( ) {
@@ -1053,7 +1050,7 @@ macro_rules! gen_large_float {
1053
1050
$significand_bits: expr) => {
1054
1051
pub fn $name<R >( rng: & mut R ) -> $fty
1055
1052
where
1056
- R : Rng ,
1053
+ R : Rng + ? Sized ,
1057
1054
{
1058
1055
const BITS : u8 = $bits;
1059
1056
const SIGNIFICAND_BITS : u8 = $significand_bits;
@@ -1072,9 +1069,9 @@ macro_rules! gen_large_float {
1072
1069
}
1073
1070
}
1074
1071
1075
- if rng. gen_weighted_bool ( 10 ) {
1072
+ if rng. gen_range ( 0 , 10 ) == 1 {
1076
1073
// Special values
1077
- * rng . choose ( & [
1074
+ * [
1078
1075
-0.0 ,
1079
1076
0.0 ,
1080
1077
:: std:: $fty:: MIN ,
@@ -1083,9 +1080,10 @@ macro_rules! gen_large_float {
1083
1080
:: std:: $fty:: NAN ,
1084
1081
:: std:: $fty:: INFINITY ,
1085
1082
-:: std:: $fty:: INFINITY ,
1086
- ] )
1083
+ ]
1084
+ . choose( rng)
1087
1085
. unwrap( )
1088
- } else if rng. gen_weighted_bool ( 10 ) {
1086
+ } else if rng. gen_range ( 0 , 10 ) == 1 {
1089
1087
// NaN patterns
1090
1088
mk_f32( rng. gen ( ) , rng. gen ( ) , 0 )
1091
1089
} else if rng. gen ( ) {
@@ -1102,7 +1100,7 @@ macro_rules! gen_large_float {
1102
1100
gen_large_float ! ( gen_large_f32, f32 , u32 , 32 , 23 ) ;
1103
1101
gen_large_float ! ( gen_large_f64, f64 , u64 , 64 , 52 ) ;
1104
1102
1105
- trait TestInput : rand :: Rand + Hash + Eq + fmt:: Debug {
1103
+ trait TestInput : Hash + Eq + fmt:: Debug {
1106
1104
fn ty_name ( ) -> String ;
1107
1105
fn generate_lets ( container : & str , cnt : & mut u8 ) -> String ;
1108
1106
fn generate_static ( & self , dst : & mut String ) ;
@@ -1119,6 +1117,7 @@ where
1119
1117
F : FnMut ( A ) -> Option < R > ,
1120
1118
A : TestInput + Copy ,
1121
1119
R : TestOutput ,
1120
+ rand:: distributions:: Standard : rand:: distributions:: Distribution < A > ,
1122
1121
{
1123
1122
let rng = & mut rand:: thread_rng ( ) ;
1124
1123
let testname = test. split ( "::" ) . last ( ) . unwrap ( ) . split ( "(" ) . next ( ) . unwrap ( ) ;
@@ -1207,8 +1206,8 @@ macro_rules! my_float {
1207
1206
}
1208
1207
}
1209
1208
1210
- impl rand:: Rand for $name {
1211
- fn rand <R : rand:: Rng > ( r: & mut R ) -> $name {
1209
+ impl rand:: distributions :: Distribution <$name> for rand :: distributions :: Standard {
1210
+ fn sample <R : rand:: Rng + ? Sized > ( & self , r: & mut R ) -> $name {
1212
1211
$name( $gen( r) )
1213
1212
}
1214
1213
}
@@ -1260,18 +1259,18 @@ macro_rules! my_integer {
1260
1259
}
1261
1260
}
1262
1261
1263
- impl rand:: Rand for $name {
1264
- fn rand <R : rand:: Rng > ( rng : & mut R ) -> $name {
1262
+ impl rand:: distributions :: Distribution <$name> for rand :: distributions :: Standard {
1263
+ fn sample <R : rand:: Rng + ? Sized > ( & self , r : & mut R ) -> $name {
1265
1264
let bits = ( 0 as $inner) . count_zeros( ) ;
1266
1265
let mut mk = || {
1267
- if rng . gen_weighted_bool ( 10 ) {
1268
- * rng . choose ( & [
1266
+ if r . gen_range ( 0 , 10 ) == 1 {
1267
+ * [
1269
1268
:: std:: $inner:: MAX >> ( bits / 2 ) ,
1270
1269
0 ,
1271
1270
:: std:: $inner:: MIN >> ( bits / 2 ) ,
1272
- ] ) . unwrap( )
1271
+ ] . choose ( r ) . unwrap( )
1273
1272
} else {
1274
- rng . gen :: <$inner>( )
1273
+ r . gen :: <$inner>( )
1275
1274
}
1276
1275
} ;
1277
1276
let a = mk( ) ;
@@ -1386,3 +1385,36 @@ where
1386
1385
container. to_string ( )
1387
1386
}
1388
1387
}
1388
+
1389
+ trait FromFloat < T > : Sized {
1390
+ fn cast ( src : T ) -> Option < Self > ;
1391
+ }
1392
+
1393
+ macro_rules! from_float {
1394
+ ( $( $src: ident => $( $dst: ident) ,+) ;+; ) => {
1395
+ $(
1396
+ $(
1397
+ impl FromFloat <$src> for $dst {
1398
+ fn cast( src: $src) -> Option <$dst> {
1399
+ use std:: { $dst, $src} ;
1400
+
1401
+ if src. is_nan( ) ||
1402
+ src. is_infinite( ) ||
1403
+ src < std:: $dst:: MIN as $src ||
1404
+ src > std:: $dst:: MAX as $src
1405
+ {
1406
+ None
1407
+ } else {
1408
+ Some ( src as $dst)
1409
+ }
1410
+ }
1411
+ }
1412
+ ) +
1413
+ ) +
1414
+ }
1415
+ }
1416
+
1417
+ from_float ! {
1418
+ f32 => i32 , i64 , i128 , u32 , u64 , u128 ;
1419
+ f64 => i32 , i64 , i128 , u32 , u64 , u128 ;
1420
+ }
0 commit comments