use rand::Rng;
static DANGEROUS_NUMBERS_U8: &[u8] = &[
u8::MIN, u8::MAX, i8::MAX as u8, (i8::MAX as u8) + 1, ];
static DANGEROUS_NUMBERS_U16: &[u16] = &[
u16::MIN, u16::MAX, i16::MAX as u16, (i16::MAX as u16) + 1, 0xff7f,
0x0080,
];
static DANGEROUS_NUMBERS_U32: &[u32] = &[
u32::MIN,
u32::MAX,
i32::MAX as u32,
(i32::MAX as u32) + 1,
0xffff_ff7f,
0x0000_0080,
];
static DANGEROUS_NUMBERS_U64: &[u64] = &[
u64::MIN,
u64::MAX,
i64::MAX as u64,
(i64::MAX as u64) + 1,
0xffff_ffff_ffff_ff7f,
0x0000_0000_0000_0080,
];
static DANGEROUS_NUMBERS_F32: &[f32] = &[f32::INFINITY, f32::MAX, f32::MIN, f32::MIN_POSITIVE, f32::NAN, f32::NEG_INFINITY];
static DANGEROUS_NUMBERS_F64: &[f64] = &[f64::INFINITY, f64::MAX, f64::MIN, f64::MIN_POSITIVE, f64::NAN, f64::NEG_INFINITY];
#[doc(hidden)]
pub trait DangerousNumber<T> {
fn select_dangerous_number<R: Rng>(rng: &mut R) -> T;
fn dangerous_number_at_index(idx: usize) -> T;
fn dangerous_numbers_len() -> usize;
}
macro_rules! dangerous_number {
( $ty:ident, $nums:ident ) => {
impl DangerousNumber<$ty> for $ty {
fn select_dangerous_number<R: Rng>(rng: &mut R) -> $ty {
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
return $nums[rng.random_range(0..$nums.len())] as $ty;
}
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
fn dangerous_number_at_index(idx: usize) -> $ty {
$nums[idx] as $ty
}
fn dangerous_numbers_len() -> usize {
$nums.len()
}
}
};
}
dangerous_number!(u8, DANGEROUS_NUMBERS_U8);
dangerous_number!(i8, DANGEROUS_NUMBERS_U8);
dangerous_number!(u16, DANGEROUS_NUMBERS_U16);
dangerous_number!(i16, DANGEROUS_NUMBERS_U16);
dangerous_number!(u32, DANGEROUS_NUMBERS_U32);
dangerous_number!(i32, DANGEROUS_NUMBERS_U32);
dangerous_number!(u64, DANGEROUS_NUMBERS_U64);
dangerous_number!(i64, DANGEROUS_NUMBERS_U64);
dangerous_number!(f32, DANGEROUS_NUMBERS_F32);
dangerous_number!(f64, DANGEROUS_NUMBERS_F64);