13
13
use { Rng } ;
14
14
use distributions:: { Distribution , Standard } ;
15
15
16
- impl Distribution < isize > for Standard {
17
- #[ inline]
18
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> isize {
19
- rng. gen :: < usize > ( ) as isize
20
- }
21
- }
22
-
23
- impl Distribution < i8 > for Standard {
16
+ impl Distribution < u8 > for Standard {
24
17
#[ inline]
25
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> i8 {
26
- rng. next_u32 ( ) as i8
18
+ fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> u8 {
19
+ rng. next_u32 ( ) as u8
27
20
}
28
21
}
29
22
30
- impl Distribution < i16 > for Standard {
23
+ impl Distribution < u16 > for Standard {
31
24
#[ inline]
32
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> i16 {
33
- rng. next_u32 ( ) as i16
25
+ fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> u16 {
26
+ rng. next_u32 ( ) as u16
34
27
}
35
28
}
36
29
37
- impl Distribution < i32 > for Standard {
30
+ impl Distribution < u32 > for Standard {
38
31
#[ inline]
39
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> i32 {
40
- rng. next_u32 ( ) as i32
32
+ fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> u32 {
33
+ rng. next_u32 ( )
41
34
}
42
35
}
43
36
44
- impl Distribution < i64 > for Standard {
37
+ impl Distribution < u64 > for Standard {
45
38
#[ inline]
46
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> i64 {
47
- rng. next_u64 ( ) as i64
39
+ fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> u64 {
40
+ rng. next_u64 ( )
48
41
}
49
42
}
50
43
51
44
#[ cfg( feature = "i128_support" ) ]
52
- impl Distribution < i128 > for Standard {
45
+ impl Distribution < u128 > for Standard {
53
46
#[ inline]
54
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> i128 {
55
- rng. gen :: < u128 > ( ) as i128
47
+ fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> u128 {
48
+ if rng. bytes_per_round ( ) < 128 {
49
+ // Use LE; we explicitly generate one value before the next.
50
+ let x = rng. next_u64 ( ) as u128 ;
51
+ let y = rng. next_u64 ( ) as u128 ;
52
+ ( y << 64 ) | x
53
+ } else {
54
+ let mut val = 0u128 ;
55
+ unsafe {
56
+ let ptr = & mut val;
57
+ let b_ptr = & mut * ( ptr as * mut u128 as * mut [ u8 ; 16 ] ) ;
58
+ rng. fill_bytes ( b_ptr) ;
59
+ }
60
+ val. to_le ( )
61
+ }
56
62
}
57
63
}
58
64
@@ -70,44 +76,23 @@ impl Distribution<usize> for Standard {
70
76
}
71
77
}
72
78
73
- impl Distribution < u8 > for Standard {
74
- #[ inline]
75
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> u8 {
76
- rng. next_u32 ( ) as u8
79
+ macro_rules! impl_int_from_uint {
80
+ ( $ty: ty, $uty: ty) => {
81
+ impl Distribution <$ty> for Standard {
82
+ #[ inline]
83
+ fn sample<R : Rng + ?Sized >( & self , rng: & mut R ) -> $ty {
84
+ rng. gen :: <$uty>( ) as $ty
85
+ }
86
+ }
77
87
}
78
88
}
79
89
80
- impl Distribution < u16 > for Standard {
81
- #[ inline]
82
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> u16 {
83
- rng. next_u32 ( ) as u16
84
- }
85
- }
86
-
87
- impl Distribution < u32 > for Standard {
88
- #[ inline]
89
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> u32 {
90
- rng. next_u32 ( )
91
- }
92
- }
93
-
94
- impl Distribution < u64 > for Standard {
95
- #[ inline]
96
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> u64 {
97
- rng. next_u64 ( )
98
- }
99
- }
100
-
101
- #[ cfg( feature = "i128_support" ) ]
102
- impl Distribution < u128 > for Standard {
103
- #[ inline]
104
- fn sample < R : Rng + ?Sized > ( & self , rng : & mut R ) -> u128 {
105
- // Use LE; we explicitly generate one value before the next.
106
- let x = rng. next_u64 ( ) as u128 ;
107
- let y = rng. next_u64 ( ) as u128 ;
108
- ( y << 64 ) | x
109
- }
110
- }
90
+ impl_int_from_uint ! { i8 , u8 }
91
+ impl_int_from_uint ! { i16 , u16 }
92
+ impl_int_from_uint ! { i32 , u32 }
93
+ impl_int_from_uint ! { i64 , u64 }
94
+ #[ cfg( feature = "i128_support" ) ] impl_int_from_uint ! { i128 , u128 }
95
+ impl_int_from_uint ! { isize , usize }
111
96
112
97
113
98
#[ cfg( test) ]
0 commit comments