@@ -53,6 +53,7 @@ pub trait Rand {
53
53
}
54
54
55
55
impl Rand for int {
56
+ #[ inline]
56
57
fn rand < R : Rng > ( rng : & R ) -> int {
57
58
if int:: bits == 32 {
58
59
rng. next ( ) as int
@@ -63,30 +64,35 @@ impl Rand for int {
63
64
}
64
65
65
66
impl Rand for i8 {
67
+ #[ inline]
66
68
fn rand < R : Rng > ( rng : & R ) -> i8 {
67
69
rng. next ( ) as i8
68
70
}
69
71
}
70
72
71
73
impl Rand for i16 {
74
+ #[ inline]
72
75
fn rand < R : Rng > ( rng : & R ) -> i16 {
73
76
rng. next ( ) as i16
74
77
}
75
78
}
76
79
77
80
impl Rand for i32 {
81
+ #[ inline]
78
82
fn rand < R : Rng > ( rng : & R ) -> i32 {
79
83
rng. next ( ) as i32
80
84
}
81
85
}
82
86
83
87
impl Rand for i64 {
88
+ #[ inline]
84
89
fn rand < R : Rng > ( rng : & R ) -> i64 {
85
90
( rng. next ( ) as i64 << 32 ) | rng. next ( ) as i64
86
91
}
87
92
}
88
93
89
94
impl Rand for uint {
95
+ #[ inline]
90
96
fn rand < R : Rng > ( rng : & R ) -> uint {
91
97
if uint:: bits == 32 {
92
98
rng. next ( ) as uint
@@ -97,43 +103,50 @@ impl Rand for uint {
97
103
}
98
104
99
105
impl Rand for u8 {
106
+ #[ inline]
100
107
fn rand < R : Rng > ( rng : & R ) -> u8 {
101
108
rng. next ( ) as u8
102
109
}
103
110
}
104
111
105
112
impl Rand for u16 {
113
+ #[ inline]
106
114
fn rand < R : Rng > ( rng : & R ) -> u16 {
107
115
rng. next ( ) as u16
108
116
}
109
117
}
110
118
111
119
impl Rand for u32 {
120
+ #[ inline]
112
121
fn rand < R : Rng > ( rng : & R ) -> u32 {
113
122
rng. next ( )
114
123
}
115
124
}
116
125
117
126
impl Rand for u64 {
127
+ #[ inline]
118
128
fn rand < R : Rng > ( rng : & R ) -> u64 {
119
129
( rng. next ( ) as u64 << 32 ) | rng. next ( ) as u64
120
130
}
121
131
}
122
132
123
133
impl Rand for float {
134
+ #[ inline]
124
135
fn rand < R : Rng > ( rng : & R ) -> float {
125
136
rng. gen :: < f64 > ( ) as float
126
137
}
127
138
}
128
139
129
140
impl Rand for f32 {
141
+ #[ inline]
130
142
fn rand < R : Rng > ( rng : & R ) -> f32 {
131
143
rng. gen :: < f64 > ( ) as f32
132
144
}
133
145
}
134
146
135
147
static scale : f64 = ( u32:: max_value as f64 ) + 1.0f64 ;
136
148
impl Rand for f64 {
149
+ #[ inline]
137
150
fn rand < R : Rng > ( rng : & R ) -> f64 {
138
151
let u1 = rng. next ( ) as f64 ;
139
152
let u2 = rng. next ( ) as f64 ;
@@ -144,12 +157,14 @@ impl Rand for f64 {
144
157
}
145
158
146
159
impl Rand for char {
160
+ #[ inline]
147
161
fn rand < R : Rng > ( rng : & R ) -> char {
148
162
rng. next ( ) as char
149
163
}
150
164
}
151
165
152
166
impl Rand for bool {
167
+ #[ inline]
153
168
fn rand < R : Rng > ( rng : & R ) -> bool {
154
169
rng. next ( ) & 1u32 == 1u32
155
170
}
@@ -163,6 +178,7 @@ macro_rules! tuple_impl {
163
178
$( $tyvar : Rand ) ,*
164
179
> Rand for ( $( $tyvar ) ,* , ) {
165
180
181
+ #[ inline]
166
182
fn rand<R : Rng >( _rng: & R ) -> ( $( $tyvar ) ,* , ) {
167
183
(
168
184
// use the $tyvar's to get the appropriate number of
@@ -177,7 +193,10 @@ macro_rules! tuple_impl {
177
193
}
178
194
}
179
195
180
- impl Rand for ( ) { fn rand < R : Rng > ( _: & R ) -> ( ) { ( ) } }
196
+ impl Rand for ( ) {
197
+ #[ inline]
198
+ fn rand < R : Rng > ( _: & R ) -> ( ) { ( ) }
199
+ }
181
200
tuple_impl ! { A }
182
201
tuple_impl ! { A , B }
183
202
tuple_impl ! { A , B , C }
@@ -190,6 +209,7 @@ tuple_impl!{A, B, C, D, E, F, G, H, I}
190
209
tuple_impl ! { A , B , C , D , E , F , G , H , I , J }
191
210
192
211
impl < T : Rand > Rand for Option < T > {
212
+ #[ inline]
193
213
fn rand < R : Rng > ( rng : & R ) -> Option < T > {
194
214
if rng. gen ( ) {
195
215
Some ( rng. gen ( ) )
@@ -200,10 +220,12 @@ impl<T:Rand> Rand for Option<T> {
200
220
}
201
221
202
222
impl < T : Rand > Rand for ~T {
223
+ #[ inline]
203
224
fn rand < R : Rng > ( rng : & R ) -> ~T { ~rng. gen ( ) }
204
225
}
205
226
206
227
impl < T : Rand > Rand for @T {
228
+ #[ inline]
207
229
fn rand < R : Rng > ( rng : & R ) -> @T { @rng. gen ( ) }
208
230
}
209
231
@@ -413,6 +435,7 @@ pub trait RngUtil {
413
435
/// Extension methods for random number generators
414
436
impl < R : Rng > RngUtil for R {
415
437
/// Return a random value for a Rand type
438
+ #[ inline( always) ]
416
439
fn gen < T : Rand > ( & self ) -> T {
417
440
Rand :: rand ( self )
418
441
}
@@ -675,6 +698,7 @@ pub impl IsaacRng {
675
698
}
676
699
677
700
/// Refills the output buffer (`self.rsl`)
701
+ #[ inline]
678
702
priv fn isaac( & self ) {
679
703
self . c += 1 ;
680
704
// abbreviations
@@ -731,6 +755,9 @@ impl Rng for IsaacRng {
731
755
}
732
756
}
733
757
758
+ /// An [Xorshift random number
759
+ /// generator] ( http : //en.wikipedia.org/wiki/Xorshift). Not suitable for
760
+ /// cryptographic purposes.
734
761
pub struct XorShiftRng {
735
762
priv mut x : u32 ,
736
763
priv mut y : u32 ,
@@ -739,6 +766,7 @@ pub struct XorShiftRng {
739
766
}
740
767
741
768
impl Rng for XorShiftRng {
769
+ #[ inline]
742
770
pub fn next ( & self ) -> u32 {
743
771
let x = self . x;
744
772
let t = x ^ ( x << 11 ) ;
@@ -788,6 +816,7 @@ fn tls_rng_state(_v: @IsaacRng) {}
788
816
* seeded by the system. Intended to be used in method chaining style, ie
789
817
* `task_rng().gen::<int>()`.
790
818
*/
819
+ #[ inline]
791
820
pub fn task_rng ( ) -> @IsaacRng {
792
821
let r : Option < @IsaacRng > ;
793
822
unsafe {
@@ -807,13 +836,15 @@ pub fn task_rng() -> @IsaacRng {
807
836
808
837
// Allow direct chaining with `task_rng`
809
838
impl < R : Rng > Rng for @R {
839
+ #[ inline( always) ]
810
840
fn next ( & self ) -> u32 { ( * * self ) . next ( ) }
811
841
}
812
842
813
843
/**
814
844
* Returns a random value of a Rand type, using the task's random number
815
845
* generator.
816
846
*/
847
+ #[ inline]
817
848
pub fn random < T : Rand > ( ) -> T {
818
849
task_rng ( ) . gen ( )
819
850
}
0 commit comments