Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move XorShiftRng to its own crate #557

Merged
merged 15 commits into from Jul 24, 2018
6 changes: 6 additions & 0 deletions .travis.yml
Expand Up @@ -14,19 +14,25 @@ matrix:
# TODO: use --tests instead of --lib on more recent compiler
- cargo test --lib --no-default-features
- cargo test --package rand_core --no-default-features
- cargo test --package rand_isaac --features serde1
- cargo test --package rand_xorshift --features serde1
- cargo test --features serde1,log
- rust: stable
os: osx
install:
script:
- cargo test --tests --no-default-features
- cargo test --package rand_core --no-default-features
- cargo test --package rand_isaac --features serde1
- cargo test --package rand_xorshift --features serde1
- cargo test --features serde1,log
- rust: beta
install:
script:
- cargo test --tests --no-default-features
- cargo test --package rand_core --no-default-features
- cargo test --package rand_isaac --features serde1
- cargo test --package rand_xorshift --features serde1
- cargo test --features serde1,log
- rust: nightly
install:
Expand Down
14 changes: 4 additions & 10 deletions Cargo.toml
Expand Up @@ -24,18 +24,17 @@ std = ["rand_core/std", "alloc", "libc", "winapi", "cloudabi", "fuchsia-zircon"]
alloc = ["rand_core/alloc"] # enables Vec and Box support (without std)
i128_support = [] # enables i128 and u128 support
simd_support = [] # enables SIMD support
serde1 = ["serde", "serde_derive", "rand_core/serde1"] # enables serialization for PRNGs
serde1 = ["rand_core/serde1", "rand_isaac/serde1", "rand_xorshift/serde1"] # enables serialization for PRNGs

[workspace]
members = ["rand_core", "rand_isaac"]
members = ["rand_core", "rand_isaac", "rand_xorshift"]

[dependencies]
rand_core = { path = "rand_core", version = "0.2", default-features = false }
# only for deprecations and benches:
rand_isaac = { path = "rand_isaac", version = "0.1", default-features = false }
rand_isaac = { path = "rand_isaac", version = "0.1" }
rand_xorshift = { path = "rand_xorshift", version = "0.1" }
log = { version = "0.4", optional = true }
serde = { version = "1", optional = true }
serde_derive = { version = "1", optional = true }

[target.'cfg(unix)'.dependencies]
libc = { version = "0.2", optional = true }
Expand All @@ -54,10 +53,5 @@ fuchsia-zircon = { version = "0.3.2", optional = true }
stdweb = { version = "0.4", optional = true }
wasm-bindgen = { version = "0.2", optional = true }

[dev-dependencies]
# This is for testing serde, unfortunately we can't specify feature-gated dev
# deps yet, see: https://github.com/rust-lang/cargo/issues/1596
bincode = "1.0"

[package.metadata.docs.rs]
all-features = true
14 changes: 7 additions & 7 deletions benches/distributions.rs
Expand Up @@ -11,14 +11,14 @@ use std::mem::size_of;
use test::Bencher;

use rand::{Rng, FromEntropy};
use rand::prng::XorShiftRng;
use rand::rngs::SmallRng;
use rand::distributions::*;

macro_rules! distr_int {
($fnn:ident, $ty:ty, $distr:expr) => {
#[bench]
fn $fnn(b: &mut Bencher) {
let mut rng = XorShiftRng::from_entropy();
let mut rng = SmallRng::from_entropy();
let distr = $distr;

b.iter(|| {
Expand All @@ -38,7 +38,7 @@ macro_rules! distr_float {
($fnn:ident, $ty:ty, $distr:expr) => {
#[bench]
fn $fnn(b: &mut Bencher) {
let mut rng = XorShiftRng::from_entropy();
let mut rng = SmallRng::from_entropy();
let distr = $distr;

b.iter(|| {
Expand All @@ -58,7 +58,7 @@ macro_rules! distr {
($fnn:ident, $ty:ty, $distr:expr) => {
#[bench]
fn $fnn(b: &mut Bencher) {
let mut rng = XorShiftRng::from_entropy();
let mut rng = SmallRng::from_entropy();
let distr = $distr;

b.iter(|| {
Expand Down Expand Up @@ -126,7 +126,7 @@ macro_rules! gen_range_int {
($fnn:ident, $ty:ident, $low:expr, $high:expr) => {
#[bench]
fn $fnn(b: &mut Bencher) {
let mut rng = XorShiftRng::from_entropy();
let mut rng = SmallRng::from_entropy();

b.iter(|| {
let mut high = $high;
Expand Down Expand Up @@ -155,7 +155,7 @@ macro_rules! gen_range_float {
($fnn:ident, $ty:ident, $low:expr, $high:expr) => {
#[bench]
fn $fnn(b: &mut Bencher) {
let mut rng = XorShiftRng::from_entropy();
let mut rng = SmallRng::from_entropy();

b.iter(|| {
let mut high = $high;
Expand All @@ -179,7 +179,7 @@ gen_range_float!(gen_range_f64, f64, 123.456f64, 7890.12);

#[bench]
fn dist_iter(b: &mut Bencher) {
let mut rng = XorShiftRng::from_entropy();
let mut rng = SmallRng::from_entropy();
let distr = Normal::new(-2.71828, 3.14159);
let mut iter = distr.sample_iter(&mut rng);

Expand Down
4 changes: 3 additions & 1 deletion benches/generators.rs
Expand Up @@ -3,6 +3,7 @@
extern crate test;
extern crate rand;
extern crate rand_isaac;
extern crate rand_xorshift;

const RAND_BENCH_N: u64 = 1000;
const BYTES_LEN: usize = 1024;
Expand All @@ -11,11 +12,12 @@ use std::mem::size_of;
use test::{black_box, Bencher};

use rand::prelude::*;
use rand::prng::{XorShiftRng, Hc128Rng, ChaChaRng};
use rand::prng::{Hc128Rng, ChaChaRng};
use rand::prng::hc128::Hc128Core;
use rand::rngs::adapter::ReseedingRng;
use rand::rngs::{OsRng, JitterRng, EntropyRng};
use rand_isaac::{IsaacRng, Isaac64Rng};
use rand_xorshift::XorShiftRng;

macro_rules! gen_bytes {
($fnn:ident, $gen:expr) => {
Expand Down
7 changes: 6 additions & 1 deletion rand_isaac/Cargo.toml
Expand Up @@ -18,9 +18,14 @@ travis-ci = { repository = "rust-lang-nursery/rand" }
appveyor = { repository = "alexcrichton/rand" }

[features]
serde1 = ["serde", "serde_derive"] # enables serde for BlockRng wrapper
serde1 = ["serde", "serde_derive", "rand_core/serde1"]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Feature serde1 implicitly implies std — should probably be documented with a comment here and in the README

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Feature serde1 implicitly implies std

What do you mean? We don't require std for the serde1 feature, and Serde works without std. We only need std for the tests.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, sorry. I mis-understood the double-negative conditional no_std attribute.


[dependencies]
rand_core = { path = "../rand_core", version = "0.2", default-features=false }
serde = { version = "1", optional = true }
serde_derive = { version = "^1.0.38", optional = true }

[dev-dependencies]
# This is for testing serde, unfortunately we can't specify feature-gated dev
# deps yet, see: https://github.com/rust-lang/cargo/issues/1596
bincode = "1"
2 changes: 1 addition & 1 deletion rand_isaac/src/isaac.rs
Expand Up @@ -453,7 +453,7 @@ mod test {
}

#[test]
#[cfg(all(feature="serde1", feature="std"))]
#[cfg(feature="serde1")]
fn test_isaac_serde() {
use bincode;
use std::io::{BufWriter, BufReader};
Expand Down
2 changes: 1 addition & 1 deletion rand_isaac/src/isaac64.rs
Expand Up @@ -445,7 +445,7 @@ mod test {
}

#[test]
#[cfg(all(feature="serde1", feature="std"))]
#[cfg(feature="serde1")]
fn test_isaac64_serde() {
use bincode;
use std::io::{BufWriter, BufReader};
Expand Down
7 changes: 5 additions & 2 deletions rand_isaac/src/lib.rs
Expand Up @@ -18,14 +18,17 @@
#![deny(missing_debug_implementations)]
#![doc(test(attr(allow(unused_variables), deny(warnings))))]

#![no_std]
#![cfg_attr(not(all(feature="serde1", test)), no_std)]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense, but is surprising

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only alternative I can see would be making our tests work with no_std.


extern crate rand_core;

#[cfg(test)] #[cfg(feature="serde1")] extern crate bincode;
#[cfg(feature="serde1")] extern crate serde;
#[cfg(feature="serde1")] #[macro_use] extern crate serde_derive;

// To test serialization we need bincode and the standard library
#[cfg(all(feature="serde1", test))] extern crate bincode;
#[cfg(all(feature="serde1", test))] extern crate std as core;

pub mod isaac;
pub mod isaac64;

Expand Down
8 changes: 8 additions & 0 deletions rand_xorshift/CHANGELOG.md
@@ -0,0 +1,8 @@
# Changelog
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.1.0] - 2018-07-16
- Initial release
31 changes: 31 additions & 0 deletions rand_xorshift/Cargo.toml
@@ -0,0 +1,31 @@
[package]
name = "rand_xorshift"
version = "0.1.0" # NB: When modifying, also modify html_root_url in lib.rs
authors = ["The Rust Project Developers"]
license = "MIT/Apache-2.0"
readme = "README.md"
repository = "https://github.com/rust-lang-nursery/rand"
documentation = "https://docs.rs/rand_isaac"
homepage = "https://crates.io/crates/rand_isaac"
description = """
Xorshift random number generator
"""
keywords = ["random", "rng", "xorshift"]
categories = ["algorithms", "no-std"]

[badges]
travis-ci = { repository = "rust-lang-nursery/rand" }
appveyor = { repository = "alexcrichton/rand" }

[features]
serde1 = ["serde", "serde_derive"]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as for rand_isaac


[dependencies]
rand_core = { path = "../rand_core", version = "0.2", default-features=false }
serde = { version = "1", optional = true }
serde_derive = { version = "^1.0.38", optional = true }

[dev-dependencies]
# This is for testing serde, unfortunately we can't specify feature-gated dev
# deps yet, see: https://github.com/rust-lang/cargo/issues/1596
bincode = "1"