use byte_set::ByteSet;
use fixedbitset::FixedBitSet;
use hashbrown::HashSet as HashbrownSet;
use rand::{seq::SliceRandom, Rng};
use std::{
collections::{BTreeSet, BinaryHeap, HashSet},
hash::BuildHasher,
};
pub fn shuffled_bytes<R: Rng>(rng: &mut R) -> [u8; 256] {
let mut input = [0u8; 256];
for i in 0..=u8::max_value() {
input[i as usize] = i;
}
input.shuffle(rng);
input
}
pub trait Rand {
fn rand_len<R: Rng>(len: usize, rng: &mut R) -> Self;
}
impl Rand for ByteSet {
fn rand_len<R: Rng>(len: usize, rng: &mut R) -> Self {
let input = shuffled_bytes(rng);
input[..len].iter().collect()
}
}
impl Rand for BTreeSet<u8> {
fn rand_len<R: Rng>(len: usize, rng: &mut R) -> Self {
let input = shuffled_bytes(rng);
input[..len].iter().cloned().collect()
}
}
impl Rand for BinaryHeap<u8> {
fn rand_len<R: Rng>(len: usize, rng: &mut R) -> Self {
let input = shuffled_bytes(rng);
input[..len].iter().cloned().collect()
}
}
impl<S: BuildHasher + Default> Rand for HashSet<u8, S> {
fn rand_len<R: Rng>(len: usize, rng: &mut R) -> Self {
let input = shuffled_bytes(rng);
input[..len].iter().cloned().collect()
}
}
impl Rand for Vec<u8> {
fn rand_len<R: Rng>(len: usize, rng: &mut R) -> Self {
let input = shuffled_bytes(rng);
input[..len].into()
}
}
impl Rand for FixedBitSet {
fn rand_len<R: Rng>(len: usize, rng: &mut R) -> Self {
let input = shuffled_bytes(rng);
input[..len]
.iter()
.cloned()
.map(|byte| byte as usize)
.collect()
}
}
impl<S: BuildHasher + Default> Rand for HashbrownSet<u8, S> {
fn rand_len<R: Rng>(len: usize, rng: &mut R) -> Self {
let input = shuffled_bytes(rng);
input[..len].iter().cloned().collect()
}
}