Skip to content

Commit d86de18

Browse files
committed
std::rand::reseeding: seed the reseeder in the SeedableRng impl.
This stops us relying on Default here.
1 parent 649c175 commit d86de18

File tree

2 files changed

+13
-12
lines changed

2 files changed

+13
-12
lines changed

src/libstd/rand/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -762,8 +762,7 @@ pub fn task_rng() -> @mut TaskRng {
762762
/// ```
763763
pub fn seed_task_rng(seed: &[uint]) {
764764
let t_r = task_rng();
765-
(*t_r).reseed(seed);
766-
t_r.reseeder = DontReseed;
765+
(*t_r).reseed((DontReseed, seed));
767766
}
768767

769768
// Allow direct chaining with `task_rng`

src/libstd/rand/reseeding.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,19 +76,21 @@ impl<R: Rng, Rsdr: Reseeder<R>> Rng for ReseedingRng<R, Rsdr> {
7676
}
7777
}
7878

79-
impl<S, R: SeedableRng<S>, Rsdr: Reseeder<R> + Default> SeedableRng<S> for ReseedingRng<R, Rsdr> {
80-
fn reseed(&mut self, seed: S) {
79+
impl<S, R: SeedableRng<S>, Rsdr: Reseeder<R>>
80+
SeedableRng<(Rsdr, S)> for ReseedingRng<R, Rsdr> {
81+
fn reseed(&mut self, (rsdr, seed): (Rsdr, S)) {
8182
self.rng.reseed(seed);
83+
self.reseeder = rsdr;
8284
self.bytes_generated = 0;
8385
}
84-
/// Create a new `ReseedingRng` from the given seed. This uses
85-
/// default values for both `generation_threshold` and `reseeder`.
86-
fn from_seed(seed: S) -> ReseedingRng<R, Rsdr> {
86+
/// Create a new `ReseedingRng` from the given reseeder and
87+
/// seed. This uses a default value for `generation_threshold`.
88+
fn from_seed((rsdr, seed): (Rsdr, S)) -> ReseedingRng<R, Rsdr> {
8789
ReseedingRng {
8890
rng: SeedableRng::from_seed(seed),
8991
generation_threshold: DEFAULT_GENERATION_THRESHOLD,
9092
bytes_generated: 0,
91-
reseeder: Default::default()
93+
reseeder: rsdr
9294
}
9395
}
9496
}
@@ -184,17 +186,17 @@ mod test {
184186

185187
#[test]
186188
fn test_rng_seeded() {
187-
let mut ra: MyRng = SeedableRng::from_seed(2);
188-
let mut rb: MyRng = SeedableRng::from_seed(2);
189+
let mut ra: MyRng = SeedableRng::from_seed((ReseedWithDefault, 2));
190+
let mut rb: MyRng = SeedableRng::from_seed((ReseedWithDefault, 2));
189191
assert_eq!(ra.gen_ascii_str(100u), rb.gen_ascii_str(100u));
190192
}
191193

192194
#[test]
193195
fn test_rng_reseed() {
194-
let mut r: MyRng = SeedableRng::from_seed(3);
196+
let mut r: MyRng = SeedableRng::from_seed((ReseedWithDefault, 3));
195197
let string1 = r.gen_ascii_str(100);
196198

197-
r.reseed(3);
199+
r.reseed((ReseedWithDefault, 3));
198200

199201
let string2 = r.gen_ascii_str(100);
200202
assert_eq!(string1, string2);

0 commit comments

Comments
 (0)