add row and column ops for primitive grid
This commit is contained in:
		
							parent
							
								
									eb42e0aba1
								
							
						
					
					
						commit
						85a0ea0dc3
					
				
					 2 changed files with 84 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -46,7 +46,7 @@ impl BrightnessGrid {
 | 
			
		|||
 | 
			
		||||
impl From<Brightness> for u8 {
 | 
			
		||||
    fn from(brightness: Brightness) -> Self {
 | 
			
		||||
        brightness.0
 | 
			
		||||
        Self::from(&brightness)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -142,7 +142,7 @@ mod tests {
 | 
			
		|||
    #[test]
 | 
			
		||||
    fn brightness_from_u8() {
 | 
			
		||||
        assert_eq!(Err(100), Brightness::try_from(100));
 | 
			
		||||
        assert_eq!(Ok(Brightness(1)), Brightness::try_from(1))
 | 
			
		||||
        assert_eq!(Ok(Brightness(1)), Brightness::try_from(1));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -138,6 +138,64 @@ impl<T: PrimitiveGridType> PrimitiveGrid<T> {
 | 
			
		|||
            .collect::<Vec<_>>();
 | 
			
		||||
        PrimitiveGrid::load(self.width(), self.height(), &data)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Copies a row from the grid.
 | 
			
		||||
    ///
 | 
			
		||||
    /// Returns [None] if y is out of bounds.
 | 
			
		||||
    pub fn get_row(&self, y: usize) -> Option<Vec<T>> {
 | 
			
		||||
        self.data
 | 
			
		||||
            .chunks_exact(self.width())
 | 
			
		||||
            .nth(y)
 | 
			
		||||
            .map(|row| row.to_vec())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Copies a column from the grid.
 | 
			
		||||
    ///
 | 
			
		||||
    /// Returns [None] if x is out of bounds.
 | 
			
		||||
    pub fn get_col(&self, x: usize) -> Option<Vec<T>> {
 | 
			
		||||
        self.data
 | 
			
		||||
            .chunks_exact(self.width())
 | 
			
		||||
            .map(|row| row.get(x).map(move |x| *x))
 | 
			
		||||
            .collect()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Overwrites a column in the grid.
 | 
			
		||||
    ///
 | 
			
		||||
    /// Returns [None] if x is out of bounds or `col` is not of the correct size.
 | 
			
		||||
    pub fn set_col(&mut self, x: usize, col: &[T]) -> Option<()> {
 | 
			
		||||
        if col.len() != self.height() {
 | 
			
		||||
            return None;
 | 
			
		||||
        }
 | 
			
		||||
        let width = self.width();
 | 
			
		||||
        if self
 | 
			
		||||
            .data
 | 
			
		||||
            .chunks_exact_mut(width)
 | 
			
		||||
            .zip(col.iter())
 | 
			
		||||
            .map(|(row, column_value)| {
 | 
			
		||||
                row.get_mut(x).map(move |cell| *cell = *column_value)
 | 
			
		||||
            })
 | 
			
		||||
            .all(|cell| cell.is_some())
 | 
			
		||||
        {
 | 
			
		||||
            Some(())
 | 
			
		||||
        } else {
 | 
			
		||||
            None
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Overwrites a row in the grid.
 | 
			
		||||
    ///
 | 
			
		||||
    /// Returns [None] if y is out of bounds or `row` is not of the correct size.
 | 
			
		||||
    pub fn set_row(&mut self, y: usize, row: &[T]) -> Option<()> {
 | 
			
		||||
        let width = self.width();
 | 
			
		||||
        self.data.chunks_exact_mut(width).nth(y).and_then(|chunk| {
 | 
			
		||||
            if chunk.len() == row.len() {
 | 
			
		||||
                chunk.copy_from_slice(row);
 | 
			
		||||
                Some(())
 | 
			
		||||
            } else {
 | 
			
		||||
                None
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: PrimitiveGridType> Grid<T> for PrimitiveGrid<T> {
 | 
			
		||||
| 
						 | 
				
			
			@ -347,4 +405,28 @@ mod tests {
 | 
			
		|||
        assert_eq!(grid.get_optional(0, 0), Some(5));
 | 
			
		||||
        assert_eq!(grid.get_optional(0, 8), None);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn col() {
 | 
			
		||||
        let mut grid = PrimitiveGrid::load(2, 3, &[0, 1, 2, 3, 4, 5]);
 | 
			
		||||
        assert_eq!(grid.get_col(0), Some(vec![0, 2, 4]));
 | 
			
		||||
        assert_eq!(grid.get_col(1), Some(vec![1, 3, 5]));
 | 
			
		||||
        assert_eq!(grid.get_col(2), None);
 | 
			
		||||
        assert_eq!(grid.set_col(0, &[5, 7, 9]), Some(()));
 | 
			
		||||
        assert_eq!(grid.set_col(2, &[5, 7, 9]), None);
 | 
			
		||||
        assert_eq!(grid.set_col(0, &[5, 7]), None);
 | 
			
		||||
        assert_eq!(grid.get_col(0), Some(vec![5, 7, 9]));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn row() {
 | 
			
		||||
        let mut grid = PrimitiveGrid::load(2, 3, &[0, 1, 2, 3, 4, 5]);
 | 
			
		||||
        assert_eq!(grid.get_row(0), Some(vec![0, 1]));
 | 
			
		||||
        assert_eq!(grid.get_row(2), Some(vec![4, 5]));
 | 
			
		||||
        assert_eq!(grid.get_row(3), None);
 | 
			
		||||
        assert_eq!(grid.set_row(0, &[5, 7]), Some(()));
 | 
			
		||||
        assert_eq!(grid.get_row(0), Some(vec![5, 7]));
 | 
			
		||||
        assert_eq!(grid.set_row(3, &[5, 7]), None);
 | 
			
		||||
        assert_eq!(grid.set_row(2, &[5, 7, 3]), None);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue