diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2013-10-09 02:22:37 +1100 |
|---|---|---|
| committer | Huon Wilson <dbau.pp+github@gmail.com> | 2013-10-09 22:22:43 +1100 |
| commit | d86de18b6198547f0a39e217123d8ec9ef4a9988 (patch) | |
| tree | 16fe3ff6012e6395db3b80c5b01eb92b76db05d4 | |
| parent | 649c1759e8b56f0ac31dd31e46eae81b7ffd1e2c (diff) | |
| download | rust-d86de18b6198547f0a39e217123d8ec9ef4a9988.tar.gz rust-d86de18b6198547f0a39e217123d8ec9ef4a9988.zip | |
std::rand::reseeding: seed the reseeder in the SeedableRng impl.
This stops us relying on Default here.
| -rw-r--r-- | src/libstd/rand/mod.rs | 3 | ||||
| -rw-r--r-- | 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 1465e594227..f68bf71ba7f 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 b3eab2bbc4c..3b4919392fc 100644 --- a/src/libstd/rand/reseeding.rs +++ b/src/libstd/rand/reseeding.rs @@ -76,19 +76,21 @@ impl<R: Rng, Rsdr: Reseeder<R>> Rng for ReseedingRng<R, Rsdr> { } } -impl<S, R: SeedableRng<S>, Rsdr: Reseeder<R> + Default> SeedableRng<S> for ReseedingRng<R, Rsdr> { - fn reseed(&mut self, seed: S) { +impl<S, R: SeedableRng<S>, Rsdr: Reseeder<R>> + SeedableRng<(Rsdr, S)> for ReseedingRng<R, Rsdr> { + 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<R, Rsdr> { + /// 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<R, Rsdr> { 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); |
