remove iter from trait

This commit is contained in:
Vinzenz Schroeter 2024-06-03 19:32:10 +02:00
parent 17d41ef6c6
commit c600761f29
3 changed files with 37 additions and 60 deletions

View file

@ -1,3 +1,5 @@
use std::slice::{Iter, IterMut};
use crate::grid::RefGrid; use crate::grid::RefGrid;
use crate::{DataRef, Grid}; use crate::{DataRef, Grid};
@ -43,6 +45,24 @@ impl ByteGrid {
} }
} }
pub fn iter(&self) -> Iter<u8> {
self.data.iter()
}
pub fn iter_rows(&self) -> IterRows {
IterRows {
byte_grid: self,
row: 0,
}
}
/// Returns an iterator that allows modifying each value.
///
/// The iterator yields all cells from top left to bottom right.
pub fn iter_mut(&mut self) -> IterMut<u8> {
self.data.iter_mut()
}
fn check_indexes(&self, x: usize, y: usize) { fn check_indexes(&self, x: usize, y: usize) {
assert!( assert!(
x < self.width, x < self.width,
@ -92,21 +112,6 @@ impl Grid<u8> for ByteGrid {
self.data[x + y * self.width] self.data[x + y * self.width]
} }
fn iter(&self) -> impl Iterator<Item = u8> {
Iter {
byte_grid: self,
index: 0,
end: self.data.len(),
}
}
fn iter_rows(&self) -> impl Iterator<Item = impl Iterator<Item = u8>> {
IterRows {
byte_grid: self,
row: 0,
}
}
fn fill(&mut self, value: u8) { fn fill(&mut self, value: u8) {
self.data.fill(value); self.data.fill(value);
} }
@ -167,45 +172,24 @@ impl RefGrid<u8> for ByteGrid {
} }
} }
pub struct Iter<'t> {
byte_grid: &'t ByteGrid,
index: usize,
end: usize,
}
impl<'t> Iterator for Iter<'t> {
type Item = u8;
fn next(&mut self) -> Option<Self::Item> {
if self.index >= self.end {
return None;
}
let result = self.byte_grid.data[self.index];
self.index += 1;
Some(result)
}
}
pub struct IterRows<'t> { pub struct IterRows<'t> {
byte_grid: &'t ByteGrid, byte_grid: &'t ByteGrid,
row: usize, row: usize,
} }
impl<'t> Iterator for IterRows<'t> { impl<'t> Iterator for IterRows<'t> {
type Item = Iter<'t>; type Item = Iter<'t, u8>;
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
if self.row >= self.byte_grid.height { if self.row >= self.byte_grid.height {
return None; return None;
} }
let result = Some(Iter {
byte_grid: self.byte_grid, let start = self.row * self.byte_grid.width;
index: self.row * self.byte_grid.width, let end = start + self.byte_grid.width;
end: (self.row + 1) * self.byte_grid.width, let result = self.byte_grid.data[start..end].iter();
});
self.row += 1; self.row += 1;
result Some(result)
} }
} }

View file

@ -54,13 +54,6 @@ pub trait Grid<T> {
} }
} }
/// Get an iterator over every cell in the grid.
///
/// Iteration is done in memory order, rows first.
fn iter(&self) -> impl Iterator<Item = T>;
fn iter_rows(&self) -> impl Iterator<Item = impl Iterator<Item = T>>;
/// Sets all cells in the grid to the specified value /// Sets all cells in the grid to the specified value
fn fill(&mut self, value: T); fn fill(&mut self, value: T);

View file

@ -60,6 +60,17 @@ impl PixelGrid {
} }
} }
pub fn iter(&self) -> crate::bit_vec::Iter {
self.bit_vec.iter()
}
pub fn iter_rows(&self) -> IterRows {
IterRows {
pixel_grid: self,
row: 0,
}
}
fn check_indexes(&self, x: usize, y: usize) { fn check_indexes(&self, x: usize, y: usize) {
assert!( assert!(
x < self.width, x < self.width,
@ -96,17 +107,6 @@ impl Grid<bool> for PixelGrid {
self.bit_vec.get(x + y * self.width) self.bit_vec.get(x + y * self.width)
} }
fn iter(&self) -> impl Iterator<Item = bool> {
self.bit_vec.iter()
}
fn iter_rows(&self) -> impl Iterator<Item = impl Iterator<Item = bool>> {
IterRows {
pixel_grid: self,
row: 0,
}
}
/// Sets the state of all pixels in the `PixelGrid`. /// Sets the state of all pixels in the `PixelGrid`.
/// ///
/// # Arguments /// # Arguments