binius_transcript/fiat_shamir/
sampling.rs1use std::array;
13
14use bytes::Buf;
15
16#[auto_impl::auto_impl(&mut)]
17pub trait CanSample<T> {
18 fn sample(&mut self) -> T;
19
20 fn sample_array<const N: usize>(&mut self) -> [T; N] {
21 array::from_fn(|_| self.sample())
22 }
23
24 fn sample_vec(&mut self, n: usize) -> Vec<T> {
25 (0..n).map(|_| self.sample()).collect()
26 }
27}
28
29#[auto_impl::auto_impl(&mut)]
30pub trait CanSampleBits<T> {
31 fn sample_bits(&mut self, bits: usize) -> T;
32}
33
34pub fn sample_bits_reader<Reader: Buf>(mut reader: Reader, bits: usize) -> u32 {
35 let bits = bits.min(u32::BITS as usize);
36
37 let bytes_to_sample = size_of::<u32>();
38
39 let mut bytes = [0u8; size_of::<u32>()];
40
41 reader.copy_to_slice(&mut bytes[..bytes_to_sample]);
42
43 let unmasked = u32::from_le_bytes(bytes);
44 let mask = 1u32.checked_shl(bits as u32).map_or(u32::MAX, |x| x - 1);
45 mask & unmasked
46}