Skip to content

Commit fba5521

Browse files
authored
Add TryRngCore and TryCryptoRng traits (#1424)
This reworks fallibility, replacing the fixed `Error` type.
1 parent 1f81878 commit fba5521

38 files changed

+641
-759
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ compiler versions will be compatible. This is especially true of Rand's
9292
experimental `simd_support` feature.
9393

9494
Rand supports limited functionality in `no_std` mode (enabled via
95-
`default-features = false`). In this case, `OsRng` and `from_entropy` are
95+
`default-features = false`). In this case, `OsRng` and `from_os_rng` are
9696
unavailable (unless `getrandom` is enabled), large parts of `seq` are
9797
unavailable (unless `alloc` is enabled), and `thread_rng` and `random` are
9898
unavailable.

benches/benches/base_distributions.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ macro_rules! distr_int {
3232
($fnn:ident, $ty:ty, $distr:expr) => {
3333
#[bench]
3434
fn $fnn(b: &mut Bencher) {
35-
let mut rng = Pcg64Mcg::from_entropy();
35+
let mut rng = Pcg64Mcg::from_os_rng();
3636
let distr = $distr;
3737

3838
b.iter(|| {
@@ -52,7 +52,7 @@ macro_rules! distr_nz_int {
5252
($fnn:ident, $tynz:ty, $ty:ty, $distr:expr) => {
5353
#[bench]
5454
fn $fnn(b: &mut Bencher) {
55-
let mut rng = Pcg64Mcg::from_entropy();
55+
let mut rng = Pcg64Mcg::from_os_rng();
5656
let distr = $distr;
5757

5858
b.iter(|| {
@@ -72,7 +72,7 @@ macro_rules! distr_float {
7272
($fnn:ident, $ty:ty, $distr:expr) => {
7373
#[bench]
7474
fn $fnn(b: &mut Bencher) {
75-
let mut rng = Pcg64Mcg::from_entropy();
75+
let mut rng = Pcg64Mcg::from_os_rng();
7676
let distr = $distr;
7777

7878
b.iter(|| {
@@ -92,7 +92,7 @@ macro_rules! distr_duration {
9292
($fnn:ident, $distr:expr) => {
9393
#[bench]
9494
fn $fnn(b: &mut Bencher) {
95-
let mut rng = Pcg64Mcg::from_entropy();
95+
let mut rng = Pcg64Mcg::from_os_rng();
9696
let distr = $distr;
9797

9898
b.iter(|| {
@@ -114,7 +114,7 @@ macro_rules! distr {
114114
($fnn:ident, $ty:ty, $distr:expr) => {
115115
#[bench]
116116
fn $fnn(b: &mut Bencher) {
117-
let mut rng = Pcg64Mcg::from_entropy();
117+
let mut rng = Pcg64Mcg::from_os_rng();
118118
let distr = $distr;
119119

120120
b.iter(|| {
@@ -191,15 +191,15 @@ macro_rules! gen_range_int {
191191
($fnn:ident, $ty:ident, $low:expr, $high:expr) => {
192192
#[bench]
193193
fn $fnn(b: &mut Bencher) {
194-
let mut rng = Pcg64Mcg::from_entropy();
194+
let mut rng = Pcg64Mcg::from_os_rng();
195195

196196
b.iter(|| {
197197
let mut high = $high;
198198
let mut accum: $ty = 0;
199199
for _ in 0..RAND_BENCH_N {
200200
accum = accum.wrapping_add(rng.gen_range($low..high));
201201
// force recalculation of range each time
202-
high = high.wrapping_add(1) & core::$ty::MAX;
202+
high = high.wrapping_add(1) & $ty::MAX;
203203
}
204204
accum
205205
});
@@ -230,7 +230,7 @@ macro_rules! gen_range_float {
230230
($fnn:ident, $ty:ident, $low:expr, $high:expr) => {
231231
#[bench]
232232
fn $fnn(b: &mut Bencher) {
233-
let mut rng = Pcg64Mcg::from_entropy();
233+
let mut rng = Pcg64Mcg::from_os_rng();
234234

235235
b.iter(|| {
236236
let mut high = $high;
@@ -267,7 +267,7 @@ macro_rules! uniform_sample {
267267
($fnn:ident, $type:ident, $low:expr, $high:expr, $count:expr) => {
268268
#[bench]
269269
fn $fnn(b: &mut Bencher) {
270-
let mut rng = Pcg64Mcg::from_entropy();
270+
let mut rng = Pcg64Mcg::from_os_rng();
271271
let low = black_box($low);
272272
let high = black_box($high);
273273
b.iter(|| {
@@ -286,7 +286,7 @@ macro_rules! uniform_inclusive {
286286
($fnn:ident, $type:ident, $low:expr, $high:expr, $count:expr) => {
287287
#[bench]
288288
fn $fnn(b: &mut Bencher) {
289-
let mut rng = Pcg64Mcg::from_entropy();
289+
let mut rng = Pcg64Mcg::from_os_rng();
290290
let low = black_box($low);
291291
let high = black_box($high);
292292
b.iter(|| {
@@ -306,7 +306,7 @@ macro_rules! uniform_single {
306306
($fnn:ident, $type:ident, $low:expr, $high:expr, $count:expr) => {
307307
#[bench]
308308
fn $fnn(b: &mut Bencher) {
309-
let mut rng = Pcg64Mcg::from_entropy();
309+
let mut rng = Pcg64Mcg::from_os_rng();
310310
let low = black_box($low);
311311
let high = black_box($high);
312312
b.iter(|| {

benches/benches/generators.rs

+33-32
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@ const RAND_BENCH_N: u64 = 1000;
1515
const BYTES_LEN: usize = 1024;
1616

1717
use core::mem::size_of;
18+
use rand_chacha::rand_core::UnwrapErr;
1819
use test::{black_box, Bencher};
1920

2021
use rand::prelude::*;
2122
use rand::rngs::ReseedingRng;
2223
use rand::rngs::{mock::StepRng, OsRng};
2324
use rand_chacha::{ChaCha12Rng, ChaCha20Core, ChaCha20Rng, ChaCha8Rng};
24-
use rand_pcg::{Pcg32, Pcg64, Pcg64Mcg, Pcg64Dxsm};
25+
use rand_pcg::{Pcg32, Pcg64, Pcg64Dxsm, Pcg64Mcg};
2526

2627
macro_rules! gen_bytes {
2728
($fnn:ident, $gen:expr) => {
@@ -41,17 +42,17 @@ macro_rules! gen_bytes {
4142
}
4243

4344
gen_bytes!(gen_bytes_step, StepRng::new(0, 1));
44-
gen_bytes!(gen_bytes_pcg32, Pcg32::from_entropy());
45-
gen_bytes!(gen_bytes_pcg64, Pcg64::from_entropy());
46-
gen_bytes!(gen_bytes_pcg64mcg, Pcg64Mcg::from_entropy());
47-
gen_bytes!(gen_bytes_pcg64dxsm, Pcg64Dxsm::from_entropy());
48-
gen_bytes!(gen_bytes_chacha8, ChaCha8Rng::from_entropy());
49-
gen_bytes!(gen_bytes_chacha12, ChaCha12Rng::from_entropy());
50-
gen_bytes!(gen_bytes_chacha20, ChaCha20Rng::from_entropy());
51-
gen_bytes!(gen_bytes_std, StdRng::from_entropy());
45+
gen_bytes!(gen_bytes_pcg32, Pcg32::from_os_rng());
46+
gen_bytes!(gen_bytes_pcg64, Pcg64::from_os_rng());
47+
gen_bytes!(gen_bytes_pcg64mcg, Pcg64Mcg::from_os_rng());
48+
gen_bytes!(gen_bytes_pcg64dxsm, Pcg64Dxsm::from_os_rng());
49+
gen_bytes!(gen_bytes_chacha8, ChaCha8Rng::from_os_rng());
50+
gen_bytes!(gen_bytes_chacha12, ChaCha12Rng::from_os_rng());
51+
gen_bytes!(gen_bytes_chacha20, ChaCha20Rng::from_os_rng());
52+
gen_bytes!(gen_bytes_std, StdRng::from_os_rng());
5253
#[cfg(feature = "small_rng")]
5354
gen_bytes!(gen_bytes_small, SmallRng::from_thread_rng());
54-
gen_bytes!(gen_bytes_os, OsRng);
55+
gen_bytes!(gen_bytes_os, UnwrapErr(OsRng));
5556
gen_bytes!(gen_bytes_thread, thread_rng());
5657

5758
macro_rules! gen_uint {
@@ -62,7 +63,7 @@ macro_rules! gen_uint {
6263
b.iter(|| {
6364
let mut accum: $ty = 0;
6465
for _ in 0..RAND_BENCH_N {
65-
accum = accum.wrapping_add(rng.gen::<$ty>());
66+
accum = accum.wrapping_add(rng.random::<$ty>());
6667
}
6768
accum
6869
});
@@ -72,40 +73,40 @@ macro_rules! gen_uint {
7273
}
7374

7475
gen_uint!(gen_u32_step, u32, StepRng::new(0, 1));
75-
gen_uint!(gen_u32_pcg32, u32, Pcg32::from_entropy());
76-
gen_uint!(gen_u32_pcg64, u32, Pcg64::from_entropy());
77-
gen_uint!(gen_u32_pcg64mcg, u32, Pcg64Mcg::from_entropy());
78-
gen_uint!(gen_u32_pcg64dxsm, u32, Pcg64Dxsm::from_entropy());
79-
gen_uint!(gen_u32_chacha8, u32, ChaCha8Rng::from_entropy());
80-
gen_uint!(gen_u32_chacha12, u32, ChaCha12Rng::from_entropy());
81-
gen_uint!(gen_u32_chacha20, u32, ChaCha20Rng::from_entropy());
82-
gen_uint!(gen_u32_std, u32, StdRng::from_entropy());
76+
gen_uint!(gen_u32_pcg32, u32, Pcg32::from_os_rng());
77+
gen_uint!(gen_u32_pcg64, u32, Pcg64::from_os_rng());
78+
gen_uint!(gen_u32_pcg64mcg, u32, Pcg64Mcg::from_os_rng());
79+
gen_uint!(gen_u32_pcg64dxsm, u32, Pcg64Dxsm::from_os_rng());
80+
gen_uint!(gen_u32_chacha8, u32, ChaCha8Rng::from_os_rng());
81+
gen_uint!(gen_u32_chacha12, u32, ChaCha12Rng::from_os_rng());
82+
gen_uint!(gen_u32_chacha20, u32, ChaCha20Rng::from_os_rng());
83+
gen_uint!(gen_u32_std, u32, StdRng::from_os_rng());
8384
#[cfg(feature = "small_rng")]
8485
gen_uint!(gen_u32_small, u32, SmallRng::from_thread_rng());
85-
gen_uint!(gen_u32_os, u32, OsRng);
86+
gen_uint!(gen_u32_os, u32, UnwrapErr(OsRng));
8687
gen_uint!(gen_u32_thread, u32, thread_rng());
8788

8889
gen_uint!(gen_u64_step, u64, StepRng::new(0, 1));
89-
gen_uint!(gen_u64_pcg32, u64, Pcg32::from_entropy());
90-
gen_uint!(gen_u64_pcg64, u64, Pcg64::from_entropy());
91-
gen_uint!(gen_u64_pcg64mcg, u64, Pcg64Mcg::from_entropy());
92-
gen_uint!(gen_u64_pcg64dxsm, u64, Pcg64Dxsm::from_entropy());
93-
gen_uint!(gen_u64_chacha8, u64, ChaCha8Rng::from_entropy());
94-
gen_uint!(gen_u64_chacha12, u64, ChaCha12Rng::from_entropy());
95-
gen_uint!(gen_u64_chacha20, u64, ChaCha20Rng::from_entropy());
96-
gen_uint!(gen_u64_std, u64, StdRng::from_entropy());
90+
gen_uint!(gen_u64_pcg32, u64, Pcg32::from_os_rng());
91+
gen_uint!(gen_u64_pcg64, u64, Pcg64::from_os_rng());
92+
gen_uint!(gen_u64_pcg64mcg, u64, Pcg64Mcg::from_os_rng());
93+
gen_uint!(gen_u64_pcg64dxsm, u64, Pcg64Dxsm::from_os_rng());
94+
gen_uint!(gen_u64_chacha8, u64, ChaCha8Rng::from_os_rng());
95+
gen_uint!(gen_u64_chacha12, u64, ChaCha12Rng::from_os_rng());
96+
gen_uint!(gen_u64_chacha20, u64, ChaCha20Rng::from_os_rng());
97+
gen_uint!(gen_u64_std, u64, StdRng::from_os_rng());
9798
#[cfg(feature = "small_rng")]
9899
gen_uint!(gen_u64_small, u64, SmallRng::from_thread_rng());
99-
gen_uint!(gen_u64_os, u64, OsRng);
100+
gen_uint!(gen_u64_os, u64, UnwrapErr(OsRng));
100101
gen_uint!(gen_u64_thread, u64, thread_rng());
101102

102103
macro_rules! init_gen {
103104
($fnn:ident, $gen:ident) => {
104105
#[bench]
105106
fn $fnn(b: &mut Bencher) {
106-
let mut rng = Pcg32::from_entropy();
107+
let mut rng = Pcg32::from_os_rng();
107108
b.iter(|| {
108-
let r2 = $gen::from_rng(&mut rng).unwrap();
109+
let r2 = $gen::from_rng(&mut rng);
109110
r2
110111
});
111112
}
@@ -125,7 +126,7 @@ macro_rules! reseeding_bytes {
125126
($fnn:ident, $thresh:expr) => {
126127
#[bench]
127128
fn $fnn(b: &mut Bencher) {
128-
let mut rng = ReseedingRng::new(ChaCha20Core::from_entropy(), $thresh * 1024, OsRng);
129+
let mut rng = ReseedingRng::new(ChaCha20Core::from_os_rng(), $thresh * 1024, OsRng);
129130
let mut buf = [0u8; RESEEDING_BYTES_LEN];
130131
b.iter(|| {
131132
for _ in 0..RESEEDING_BENCH_N {

benches/benches/misc.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use rand_pcg::{Pcg32, Pcg64Mcg};
2020

2121
#[bench]
2222
fn misc_gen_bool_const(b: &mut Bencher) {
23-
let mut rng = Pcg32::from_rng(&mut thread_rng()).unwrap();
23+
let mut rng = Pcg32::from_rng(&mut thread_rng());
2424
b.iter(|| {
2525
let mut accum = true;
2626
for _ in 0..RAND_BENCH_N {
@@ -32,7 +32,7 @@ fn misc_gen_bool_const(b: &mut Bencher) {
3232

3333
#[bench]
3434
fn misc_gen_bool_var(b: &mut Bencher) {
35-
let mut rng = Pcg32::from_rng(&mut thread_rng()).unwrap();
35+
let mut rng = Pcg32::from_rng(&mut thread_rng());
3636
b.iter(|| {
3737
let mut accum = true;
3838
let mut p = 0.18;
@@ -46,7 +46,7 @@ fn misc_gen_bool_var(b: &mut Bencher) {
4646

4747
#[bench]
4848
fn misc_gen_ratio_const(b: &mut Bencher) {
49-
let mut rng = Pcg32::from_rng(&mut thread_rng()).unwrap();
49+
let mut rng = Pcg32::from_rng(&mut thread_rng());
5050
b.iter(|| {
5151
let mut accum = true;
5252
for _ in 0..RAND_BENCH_N {
@@ -58,7 +58,7 @@ fn misc_gen_ratio_const(b: &mut Bencher) {
5858

5959
#[bench]
6060
fn misc_gen_ratio_var(b: &mut Bencher) {
61-
let mut rng = Pcg32::from_rng(&mut thread_rng()).unwrap();
61+
let mut rng = Pcg32::from_rng(&mut thread_rng());
6262
b.iter(|| {
6363
let mut accum = true;
6464
for i in 2..(RAND_BENCH_N as u32 + 2) {
@@ -70,7 +70,7 @@ fn misc_gen_ratio_var(b: &mut Bencher) {
7070

7171
#[bench]
7272
fn misc_bernoulli_const(b: &mut Bencher) {
73-
let mut rng = Pcg32::from_rng(&mut thread_rng()).unwrap();
73+
let mut rng = Pcg32::from_rng(&mut thread_rng());
7474
b.iter(|| {
7575
let d = Bernoulli::new(0.18).unwrap();
7676
let mut accum = true;
@@ -83,7 +83,7 @@ fn misc_bernoulli_const(b: &mut Bencher) {
8383

8484
#[bench]
8585
fn misc_bernoulli_var(b: &mut Bencher) {
86-
let mut rng = Pcg32::from_rng(&mut thread_rng()).unwrap();
86+
let mut rng = Pcg32::from_rng(&mut thread_rng());
8787
b.iter(|| {
8888
let mut accum = true;
8989
let mut p = 0.18;
@@ -99,7 +99,7 @@ fn misc_bernoulli_var(b: &mut Bencher) {
9999
#[bench]
100100
fn gen_1kb_u16_iter_repeat(b: &mut Bencher) {
101101
use core::iter;
102-
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng()).unwrap();
102+
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng());
103103
b.iter(|| {
104104
let v: Vec<u16> = iter::repeat(()).map(|()| rng.random()).take(512).collect();
105105
v
@@ -109,7 +109,7 @@ fn gen_1kb_u16_iter_repeat(b: &mut Bencher) {
109109

110110
#[bench]
111111
fn gen_1kb_u16_sample_iter(b: &mut Bencher) {
112-
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng()).unwrap();
112+
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng());
113113
b.iter(|| {
114114
let v: Vec<u16> = Standard.sample_iter(&mut rng).take(512).collect();
115115
v
@@ -119,7 +119,7 @@ fn gen_1kb_u16_sample_iter(b: &mut Bencher) {
119119

120120
#[bench]
121121
fn gen_1kb_u16_gen_array(b: &mut Bencher) {
122-
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng()).unwrap();
122+
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng());
123123
b.iter(|| {
124124
// max supported array length is 32!
125125
let v: [[u16; 32]; 16] = rng.random();
@@ -130,7 +130,7 @@ fn gen_1kb_u16_gen_array(b: &mut Bencher) {
130130

131131
#[bench]
132132
fn gen_1kb_u16_fill(b: &mut Bencher) {
133-
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng()).unwrap();
133+
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng());
134134
let mut buf = [0u16; 512];
135135
b.iter(|| {
136136
rng.fill(&mut buf[..]);
@@ -142,7 +142,7 @@ fn gen_1kb_u16_fill(b: &mut Bencher) {
142142
#[bench]
143143
fn gen_1kb_u64_iter_repeat(b: &mut Bencher) {
144144
use core::iter;
145-
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng()).unwrap();
145+
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng());
146146
b.iter(|| {
147147
let v: Vec<u64> = iter::repeat(()).map(|()| rng.random()).take(128).collect();
148148
v
@@ -152,7 +152,7 @@ fn gen_1kb_u64_iter_repeat(b: &mut Bencher) {
152152

153153
#[bench]
154154
fn gen_1kb_u64_sample_iter(b: &mut Bencher) {
155-
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng()).unwrap();
155+
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng());
156156
b.iter(|| {
157157
let v: Vec<u64> = Standard.sample_iter(&mut rng).take(128).collect();
158158
v
@@ -162,7 +162,7 @@ fn gen_1kb_u64_sample_iter(b: &mut Bencher) {
162162

163163
#[bench]
164164
fn gen_1kb_u64_gen_array(b: &mut Bencher) {
165-
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng()).unwrap();
165+
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng());
166166
b.iter(|| {
167167
// max supported array length is 32!
168168
let v: [[u64; 32]; 4] = rng.random();
@@ -173,7 +173,7 @@ fn gen_1kb_u64_gen_array(b: &mut Bencher) {
173173

174174
#[bench]
175175
fn gen_1kb_u64_fill(b: &mut Bencher) {
176-
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng()).unwrap();
176+
let mut rng = Pcg64Mcg::from_rng(&mut thread_rng());
177177
let mut buf = [0u64; 128];
178178
b.iter(|| {
179179
rng.fill(&mut buf[..]);

0 commit comments

Comments
 (0)