use crate::FusedIterator;
#[derive(Debug, Clone)]
pub struct ScalingU32 {
denominator: core::num::NonZeroU32,
iter: core::ops::Range<u32>,
}
impl ScalingU32 {
#[inline]
pub fn new(num: u32) -> Self {
if num == 0 || num > 16843009 {
Self {
denominator: core::num::NonZeroU32::new(1).unwrap(),
iter: 0..0,
}
} else {
Self::new_unchecked(num)
}
}
#[inline]
pub fn new_unchecked(num: u32) -> Self {
Self {
denominator: core::num::NonZeroU32::new(num).expect("`num` must be greater than zero"),
iter: 0..num + 1,
}
}
}
impl Iterator for ScalingU32 {
type Item = u8;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
Some(((self.iter.next()? * 255) / self.denominator) as u8)
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
impl FusedIterator for ScalingU32 {}
impl DoubleEndedIterator for ScalingU32 {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
Some(((self.iter.next_back()? * 255) / self.denominator) as u8)
}
}