1use core::ops::RangeBounds;
2
3use crate::{Rng, SeedSource};
4
5thread_local! {
6 static RNG: Rng = const { Rng::fixed_tls() };
7}
8
9#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
10pub fn seed() {
12 RNG.with(|f| f.seed())
13}
14
15#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
16pub fn seed_source() -> SeedSource {
18 RNG.with(|f| f.seed_source())
19}
20
21#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
22pub fn seed_with_64bit(seed: u64) {
24 RNG.with(|f| f.seed_with_64bit(seed))
25}
26
27#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
28pub fn seed_with_192bit(seed: [u64; 3]) {
39 RNG.with(|f| f.seed_with_192bit(seed))
40}
41
42#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
43pub fn mix() {
47 RNG.with(|rng| rng.mix())
48}
49
50#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
51#[inline(always)]
53pub fn u8() -> u8 {
54 RNG.with(|rng| rng.u8())
55}
56
57#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
58#[inline(always)]
60pub fn u16() -> u16 {
61 RNG.with(|rng| rng.u16())
62}
63
64#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
65#[inline(always)]
67pub fn u32() -> u32 {
68 RNG.with(|rng| rng.u32())
69}
70
71#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
72#[inline(always)]
74pub fn u64() -> u64 {
75 RNG.with(|rng| rng.u64())
76}
77
78#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
79#[inline(always)]
81pub fn usize() -> usize {
82 RNG.with(|rng| rng.usize())
83}
84
85#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
86#[inline(always)]
88pub fn i8() -> i8 {
89 RNG.with(|rng| rng.i8())
90}
91
92#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
93#[inline(always)]
95pub fn i16() -> i16 {
96 RNG.with(|rng| rng.i16())
97}
98
99#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
100#[inline(always)]
102pub fn i32() -> i32 {
103 RNG.with(|rng| rng.i32())
104}
105
106#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
107#[inline(always)]
109pub fn i64() -> i64 {
110 RNG.with(|rng| rng.i64())
111}
112
113#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
114#[inline(always)]
116pub fn isize() -> isize {
117 RNG.with(|rng| rng.isize())
118}
119
120#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
121#[inline(always)]
123pub fn f32() -> f32 {
124 RNG.with(|rng| rng.f32())
125}
126
127#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
128#[inline(always)]
130pub fn f64() -> f64 {
131 RNG.with(|rng| rng.f64())
132}
133
134#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
135#[inline(always)]
137pub fn bool() -> bool {
138 RNG.with(|rng| rng.bool())
139}
140
141#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
142pub fn shuffle<T>(slice: &mut [T]) {
144 RNG.with(|rng| rng.shuffle(slice))
145}
146
147#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
148pub fn fill_bytes(slice: &mut [u8]) {
150 RNG.with(|rng| rng.fill_bytes(slice))
151}
152
153#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
154#[inline(always)]
159pub fn mod_u8(n: u8) -> u8 {
160 RNG.with(|rng| rng.mod_u8(n))
161}
162
163#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
164#[inline(always)]
169pub fn mod_u16(n: u16) -> u16 {
170 RNG.with(|rng| rng.mod_u16(n))
171}
172
173#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
174#[inline(always)]
179pub fn mod_u32(n: u32) -> u32 {
180 RNG.with(|rng| rng.mod_u32(n))
181}
182
183#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
184#[inline(always)]
189pub fn mod_u64(n: u64) -> u64 {
190 RNG.with(|rng| rng.mod_u64(n))
191}
192
193#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
194#[inline(always)]
199pub fn mod_usize(n: usize) -> usize {
200 RNG.with(|rng| rng.mod_usize(n))
201}
202
203#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
204#[inline(always)]
206pub fn range_u8<T: RangeBounds<u8>>(range: T) -> u8 {
207 RNG.with(|rng| rng.range_u8(range))
208}
209
210#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
211#[inline(always)]
213pub fn range_u16<T: RangeBounds<u16>>(range: T) -> u16 {
214 RNG.with(|rng| rng.range_u16(range))
215}
216
217#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
218#[inline(always)]
220pub fn range_u32<T: RangeBounds<u32>>(range: T) -> u32 {
221 RNG.with(|rng| rng.range_u32(range))
222}
223
224#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
225#[inline(always)]
227pub fn range_u64<T: RangeBounds<u64>>(range: T) -> u64 {
228 RNG.with(|rng| rng.range_u64(range))
229}
230
231#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
232#[inline(always)]
234pub fn range_usize<T: RangeBounds<usize>>(range: T) -> usize {
235 RNG.with(|rng| rng.range_usize(range))
236}
237
238#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
239#[inline(always)]
241pub fn range_i8<T: RangeBounds<i8>>(range: T) -> i8 {
242 RNG.with(|rng| rng.range_i8(range))
243}
244
245#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
246#[inline(always)]
248pub fn range_i16<T: RangeBounds<i16>>(range: T) -> i16 {
249 RNG.with(|rng| rng.range_i16(range))
250}
251
252#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
253#[inline(always)]
255pub fn range_i32<T: RangeBounds<i32>>(range: T) -> i32 {
256 RNG.with(|rng| rng.range_i32(range))
257}
258
259#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
260#[inline(always)]
262pub fn range_i64<T: RangeBounds<i64>>(range: T) -> i64 {
263 RNG.with(|rng| rng.range_i64(range))
264}
265
266#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
267#[inline(always)]
269pub fn range_isize<T: RangeBounds<isize>>(range: T) -> isize {
270 RNG.with(|rng| rng.range_isize(range))
271}