blob: 01458fb0b60841c9c1e1ee4290e6a8f0658b5f6e [file]
use std::fmt::Write;
use std::ops::RangeInclusive;
use crate::{Float, Generator, Int};
/// Test every possible bit pattern. This is infeasible to run on any float types larger than
/// `f32` (which takes about an hour).
pub struct Exhaustive<F: Float> {
iter: RangeInclusive<F::Int>,
}
impl<F: Float> Generator<F> for Exhaustive<F>
where
RangeInclusive<F::Int>: Iterator<Item = F::Int>,
{
const SHORT_NAME: &'static str = "exhaustive";
type WriteCtx = F;
fn total_tests() -> u64 {
1u64.checked_shl(F::Int::BITS).expect("More than u64::MAX tests")
}
fn new() -> Self {
Self { iter: F::Int::ZERO..=F::Int::MAX }
}
fn write_string(s: &mut String, ctx: Self::WriteCtx) {
write!(s, "{ctx:e}").unwrap();
}
}
impl<F: Float> Iterator for Exhaustive<F>
where
RangeInclusive<F::Int>: Iterator<Item = F::Int>,
{
type Item = F;
fn next(&mut self) -> Option<Self::Item> {
Some(F::from_bits(self.iter.next()?))
}
}