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::{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) {
assert!(
x < self.width,
@ -92,21 +112,6 @@ impl Grid<u8> for ByteGrid {
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) {
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> {
byte_grid: &'t ByteGrid,
row: usize,
}
impl<'t> Iterator for IterRows<'t> {
type Item = Iter<'t>;
type Item = Iter<'t, u8>;
fn next(&mut self) -> Option<Self::Item> {
if self.row >= self.byte_grid.height {
return None;
}
let result = Some(Iter {
byte_grid: self.byte_grid,
index: self.row * self.byte_grid.width,
end: (self.row + 1) * self.byte_grid.width,
});
let start = self.row * self.byte_grid.width;
let end = start + self.byte_grid.width;
let result = self.byte_grid.data[start..end].iter();
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
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) {
assert!(
x < self.width,
@ -96,17 +107,6 @@ impl Grid<bool> for PixelGrid {
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`.
///
/// # Arguments