Skip to content

Commit e32b4c9

Browse files
committed
Remove Reseeder trait
1 parent 486209c commit e32b4c9

File tree

2 files changed

+22
-45
lines changed

2 files changed

+22
-45
lines changed

src/lib.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ use prng::Isaac64Rng as IsaacWordRng;
276276

277277
use distributions::{Range, IndependentSample};
278278
use distributions::range::SampleRange;
279-
#[cfg(feature="std")]use reseeding::{ReseedingRng, ReseedWithNew};
279+
#[cfg(feature="std")]use reseeding::{ReseedingRng};
280280

281281
// public modules
282282
pub mod distributions;
@@ -942,20 +942,20 @@ pub fn weak_rng() -> XorShiftRng {
942942
#[cfg(feature="std")]
943943
#[derive(Clone, Debug)]
944944
pub struct ThreadRng {
945-
rng: Rc<RefCell<ReseedingRng<StdRng, ReseedWithNew>>>,
945+
rng: Rc<RefCell<ReseedingRng<StdRng, EntropySource>>>,
946946
}
947947

948948
#[cfg(feature="std")]
949949
thread_local!(
950-
static THREAD_RNG_KEY: Rc<RefCell<ReseedingRng<StdRng, ReseedWithNew>>> = {
950+
static THREAD_RNG_KEY: Rc<RefCell<ReseedingRng<StdRng, EntropySource>>> = {
951951
const THREAD_RNG_RESEED_THRESHOLD: u64 = 32_768;
952-
let r = match StdRng::new() {
953-
Ok(r) => r,
954-
Err(e) => panic!("could not initialize thread_rng: {:?}", e)
955-
};
952+
let mut entropy_source = EntropySource::new()
953+
.expect("could not initialize thread_rng");
954+
let r = StdRng::from_rng(&mut entropy_source)
955+
.expect("could not initialize thread_rng");
956956
let rng = ReseedingRng::new(r,
957957
THREAD_RNG_RESEED_THRESHOLD,
958-
ReseedWithNew);
958+
entropy_source);
959959
Rc::new(RefCell::new(rng))
960960
}
961961
);

src/reseeding.rs

+14-37
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111
//! A wrapper around another RNG that reseeds it after it
1212
//! generates a certain number of random bytes.
1313
14-
use {Rng, Error};
15-
#[cfg(feature="std")]
16-
use NewSeeded;
14+
use {Rng, SeedableRng, Error};
1715

1816
/// A wrapper around any RNG which reseeds the underlying RNG after it
1917
/// has generated a certain number of random bytes.
@@ -23,10 +21,10 @@ pub struct ReseedingRng<R, Rsdr> {
2321
generation_threshold: u64,
2422
bytes_generated: u64,
2523
/// Controls the behaviour when reseeding the RNG.
26-
pub reseeder: Rsdr,
24+
reseeder: Rsdr,
2725
}
2826

29-
impl<R: Rng, Rsdr: Reseeder<R>> ReseedingRng<R, Rsdr> {
27+
impl<R: Rng+SeedableRng, Rsdr: Rng> ReseedingRng<R, Rsdr> {
3028
/// Create a new `ReseedingRng` with the given parameters.
3129
///
3230
/// # Arguments
@@ -47,14 +45,14 @@ impl<R: Rng, Rsdr: Reseeder<R>> ReseedingRng<R, Rsdr> {
4745
/// generated exceed the threshold.
4846
pub fn reseed_if_necessary(&mut self) {
4947
if self.bytes_generated >= self.generation_threshold {
50-
self.reseeder.reseed(&mut self.rng).unwrap();
48+
R::from_rng(&mut self.reseeder).map(|result| self.rng = result).unwrap();
5149
self.bytes_generated = 0;
5250
}
5351
}
5452
}
5553

5654

57-
impl<R: Rng, Rsdr: Reseeder<R>> Rng for ReseedingRng<R, Rsdr> {
55+
impl<R: Rng+SeedableRng, Rsdr: Rng> Rng for ReseedingRng<R, Rsdr> {
5856
fn next_u32(&mut self) -> u32 {
5957
self.reseed_if_necessary();
6058
self.bytes_generated += 4;
@@ -80,35 +78,11 @@ impl<R: Rng, Rsdr: Reseeder<R>> Rng for ReseedingRng<R, Rsdr> {
8078
}
8179
}
8280

83-
/// Something that can be used to reseed an RNG via `ReseedingRng`.
84-
///
85-
/// Note that implementations should support `Clone` only if reseeding is
86-
/// deterministic (no external entropy source). This is so that a `ReseedingRng`
87-
/// only supports `Clone` if fully deterministic.
88-
pub trait Reseeder<R: ?Sized> {
89-
/// Reseed the given RNG.
90-
///
91-
/// On error, this should just forward the source error; errors are handled
92-
/// by the caller.
93-
fn reseed(&mut self, rng: &mut R) -> Result<(), Error>;
94-
}
95-
96-
/// Reseed an RNG using `NewSeeded` to replace the current instance.
97-
#[cfg(feature="std")]
98-
#[derive(Debug)]
99-
pub struct ReseedWithNew;
100-
101-
#[cfg(feature="std")]
102-
impl<R: Rng + NewSeeded> Reseeder<R> for ReseedWithNew {
103-
fn reseed(&mut self, rng: &mut R) -> Result<(), Error> {
104-
R::new().map(|result| *rng = result)
105-
}
106-
}
10781

10882
#[cfg(test)]
10983
mod test {
11084
use {impls, le};
111-
use super::{ReseedingRng, Reseeder};
85+
use super::{ReseedingRng};
11286
use {SeedableRng, Rng, Error};
11387

11488
struct Counter {
@@ -139,17 +113,20 @@ mod test {
139113
}
140114

141115
#[derive(Debug, Clone)]
142-
struct ReseedCounter;
143-
impl Reseeder<Counter> for ReseedCounter {
144-
fn reseed(&mut self, rng: &mut Counter) -> Result<(), Error> {
145-
*rng = Counter { i: 0 };
116+
struct ResetCounter;
117+
impl Rng for ResetCounter {
118+
fn next_u32(&mut self) -> u32 { unimplemented!() }
119+
fn next_u64(&mut self) -> u64 { unimplemented!() }
120+
fn fill_bytes(&mut self, _dest: &mut [u8]) { unimplemented!() }
121+
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> {
122+
for i in dest.iter_mut() { *i = 0; }
146123
Ok(())
147124
}
148125
}
149126

150127
#[test]
151128
fn test_reseeding() {
152-
let mut rs = ReseedingRng::new(Counter {i:0}, 400, ReseedCounter);
129+
let mut rs = ReseedingRng::new(Counter {i:0}, 400, ResetCounter);
153130

154131
let mut i = 0;
155132
for _ in 0..1000 {

0 commit comments

Comments
 (0)