mirror of
https://github.com/cccb/servicepoint.git
synced 2025-01-18 18:10:14 +01:00
add more iterators
This commit is contained in:
parent
ee0c9dceab
commit
17d41ef6c6
|
@ -106,6 +106,7 @@ impl BitVec {
|
||||||
Iter {
|
Iter {
|
||||||
bit_vec: self,
|
bit_vec: self,
|
||||||
index: 0,
|
index: 0,
|
||||||
|
end: self.size,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,15 +153,16 @@ impl From<&[u8]> for BitVec {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Iter<'t> {
|
pub struct Iter<'t> {
|
||||||
bit_vec: &'t BitVec,
|
pub(crate) bit_vec: &'t BitVec,
|
||||||
index: usize,
|
pub(crate) index: usize,
|
||||||
|
pub(crate) end: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'t> Iterator for Iter<'t> {
|
impl<'t> Iterator for Iter<'t> {
|
||||||
type Item = bool;
|
type Item = bool;
|
||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
if self.index >= self.bit_vec.size {
|
if self.index >= self.end {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,13 +43,6 @@ impl ByteGrid {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn iter(&self) -> Iter {
|
|
||||||
Iter {
|
|
||||||
byte_grid: self,
|
|
||||||
index: 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,
|
||||||
|
@ -99,6 +92,21 @@ 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);
|
||||||
}
|
}
|
||||||
|
@ -162,13 +170,14 @@ impl RefGrid<u8> for ByteGrid {
|
||||||
pub struct Iter<'t> {
|
pub struct Iter<'t> {
|
||||||
byte_grid: &'t ByteGrid,
|
byte_grid: &'t ByteGrid,
|
||||||
index: usize,
|
index: usize,
|
||||||
|
end: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'t> Iterator for Iter<'t> {
|
impl<'t> Iterator for Iter<'t> {
|
||||||
type Item = u8;
|
type Item = u8;
|
||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
if self.index >= self.byte_grid.data.len() {
|
if self.index >= self.end {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,6 +187,28 @@ impl<'t> Iterator for Iter<'t> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct IterRows<'t> {
|
||||||
|
byte_grid: &'t ByteGrid,
|
||||||
|
row: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'t> Iterator for IterRows<'t> {
|
||||||
|
type Item = Iter<'t>;
|
||||||
|
|
||||||
|
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,
|
||||||
|
});
|
||||||
|
self.row += 1;
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::{ByteGrid, DataRef, Grid};
|
use crate::{ByteGrid, DataRef, Grid};
|
||||||
|
|
|
@ -54,6 +54,13 @@ 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);
|
||||||
|
|
||||||
|
|
|
@ -96,6 +96,17 @@ 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
|
||||||
|
@ -132,6 +143,28 @@ impl From<PixelGrid> for Vec<u8> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct IterRows<'t> {
|
||||||
|
pixel_grid: &'t PixelGrid,
|
||||||
|
row: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'t> Iterator for IterRows<'t> {
|
||||||
|
type Item = crate::bit_vec::Iter<'t>;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
if self.row >= self.pixel_grid.height {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let result = Some(crate::bit_vec::Iter {
|
||||||
|
bit_vec: &self.pixel_grid.bit_vec,
|
||||||
|
index: self.row * self.pixel_grid.width,
|
||||||
|
end: (self.row + 1) * self.pixel_grid.width,
|
||||||
|
});
|
||||||
|
self.row += 1;
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::{DataRef, Grid, PixelGrid};
|
use crate::{DataRef, Grid, PixelGrid};
|
||||||
|
|
Loading…
Reference in a new issue