about summary refs log tree commit diff
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2013-10-09 02:22:37 +1100
committerHuon Wilson <dbau.pp+github@gmail.com>2013-10-09 22:22:43 +1100
commitd86de18b6198547f0a39e217123d8ec9ef4a9988 (patch)
tree16fe3ff6012e6395db3b80c5b01eb92b76db05d4
parent649c1759e8b56f0ac31dd31e46eae81b7ffd1e2c (diff)
downloadrust-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.rs3
-rw-r--r--src/libstd/rand/reseeding.rs22
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);