From d86de18b6198547f0a39e217123d8ec9ef4a9988 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Wed, 9 Oct 2013 02:22:37 +1100 Subject: [PATCH] std::rand::reseeding: seed the reseeder in the SeedableRng impl. This stops us relying on Default here. --- src/libstd/rand/mod.rs | 3 +-- src/libstd/rand/reseeding.rs | 22 ++++++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/libstd/rand/mod.rs b/src/libstd/rand/mod.rs index 1465e5942274..f68bf71ba7f5 100644 --- a/src/libstd/rand/mod.rs +++ b/src/libstd/rand/mod.rs @@ -762,8 +762,7 @@ pub fn task_rng() -> @mut TaskRng { /// ``` pub fn seed_task_rng(seed: &[uint]) { let t_r = task_rng(); - (*t_r).reseed(seed); - t_r.reseeder = DontReseed; + (*t_r).reseed((DontReseed, seed)); } // Allow direct chaining with `task_rng` diff --git a/src/libstd/rand/reseeding.rs b/src/libstd/rand/reseeding.rs index b3eab2bbc4cb..3b4919392fc2 100644 --- a/src/libstd/rand/reseeding.rs +++ b/src/libstd/rand/reseeding.rs @@ -76,19 +76,21 @@ impl> Rng for ReseedingRng { } } -impl, Rsdr: Reseeder + Default> SeedableRng for ReseedingRng { - fn reseed(&mut self, seed: S) { +impl, Rsdr: Reseeder> + SeedableRng<(Rsdr, S)> for ReseedingRng { + fn reseed(&mut self, (rsdr, seed): (Rsdr, S)) { self.rng.reseed(seed); + self.reseeder = rsdr; self.bytes_generated = 0; } - /// Create a new `ReseedingRng` from the given seed. This uses - /// default values for both `generation_threshold` and `reseeder`. - fn from_seed(seed: S) -> ReseedingRng { + /// Create a new `ReseedingRng` from the given reseeder and + /// seed. This uses a default value for `generation_threshold`. + fn from_seed((rsdr, seed): (Rsdr, S)) -> ReseedingRng { ReseedingRng { rng: SeedableRng::from_seed(seed), generation_threshold: DEFAULT_GENERATION_THRESHOLD, bytes_generated: 0, - reseeder: Default::default() + reseeder: rsdr } } } @@ -184,17 +186,17 @@ mod test { #[test] fn test_rng_seeded() { - let mut ra: MyRng = SeedableRng::from_seed(2); - let mut rb: MyRng = SeedableRng::from_seed(2); + let mut ra: MyRng = SeedableRng::from_seed((ReseedWithDefault, 2)); + let mut rb: MyRng = SeedableRng::from_seed((ReseedWithDefault, 2)); assert_eq!(ra.gen_ascii_str(100u), rb.gen_ascii_str(100u)); } #[test] fn test_rng_reseed() { - let mut r: MyRng = SeedableRng::from_seed(3); + let mut r: MyRng = SeedableRng::from_seed((ReseedWithDefault, 3)); let string1 = r.gen_ascii_str(100); - r.reseed(3); + r.reseed((ReseedWithDefault, 3)); let string2 = r.gen_ascii_str(100); assert_eq!(string1, string2);