pub mod indexed;
pub mod layerers;
pub mod positioned;
pub mod slicers;
#[cfg(test)]
mod tests;
use layerers::*;
use nalgebra::{Point2, Vector2};
use slicers::*;
use crate::{CellMap, Error, Layer};
use self::{indexed::Indexed, positioned::Positioned};
#[derive(Debug, Clone, Copy)]
pub struct CellMapIter<'m, L, T, R, S>
where
L: Layer,
R: Layerer<L>,
S: Slicer<'m, L, T>,
{
map: &'m CellMap<L, T>,
layerer: R,
slicer: S,
}
#[derive(Debug)]
pub struct CellMapIterMut<'m, L, T, R, S>
where
L: Layer,
R: Layerer<L>,
S: Slicer<'m, L, T>,
{
map: &'m mut CellMap<L, T>,
layerer: R,
slicer: S,
}
impl<'m, L, T, R, S> CellMapIter<'m, L, T, R, S>
where
L: Layer,
S: Slicer<'m, L, T>,
R: Layerer<L>,
{
pub(crate) fn new_cells(map: &'m CellMap<L, T>) -> CellMapIter<'m, L, T, Many<L>, Cells> {
CellMapIter {
map,
layerer: Many {
layers: L::all().into(),
},
slicer: Cells::from_map(map),
}
}
pub(crate) fn new_windows(
map: &'m CellMap<L, T>,
semi_width: Vector2<usize>,
) -> Result<CellMapIter<'m, L, T, Many<L>, Windows>, Error> {
Ok(CellMapIter {
map,
layerer: Many {
layers: L::all().into(),
},
slicer: Windows::from_map(map, semi_width)?,
})
}
pub(crate) fn new_line(
map: &'m CellMap<L, T>,
start_position: Point2<f64>,
end_position: Point2<f64>,
) -> Result<CellMapIter<'m, L, T, Many<L>, Line>, Error> {
Ok(CellMapIter {
map,
layerer: Many {
layers: L::all().into(),
},
slicer: Line::from_map::<L, T>(map.metadata, start_position, end_position)?,
})
}
pub fn layer(self, layer: L) -> CellMapIter<'m, L, T, Single<L>, S> {
CellMapIter {
map: self.map,
layerer: Single { layer },
slicer: self.slicer,
}
}
pub fn layers(self, layers: &[L]) -> CellMapIter<'m, L, T, Many<L>, S> {
CellMapIter {
map: self.map,
layerer: Many {
layers: layers.to_vec().into(),
},
slicer: self.slicer,
}
}
pub fn indexed(self) -> CellMapIter<'m, L, T, R, Indexed<'m, L, T, S>> {
let current_layer = self.layerer.current().unwrap();
CellMapIter {
map: self.map,
layerer: self.layerer,
slicer: Indexed::new(self.slicer, current_layer),
}
}
pub fn positioned(self) -> CellMapIter<'m, L, T, R, Positioned<'m, L, T, S>> {
let current_layer = self.layerer.current().unwrap();
CellMapIter {
map: self.map,
layerer: self.layerer,
slicer: Positioned::new(self.slicer, current_layer, self.map.metadata),
}
}
}
impl<'m, L, T, R, S> CellMapIterMut<'m, L, T, R, S>
where
L: Layer,
R: Layerer<L>,
S: Slicer<'m, L, T>,
{
pub(crate) fn new_cells(
map: &'m mut CellMap<L, T>,
) -> CellMapIterMut<'m, L, T, Many<L>, Cells> {
let slicer = Cells::from_map(map);
CellMapIterMut {
map,
layerer: Many {
layers: L::all().into(),
},
slicer,
}
}
pub(crate) fn new_windows(
map: &'m mut CellMap<L, T>,
semi_width: Vector2<usize>,
) -> Result<CellMapIterMut<'m, L, T, Many<L>, Windows>, Error> {
let slicer = Windows::from_map(map, semi_width)?;
Ok(CellMapIterMut {
map,
layerer: Many {
layers: L::all().into(),
},
slicer,
})
}
pub(crate) fn new_line(
map: &'m mut CellMap<L, T>,
start_position: Point2<f64>,
end_position: Point2<f64>,
) -> Result<CellMapIterMut<'m, L, T, Many<L>, Line>, Error> {
let metadata = map.metadata;
Ok(CellMapIterMut {
map,
layerer: Many {
layers: L::all().into(),
},
slicer: Line::from_map::<L, T>(metadata, start_position, end_position)?,
})
}
pub fn layer(self, layer: L) -> CellMapIterMut<'m, L, T, Single<L>, S> {
CellMapIterMut {
map: self.map,
layerer: Single { layer },
slicer: self.slicer,
}
}
pub fn layers(self, layers: &[L]) -> CellMapIterMut<'m, L, T, Many<L>, S> {
CellMapIterMut {
map: self.map,
layerer: Many {
layers: layers.to_vec().into(),
},
slicer: self.slicer,
}
}
pub fn map_layers(self, from: L, to: L) -> CellMapIterMut<'m, L, T, Map<L>, S> {
CellMapIterMut {
map: self.map,
layerer: Map { from, to },
slicer: self.slicer,
}
}
pub fn indexed(self) -> CellMapIterMut<'m, L, T, R, Indexed<'m, L, T, S>> {
let current_layer = self.layerer.current().unwrap();
CellMapIterMut {
map: self.map,
layerer: self.layerer,
slicer: Indexed::new(self.slicer, current_layer),
}
}
pub fn positioned(self) -> CellMapIterMut<'m, L, T, R, Positioned<'m, L, T, S>> {
let current_layer = self.layerer.current().unwrap();
let map_meta = self.map.metadata;
CellMapIterMut {
map: self.map,
layerer: self.layerer,
slicer: Positioned::new(self.slicer, current_layer, map_meta),
}
}
}
impl<'m, L, T, S> Iterator for CellMapIter<'m, L, T, Single<L>, S>
where
L: Layer,
S: Slicer<'m, L, T>,
{
type Item = S::Output;
fn next(&mut self) -> Option<Self::Item> {
let item = self
.slicer
.slice(&self.map.data[self.layerer.layer.to_index()]);
self.slicer.advance();
item
}
}
impl<'m, L, T, S> Iterator for CellMapIterMut<'m, L, T, Single<L>, S>
where
L: Layer,
S: Slicer<'m, L, T>,
{
type Item = S::OutputMut;
fn next(&mut self) -> Option<Self::Item> {
let item = unsafe {
let layer_ptr = self
.map
.data
.as_mut_ptr()
.add(self.layerer.layer.to_index());
self.slicer.slice_mut(&mut *layer_ptr)
};
self.slicer.advance();
item
}
}
impl<'m, L, T, S> Iterator for CellMapIter<'m, L, T, Many<L>, S>
where
L: Layer,
S: Slicer<'m, L, T>,
{
type Item = S::Output;
fn next(&mut self) -> Option<Self::Item> {
let item = self
.slicer
.slice(&self.map.data[self.layerer.layers.front()?.to_index()]);
self.slicer.advance();
if self.slicer.index().is_none() {
self.layerer.layers.pop_front();
self.slicer.reset(self.layerer.current());
}
item
}
}
impl<'m, L, T, S> Iterator for CellMapIterMut<'m, L, T, Many<L>, S>
where
L: Layer,
S: Slicer<'m, L, T>,
{
type Item = S::OutputMut;
fn next(&mut self) -> Option<Self::Item> {
let item = unsafe {
let layer_ptr = self
.map
.data
.as_mut_ptr()
.add(self.layerer.layers.front()?.to_index());
self.slicer.slice_mut(&mut *layer_ptr)
};
self.slicer.advance();
if self.slicer.index().is_none() {
self.layerer.layers.pop_front();
self.slicer.reset(self.layerer.current());
}
item
}
}
impl<'m, L, T, S> Iterator for CellMapIterMut<'m, L, T, Map<L>, S>
where
L: Layer,
S: Slicer<'m, L, T>,
{
type Item = (S::Output, S::OutputMut);
fn next(&mut self) -> Option<Self::Item> {
let (from, to) = unsafe {
let from_ptr = self.map.data.as_ptr().add(self.layerer.from.to_index());
let from = self.slicer.slice(&*from_ptr);
let to_ptr = self.map.data.as_mut_ptr().add(self.layerer.to.to_index());
let to = self.slicer.slice_mut(&mut *to_ptr);
(from, to)
};
self.slicer.advance();
match (from, to) {
(Some(f), Some(t)) => Some((f, t)),
(_, _) => None,
}
}
}