use crate::{ComputeScope, Level, Space};
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub(crate) struct Placement {
pub space: Space,
pub depth: usize,
pub levels: Vec<Level>,
}
impl Placement {
pub(crate) fn new(space: Space, depth: usize, levels: Vec<Level>) -> Self {
Placement {
space,
depth,
levels,
}
}
pub(crate) fn root(space: Space, levels: Vec<Level>) -> Self {
Placement::new(space, 0, levels)
}
pub(crate) fn alone(space: Space) -> Self {
Placement::new(space, 0, Vec::new())
}
pub(crate) fn holder(&self) -> ComputeScope {
self.levels[..self.depth.min(self.levels.len())]
.iter()
.filter_map(|level| level.coverage().scope())
.min()
.unwrap_or(ComputeScope::Cube)
}
pub(crate) fn below(&self) -> &[Level] {
&self.levels[self.depth..]
}
pub(crate) fn at_step(&self, level: &Level) -> Placement {
Placement::new(
level.child(&self.space),
self.depth + 1,
self.levels.clone(),
)
}
pub(crate) fn at_depth(mut self, depth: usize) -> Placement {
self.depth = depth;
self
}
}