@@ -91,18 +91,18 @@ pub struct Weighted<T> {
91
91
/// ```rust
92
92
/// use rand::distributions::{Weighted, WeightedChoice, IndependentSample};
93
93
///
94
- /// let wc = WeightedChoice::new(~[ Weighted { weight: 2, item: 'a' },
95
- /// Weighted { weight: 4, item: 'b' },
96
- /// Weighted { weight: 1, item: 'c' }] );
94
+ /// let wc = WeightedChoice::new(vec!( Weighted { weight: 2, item: 'a' },
95
+ /// Weighted { weight: 4, item: 'b' },
96
+ /// Weighted { weight: 1, item: 'c' }) );
97
97
/// let mut rng = rand::task_rng();
98
98
/// for _ in range(0, 16) {
99
99
/// // on average prints 'a' 4 times, 'b' 8 and 'c' twice.
100
100
/// println!("{}", wc.ind_sample(&mut rng));
101
101
/// }
102
102
/// ```
103
103
pub struct WeightedChoice < T > {
104
- pub items : ~ [ Weighted < T > ] ,
105
- pub weight_range : Range < uint >
104
+ items : Vec < Weighted < T > > ,
105
+ weight_range : Range < uint >
106
106
}
107
107
108
108
impl < T : Clone > WeightedChoice < T > {
@@ -112,7 +112,7 @@ impl<T: Clone> WeightedChoice<T> {
112
112
/// - `v` is empty
113
113
/// - the total weight is 0
114
114
/// - the total weight is larger than a `uint` can contain.
115
- pub fn new ( mut items : ~ [ Weighted < T > ] ) -> WeightedChoice < T > {
115
+ pub fn new ( mut items : Vec < Weighted < T > > ) -> WeightedChoice < T > {
116
116
// strictly speaking, this is subsumed by the total weight == 0 case
117
117
assert ! ( !items. is_empty( ) , "WeightedChoice::new called with no items" ) ;
118
118
@@ -153,8 +153,8 @@ impl<T: Clone> IndependentSample<T> for WeightedChoice<T> {
153
153
let sample_weight = self . weight_range . ind_sample ( rng) ;
154
154
155
155
// short circuit when it's the first item
156
- if sample_weight < self . items [ 0 ] . weight {
157
- return self . items [ 0 ] . item . clone ( ) ;
156
+ if sample_weight < self . items . get ( 0 ) . weight {
157
+ return self . items . get ( 0 ) . item . clone ( ) ;
158
158
}
159
159
160
160
let mut idx = 0 ;
@@ -169,7 +169,7 @@ impl<T: Clone> IndependentSample<T> for WeightedChoice<T> {
169
169
// one is exactly the total weight.)
170
170
while modifier > 1 {
171
171
let i = idx + modifier / 2 ;
172
- if self . items [ i ] . weight <= sample_weight {
172
+ if self . items . get ( i ) . weight <= sample_weight {
173
173
// we're small, so look to the right, but allow this
174
174
// exact element still.
175
175
idx = i;
@@ -182,7 +182,7 @@ impl<T: Clone> IndependentSample<T> for WeightedChoice<T> {
182
182
}
183
183
modifier /= 2 ;
184
184
}
185
- return self . items [ idx + 1 ] . item . clone ( ) ;
185
+ return self . items . get ( idx + 1 ) . item . clone ( ) ;
186
186
}
187
187
}
188
188
@@ -297,54 +297,54 @@ mod tests {
297
297
} }
298
298
) ;
299
299
300
- t ! ( ~ [ Weighted { weight: 1 , item: 10 } ] , ~ [ 10 ] ) ;
300
+ t ! ( vec! ( Weighted { weight: 1 , item: 10 } ) , [ 10 ] ) ;
301
301
302
302
// skip some
303
- t ! ( ~ [ Weighted { weight: 0 , item: 20 } ,
304
- Weighted { weight: 2 , item: 21 } ,
305
- Weighted { weight: 0 , item: 22 } ,
306
- Weighted { weight: 1 , item: 23 } ] ,
307
- ~ [ 21 , 21 , 23 ] ) ;
303
+ t ! ( vec! ( Weighted { weight: 0 , item: 20 } ,
304
+ Weighted { weight: 2 , item: 21 } ,
305
+ Weighted { weight: 0 , item: 22 } ,
306
+ Weighted { weight: 1 , item: 23 } ) ,
307
+ [ 21 , 21 , 23 ] ) ;
308
308
309
309
// different weights
310
- t ! ( ~ [ Weighted { weight: 4 , item: 30 } ,
311
- Weighted { weight: 3 , item: 31 } ] ,
312
- ~ [ 30 , 30 , 30 , 30 , 31 , 31 , 31 ] ) ;
310
+ t ! ( vec! ( Weighted { weight: 4 , item: 30 } ,
311
+ Weighted { weight: 3 , item: 31 } ) ,
312
+ [ 30 , 30 , 30 , 30 , 31 , 31 , 31 ] ) ;
313
313
314
314
// check that we're binary searching
315
315
// correctly with some vectors of odd
316
316
// length.
317
- t ! ( ~ [ Weighted { weight: 1 , item: 40 } ,
318
- Weighted { weight: 1 , item: 41 } ,
319
- Weighted { weight: 1 , item: 42 } ,
320
- Weighted { weight: 1 , item: 43 } ,
321
- Weighted { weight: 1 , item: 44 } ] ,
322
- ~ [ 40 , 41 , 42 , 43 , 44 ] ) ;
323
- t ! ( ~ [ Weighted { weight: 1 , item: 50 } ,
324
- Weighted { weight: 1 , item: 51 } ,
325
- Weighted { weight: 1 , item: 52 } ,
326
- Weighted { weight: 1 , item: 53 } ,
327
- Weighted { weight: 1 , item: 54 } ,
328
- Weighted { weight: 1 , item: 55 } ,
329
- Weighted { weight: 1 , item: 56 } ] ,
330
- ~ [ 50 , 51 , 52 , 53 , 54 , 55 , 56 ] ) ;
317
+ t ! ( vec! ( Weighted { weight: 1 , item: 40 } ,
318
+ Weighted { weight: 1 , item: 41 } ,
319
+ Weighted { weight: 1 , item: 42 } ,
320
+ Weighted { weight: 1 , item: 43 } ,
321
+ Weighted { weight: 1 , item: 44 } ) ,
322
+ [ 40 , 41 , 42 , 43 , 44 ] ) ;
323
+ t ! ( vec! ( Weighted { weight: 1 , item: 50 } ,
324
+ Weighted { weight: 1 , item: 51 } ,
325
+ Weighted { weight: 1 , item: 52 } ,
326
+ Weighted { weight: 1 , item: 53 } ,
327
+ Weighted { weight: 1 , item: 54 } ,
328
+ Weighted { weight: 1 , item: 55 } ,
329
+ Weighted { weight: 1 , item: 56 } ) ,
330
+ [ 50 , 51 , 52 , 53 , 54 , 55 , 56 ] ) ;
331
331
}
332
332
333
333
#[ test] #[ should_fail]
334
334
fn test_weighted_choice_no_items ( ) {
335
- WeightedChoice :: < int > :: new ( ~ [ ] ) ;
335
+ WeightedChoice :: < int > :: new ( vec ! ( ) ) ;
336
336
}
337
337
#[ test] #[ should_fail]
338
338
fn test_weighted_choice_zero_weight ( ) {
339
- WeightedChoice :: new ( ~ [ Weighted { weight : 0 , item : 0 } ,
340
- Weighted { weight : 0 , item : 1 } ] ) ;
339
+ WeightedChoice :: new ( vec ! ( Weighted { weight: 0 , item: 0 } ,
340
+ Weighted { weight: 0 , item: 1 } ) ) ;
341
341
}
342
342
#[ test] #[ should_fail]
343
343
fn test_weighted_choice_weight_overflows ( ) {
344
344
let x = ( -1 ) as uint / 2 ; // x + x + 2 is the overflow
345
- WeightedChoice :: new ( ~ [ Weighted { weight : x, item : 0 } ,
346
- Weighted { weight : 1 , item : 1 } ,
347
- Weighted { weight : x, item : 2 } ,
348
- Weighted { weight : 1 , item : 3 } ] ) ;
345
+ WeightedChoice :: new ( vec ! ( Weighted { weight: x, item: 0 } ,
346
+ Weighted { weight: 1 , item: 1 } ,
347
+ Weighted { weight: x, item: 2 } ,
348
+ Weighted { weight: 1 , item: 3 } ) ) ;
349
349
}
350
350
}
0 commit comments