concentric_circles 0.1.0

Efficient generation and iteration of concentric circle perimeters using Bresenham's algorithm.
Documentation
use crate::{AddColor, AddColorRadial, ConcentricCircles, FromAs, ToImageCoordinates};

/// The trait provides a method to get the outer and inner radius of a `ConcentricCircles` iterator.
pub trait Radii {
    /// Returns the outer radius of the iterator.
    ///
    /// The outer radius is the constant value that defines the maximum radius of the circles
    /// generated by the iterator.
    ///
    /// # Returns
    ///
    /// The outer radius of the iterator.
    ///
    /// # Examples
    ///
    /// Basic usage:
    ///
    /// ```rust
    /// use concentric_circles::ConcentricCircles;
    /// use crate::concentric_circles::Radii;
    ///
    /// let mut iter = ConcentricCircles::<i32, usize>::new(1, 5);
    ///
    /// assert_eq!(iter.outer_radius(), 5);
    /// iter.nth(4);
    /// assert_eq!(iter.outer_radius(), 5);
    /// ```
    fn outer_radius(&self) -> usize;

    /// Returns the current inner radius of the iterator.
    ///
    /// The inner radius is the current radius of the circle being generated by the iterator.
    ///
    /// # Returns
    ///
    /// The current inner radius of the iterator.
    ///
    /// # Examples
    ///
    /// ```rust
    /// use concentric_circles::ConcentricCircles;
    /// use crate::concentric_circles::Radii;
    ///
    /// let mut iter = ConcentricCircles::<i32, usize>::new(1, 5);
    ///
    /// assert_eq!(iter.current_inner_radius(), 1);
    /// iter.nth(4);
    /// assert_eq!(iter.current_inner_radius(), 2);
    /// ```
    fn current_inner_radius(&self) -> usize;
}

impl<T, U> Radii for ConcentricCircles<T, U>
where
    U: Copy,
    usize: FromAs<U>,
{
    #[inline]
    fn outer_radius(&self) -> usize {
        usize::from_as(self.outer_radius)
    }

    #[inline]
    fn current_inner_radius(&self) -> usize {
        usize::from_as(self.inner_radius)
    }
}

impl<I: Radii, Color> Radii for AddColor<I, Color> {
    #[inline]
    fn outer_radius(&self) -> usize {
        self.iter.outer_radius()
    }

    #[inline]
    fn current_inner_radius(&self) -> usize {
        self.iter.current_inner_radius()
    }
}

impl<I, F, Color> Radii for AddColorRadial<I, F, Color>
where
    I: Radii,
{
    #[inline]
    fn outer_radius(&self) -> usize {
        self.iter.outer_radius()
    }

    #[inline]
    fn current_inner_radius(&self) -> usize {
        self.iter.current_inner_radius()
    }
}

impl<I, T, U> Radii for ToImageCoordinates<I, T, U>
where
    I: Iterator<Item = (T, T)> + Radii,
{
    fn outer_radius(&self) -> usize {
        self.iter.outer_radius()
    }

    fn current_inner_radius(&self) -> usize {
        self.iter.current_inner_radius()
    }
}