Skip to content

Commit b7d04ee

Browse files
committed
XorShift serde
1 parent 44455f0 commit b7d04ee

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

src/prng/xorshift.rs

+35
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use impls;
2626
/// RNGs"](https://www.jstatsoft.org/v08/i14/paper). *Journal of
2727
/// Statistical Software*. Vol. 8 (Issue 14).
2828
#[derive(Clone)]
29+
#[cfg_attr(feature="serde-1", derive(Serialize,Deserialize))]
2930
pub struct XorShiftRng {
3031
x: w<u32>,
3132
y: w<u32>,
@@ -115,3 +116,37 @@ impl Rand for XorShiftRng {
115116
XorShiftRng { x: w(x), y: w(y), z: w(z), w: w(w_) }
116117
}
117118
}
119+
120+
#[cfg(test)]
121+
mod tests {
122+
use {Rng, SeedableRng};
123+
124+
#[cfg(feature="serde-1")]
125+
#[test]
126+
fn test_serde() {
127+
use super::XorShiftRng;
128+
use thread_rng;
129+
use bincode;
130+
use std::io::{BufWriter, BufReader};
131+
132+
let seed: [u32; 4] = thread_rng().gen();
133+
let mut rng: XorShiftRng = SeedableRng::from_seed(seed);
134+
135+
let buf: Vec<u8> = Vec::new();
136+
let mut buf = BufWriter::new(buf);
137+
bincode::serialize_into(&mut buf, &rng, bincode::Infinite).expect("Could not serialize");
138+
139+
let buf = buf.into_inner().unwrap();
140+
let mut read = BufReader::new(&buf[..]);
141+
let mut deserialized: XorShiftRng = bincode::deserialize_from(&mut read, bincode::Infinite).expect("Could not deserialize");
142+
143+
assert_eq!(rng.x, deserialized.x);
144+
assert_eq!(rng.y, deserialized.y);
145+
assert_eq!(rng.z, deserialized.z);
146+
assert_eq!(rng.w, deserialized.w);
147+
148+
for _ in 0..16 {
149+
assert_eq!(rng.next_u64(), deserialized.next_u64());
150+
}
151+
}
152+
}

0 commit comments

Comments
 (0)