1- extern  crate  cast; 
2- extern  crate  rand; 
3- 
1+ use  rand:: seq:: SliceRandom ; 
2+ use  rand:: Rng ; 
43use  std:: collections:: HashMap ; 
54use  std:: fmt; 
65use  std:: fmt:: Write  as  FmtWrite ; 
@@ -10,9 +9,6 @@ use std::io::Write;
109use  std:: path:: PathBuf ; 
1110use  std:: { env,  mem} ; 
1211
13- use  self :: cast:: { f32,  f64,  i128,  i32,  i64,  u128,  u32,  u64} ; 
14- use  self :: rand:: Rng ; 
15- 
1612const  NTESTS :  usize  = 1_000 ; 
1713
1814fn  main ( )  { 
@@ -397,7 +393,7 @@ fn main() {
397393            if  a. 0 . is_nan ( )  { 
398394                return  None ; 
399395            } 
400-             Some ( f64 ( a. 0 ) ) 
396+             Some ( f64:: from ( a. 0 ) ) 
401397        } , 
402398        "builtins::float::extend::__extendsfdf2(a)" , 
403399    ) ; 
@@ -407,100 +403,100 @@ fn main() {
407403                if  a. 0 . is_nan ( )  { 
408404                    return  None ; 
409405                } 
410-                 Some ( f64 ( a. 0 ) ) 
406+                 Some ( f64:: from ( a. 0 ) ) 
411407            } , 
412408            "builtins::float::extend::__extendsfdf2vfp(a)" , 
413409        ) ; 
414410    } 
415411
416412    // float/conv.rs 
417413    gen ( 
418-         |a :  MyF64 | i64 ( a. 0 ) . ok ( ) , 
414+         |a :  MyF64 | i64:: cast ( a. 0 ) , 
419415        "builtins::float::conv::__fixdfdi(a)" , 
420416    ) ; 
421417    gen ( 
422-         |a :  MyF64 | i32 ( a. 0 ) . ok ( ) , 
418+         |a :  MyF64 | i32:: cast ( a. 0 ) , 
423419        "builtins::float::conv::__fixdfsi(a)" , 
424420    ) ; 
425421    gen ( 
426-         |a :  MyF32 | i64 ( a. 0 ) . ok ( ) , 
422+         |a :  MyF32 | i64:: cast ( a. 0 ) , 
427423        "builtins::float::conv::__fixsfdi(a)" , 
428424    ) ; 
429425    gen ( 
430-         |a :  MyF32 | i32 ( a. 0 ) . ok ( ) , 
426+         |a :  MyF32 | i32:: cast ( a. 0 ) , 
431427        "builtins::float::conv::__fixsfsi(a)" , 
432428    ) ; 
433429    gen ( 
434-         |a :  MyF32 | i128 ( a. 0 ) . ok ( ) , 
430+         |a :  MyF32 | i128:: cast ( a. 0 ) , 
435431        "builtins::float::conv::__fixsfti(a)" , 
436432    ) ; 
437433    gen ( 
438-         |a :  MyF64 | i128 ( a. 0 ) . ok ( ) , 
434+         |a :  MyF64 | i128:: cast ( a. 0 ) , 
439435        "builtins::float::conv::__fixdfti(a)" , 
440436    ) ; 
441437    gen ( 
442-         |a :  MyF64 | u64 ( a. 0 ) . ok ( ) , 
438+         |a :  MyF64 | u64:: cast ( a. 0 ) , 
443439        "builtins::float::conv::__fixunsdfdi(a)" , 
444440    ) ; 
445441    gen ( 
446-         |a :  MyF64 | u32 ( a. 0 ) . ok ( ) , 
442+         |a :  MyF64 | u32:: cast ( a. 0 ) , 
447443        "builtins::float::conv::__fixunsdfsi(a)" , 
448444    ) ; 
449445    gen ( 
450-         |a :  MyF32 | u64 ( a. 0 ) . ok ( ) , 
446+         |a :  MyF32 | u64:: cast ( a. 0 ) , 
451447        "builtins::float::conv::__fixunssfdi(a)" , 
452448    ) ; 
453449    gen ( 
454-         |a :  MyF32 | u32 ( a. 0 ) . ok ( ) , 
450+         |a :  MyF32 | u32:: cast ( a. 0 ) , 
455451        "builtins::float::conv::__fixunssfsi(a)" , 
456452    ) ; 
457453    gen ( 
458-         |a :  MyF32 | u128 ( a. 0 ) . ok ( ) , 
454+         |a :  MyF32 | u128:: cast ( a. 0 ) , 
459455        "builtins::float::conv::__fixunssfti(a)" , 
460456    ) ; 
461457    gen ( 
462-         |a :  MyF64 | u128 ( a. 0 ) . ok ( ) , 
458+         |a :  MyF64 | u128:: cast ( a. 0 ) , 
463459        "builtins::float::conv::__fixunsdfti(a)" , 
464460    ) ; 
465461    gen ( 
466-         |a :  MyI64 | Some ( f64 ( a. 0 ) ) , 
462+         |a :  MyI64 | Some ( a. 0   as   f64 ) , 
467463        "builtins::float::conv::__floatdidf(a)" , 
468464    ) ; 
469465    gen ( 
470-         |a :  MyI32 | Some ( f64 ( a. 0 ) ) , 
466+         |a :  MyI32 | Some ( a. 0   as   f64 ) , 
471467        "builtins::float::conv::__floatsidf(a)" , 
472468    ) ; 
473469    gen ( 
474-         |a :  MyI32 | Some ( f32 ( a. 0 ) ) , 
470+         |a :  MyI32 | Some ( a. 0   as   f32 ) , 
475471        "builtins::float::conv::__floatsisf(a)" , 
476472    ) ; 
477473    gen ( 
478-         |a :  MyU64 | Some ( f64 ( a. 0 ) ) , 
474+         |a :  MyU64 | Some ( a. 0   as   f64 ) , 
479475        "builtins::float::conv::__floatundidf(a)" , 
480476    ) ; 
481477    gen ( 
482-         |a :  MyU32 | Some ( f64 ( a. 0 ) ) , 
478+         |a :  MyU32 | Some ( a. 0   as   f64 ) , 
483479        "builtins::float::conv::__floatunsidf(a)" , 
484480    ) ; 
485481    gen ( 
486-         |a :  MyU32 | Some ( f32 ( a. 0 ) ) , 
482+         |a :  MyU32 | Some ( a. 0   as   f32 ) , 
487483        "builtins::float::conv::__floatunsisf(a)" , 
488484    ) ; 
489485    gen ( 
490-         |a :  MyU128 | f32 ( a. 0 ) . ok ( ) , 
486+         |a :  MyU128 | Some ( a. 0   as   f32 ) , 
491487        "builtins::float::conv::__floatuntisf(a)" , 
492488    ) ; 
493489    if  !target_arch_mips { 
494490        gen ( 
495-             |a :  MyI128 | Some ( f32 ( a. 0 ) ) , 
491+             |a :  MyI128 | Some ( a. 0   as   f32 ) , 
496492            "builtins::float::conv::__floattisf(a)" , 
497493        ) ; 
498494        gen ( 
499-             |a :  MyI128 | Some ( f64 ( a. 0 ) ) , 
495+             |a :  MyI128 | Some ( a. 0   as   f64 ) , 
500496            "builtins::float::conv::__floattidf(a)" , 
501497        ) ; 
502498        gen ( 
503-             |a :  MyU128 | Some ( f64 ( a. 0 ) ) , 
499+             |a :  MyU128 | Some ( a. 0   as   f64 ) , 
504500            "builtins::float::conv::__floatuntidf(a)" , 
505501        ) ; 
506502    } 
@@ -996,7 +992,7 @@ macro_rules! gen_float {
996992     $significand_bits: expr)  => { 
997993        pub  fn  $name<R >( rng:  & mut  R )  -> $fty
998994        where 
999-             R :  Rng , 
995+             R :  Rng  + ? Sized , 
1000996        { 
1001997            const  BITS :  u8  = $bits; 
1002998            const  SIGNIFICAND_BITS :  u8  = $significand_bits; 
@@ -1015,9 +1011,9 @@ macro_rules! gen_float {
10151011                } 
10161012            } 
10171013
1018-             if  rng. gen_weighted_bool ( 10 )  { 
1014+             if  rng. gen_range ( 0 ,   10 )  ==  1  { 
10191015                // Special values 
1020-                 * rng . choose ( & [ 
1016+                 * [ 
10211017                    -0.0 , 
10221018                    0.0 , 
10231019                    :: std:: $fty:: MIN , 
@@ -1026,9 +1022,10 @@ macro_rules! gen_float {
10261022                    :: std:: $fty:: NAN , 
10271023                    :: std:: $fty:: INFINITY , 
10281024                    -:: std:: $fty:: INFINITY , 
1029-                 ] ) 
1025+                 ] 
1026+                 . choose( rng) 
10301027                . unwrap( ) 
1031-             }  else if  rng. gen_weighted_bool ( 10 )  { 
1028+             }  else if  rng. gen_range ( 0 ,   10 )  ==  1  { 
10321029                // NaN patterns 
10331030                mk_f32( rng. gen ( ) ,  rng. gen ( ) ,  0 ) 
10341031            }  else if  rng. gen ( )  { 
@@ -1053,7 +1050,7 @@ macro_rules! gen_large_float {
10531050     $significand_bits: expr)  => { 
10541051        pub  fn  $name<R >( rng:  & mut  R )  -> $fty
10551052        where 
1056-             R :  Rng , 
1053+             R :  Rng  + ? Sized , 
10571054        { 
10581055            const  BITS :  u8  = $bits; 
10591056            const  SIGNIFICAND_BITS :  u8  = $significand_bits; 
@@ -1072,9 +1069,9 @@ macro_rules! gen_large_float {
10721069                } 
10731070            } 
10741071
1075-             if  rng. gen_weighted_bool ( 10 )  { 
1072+             if  rng. gen_range ( 0 ,   10 )  ==  1  { 
10761073                // Special values 
1077-                 * rng . choose ( & [ 
1074+                 * [ 
10781075                    -0.0 , 
10791076                    0.0 , 
10801077                    :: std:: $fty:: MIN , 
@@ -1083,9 +1080,10 @@ macro_rules! gen_large_float {
10831080                    :: std:: $fty:: NAN , 
10841081                    :: std:: $fty:: INFINITY , 
10851082                    -:: std:: $fty:: INFINITY , 
1086-                 ] ) 
1083+                 ] 
1084+                 . choose( rng) 
10871085                . unwrap( ) 
1088-             }  else if  rng. gen_weighted_bool ( 10 )  { 
1086+             }  else if  rng. gen_range ( 0 ,   10 )  ==  1  { 
10891087                // NaN patterns 
10901088                mk_f32( rng. gen ( ) ,  rng. gen ( ) ,  0 ) 
10911089            }  else if  rng. gen ( )  { 
@@ -1102,7 +1100,7 @@ macro_rules! gen_large_float {
11021100gen_large_float ! ( gen_large_f32,  f32 ,  u32 ,  32 ,  23 ) ; 
11031101gen_large_float ! ( gen_large_f64,  f64 ,  u64 ,  64 ,  52 ) ; 
11041102
1105- trait  TestInput :  rand :: Rand  +  Hash  + Eq  + fmt:: Debug  { 
1103+ trait  TestInput :  Hash  + Eq  + fmt:: Debug  { 
11061104    fn  ty_name ( )  -> String ; 
11071105    fn  generate_lets ( container :  & str ,  cnt :  & mut  u8 )  -> String ; 
11081106    fn  generate_static ( & self ,  dst :  & mut  String ) ; 
@@ -1119,6 +1117,7 @@ where
11191117    F :  FnMut ( A )  -> Option < R > , 
11201118    A :  TestInput  + Copy , 
11211119    R :  TestOutput , 
1120+     rand:: distributions:: Standard :  rand:: distributions:: Distribution < A > , 
11221121{ 
11231122    let  rng = & mut  rand:: thread_rng ( ) ; 
11241123    let  testname = test. split ( "::" ) . last ( ) . unwrap ( ) . split ( "(" ) . next ( ) . unwrap ( ) ; 
@@ -1207,8 +1206,8 @@ macro_rules! my_float {
12071206            } 
12081207        } 
12091208
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 { 
12121211                $name( $gen( r) ) 
12131212            } 
12141213        } 
@@ -1260,18 +1259,18 @@ macro_rules! my_integer {
12601259            } 
12611260        } 
12621261
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 { 
12651264                let  bits = ( 0  as  $inner) . count_zeros( ) ; 
12661265                let  mut  mk = || { 
1267-                     if  rng . gen_weighted_bool ( 10 )  { 
1268-                         * rng . choose ( & [ 
1266+                     if  r . gen_range ( 0 ,   10 )  ==  1  { 
1267+                         * [ 
12691268                            :: std:: $inner:: MAX  >> ( bits / 2 ) , 
12701269                            0 , 
12711270                            :: std:: $inner:: MIN  >> ( bits / 2 ) , 
1272-                         ] ) . unwrap( ) 
1271+                         ] . choose ( r ) . unwrap( ) 
12731272                    }  else { 
1274-                         rng . gen :: <$inner>( ) 
1273+                         r . gen :: <$inner>( ) 
12751274                    } 
12761275                } ; 
12771276                let  a = mk( ) ; 
@@ -1386,3 +1385,36 @@ where
13861385        container. to_string ( ) 
13871386    } 
13881387} 
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