hexga_math 0.0.11-beta.53

Math related crate that define number and casting, and support array programming...
Documentation
use super::*;

pub struct GridViewIter<'a, G, T, Idx, const N: usize>
where
    G: IGrid<T, Idx, N>,
    Idx: Integer,
    T: 'a,
{
    grid: &'a G,
    rect: RectangleIter<Idx, N>,
    phantom: std::marker::PhantomData<T>,
}

impl<'a, G, T, Idx, const N: usize> GridViewIter<'a, G, T, Idx, N>
where
    G: IGrid<T, Idx, N>,
    Idx: Integer,
    T: 'a,
{
    pub fn new(grid: &'a G) -> Self
    {
        Self {
            grid,
            rect: grid.rect().iter_index(),
            phantom: std::marker::PhantomData,
        }
    }

    pub fn from_rect(grid: &'a G, rect: Rectangle<Idx, N>) -> Option<Self>
    {
        if !grid.rect().is_rect_inside(rect)
        {
            return None;
        }
        else
        {
            Some(unsafe { Self::from_rect_unchecked(grid, rect) })
        }
    }

    pub unsafe fn from_rect_unchecked(grid: &'a G, rect: Rectangle<Idx, N>) -> Self
    {
        Self {
            grid,
            rect: rect.iter_index(),
            phantom: std::marker::PhantomData,
        }
    }

    pub fn from_rect_intersect(grid: &'a G, rect: Rectangle<Idx, N>) -> Self
    {
        Self {
            grid,
            rect: grid.rect().intersect_or_empty(rect).iter_index(),
            phantom: std::marker::PhantomData,
        }
    }
}

impl<'a, G, T, Idx, const N: usize> Clone for GridViewIter<'a, G, T, Idx, N>
where
    G: IGrid<T, Idx, N>,
    Idx: Integer,
{
    fn clone(&self) -> Self
    {
        Self {
            grid: self.grid,
            rect: self.rect.clone(),
            phantom: std::marker::PhantomData,
        }
    }
}
impl<'a, G, T, Idx, const N: usize> Iterator for GridViewIter<'a, G, T, Idx, N>
where
    G: IGrid<T, Idx, N>,
    Idx: Integer,
{
    type Item = (Vector<Idx, N>, &'a T);

    fn next(&mut self) -> Option<Self::Item>
    {
        let idx = self.rect.next()?;
        Some((idx, unsafe { self.grid.get_unchecked(idx) }))
    }

    fn size_hint(&self) -> (usize, Option<usize>) { self.rect.size_hint() }
}
impl<'a, G, T, Idx, const N: usize> std::iter::FusedIterator for GridViewIter<'a, G, T, Idx, N>
where
    G: IGrid<T, Idx, N>,
    Idx: Integer,
    RectangleIter<Idx, N>: std::iter::FusedIterator,
{
}
impl<'a, G, T, Idx, const N: usize> std::iter::ExactSizeIterator for GridViewIter<'a, G, T, Idx, N>
where
    G: IGrid<T, Idx, N>,
    Idx: Integer,
    RectangleIter<Idx, N>: std::iter::ExactSizeIterator,
{
}