use super::*;
use crate::{ Layout, Row };
impl<B: Block> Stack<B> {
pub fn clone_into_layers(&self) -> Vec<Layer<B>> {
let mut layers = Vec::new();
let num_layers = self.layouts.len();
for l in 0..num_layers {
let layer_clone = self.clone_layer(l).expect("Layer exists");
layers.push(layer_clone);
}
layers
}
pub fn set_from_layers(&mut self, layers: Vec<Layer<B>>) -> &mut Self {
self.layouts = layers.iter()
.map(|layer| layer.layout().clone())
.collect();
self.blocks = layers.iter()
.flat_map(|layer| layer.blocks().clone())
.collect();
self
}
pub fn clone_into_rows(&self) -> Vec<Vec<Row<B>>> {
let mut layers = Vec::new();
let layouts = self.layouts();
for (l, layout) in layouts.iter().enumerate() {
let mut rows = Vec::new();
let num_rows = layout.len();
for r in 0..num_rows {
let cloned_row = self.clone_row(l, r)
.expect("Row exists");
rows.push(cloned_row);
}
layers.push(rows);
}
layers
}
pub fn set_from_rows(&mut self, rows: Vec<Vec<Row<B>>>) -> &mut Self {
let mut layouts = Vec::new();
rows.iter()
.for_each(|l| {
let mut layout = Layout::new();
l.iter().for_each(|r| layout.push(r.len()));
layouts.push(layout)
});
let blocks: Vec<B> = rows.into_iter()
.flat_map(|l| {
l.into_iter()
.flat_map(|r| {
r.blocks
})
.collect::<Vec<B>>()
})
.collect();
self.layouts = layouts;
self.blocks = blocks;
self
}
pub fn clone_into_blocks(&self) -> Vec<Vec<Vec<B>>> {
self.get_all_ref()
.into_iter()
.map(|l| {
l.into_iter()
.map(|r| {
r.into_iter()
.map(|b| b.clone())
.collect()
})
.collect()
})
.collect()
}
pub fn set_from_blocks(&mut self, blocks: Vec<Vec<Vec<B>>>) -> &mut Self {
let mut layouts = Vec::new();
blocks.iter()
.for_each(|l| {
let mut layout = Layout::new();
l.iter().for_each(|r| layout.push(r.len()));
layouts.push(layout)
});
let blocks: Vec<B> = blocks.into_iter()
.flat_map(|l| {
l.into_iter()
.flatten()
})
.collect();
self.layouts = layouts;
self.blocks = blocks;
self
}
pub fn clone_layer(
&self,
l: usize
) -> Option<Layer<B>> {
let blocks: Vec<B> = self.get_layer_ref(l)?
.into_iter()
.flat_map(|r| {
r.into_iter()
.map(|b| b.clone())
.collect::<Vec<B>>()
})
.collect();
let layout = self.layouts.get(l)
.expect("Layout exists if layer ref exists")
.clone();
let mut layer = Layer::new();
layer.set_from_layout(layout, blocks)
.expect("Layout is not corrupted");
Some(layer)
}
pub fn clone_row(
&self,
l: usize,
r: usize
) -> Option<Row<B>> {
let blocks: Vec<B> = self.get_row_ref(l, r)?
.into_iter()
.map(|b| b.clone())
.collect();
let row = Row::wrap(blocks);
Some(row)
}
pub fn clone_block(
&self,
l: usize,
r: usize,
i: usize
) -> Option<B> {
let block = self.get_block_ref(l, r, i)?;
Some(block.clone())
}
}
#[cfg(test)] mod test {
use crate::block::{ Block, test::TestBlock };
use crate::types::layer::{ Layer, test::test_layer };
use crate::types::stack::{ Stack, test::test_stack };
#[test] fn clone_stack_into_layers_test() {
let mut stack = test_stack();
stack.new_layer();
let layers = stack.clone_into_layers();
stack.set_from_layers(layers);
assert_eq!(stack.layouts.len(), 4);
assert_eq!(stack.blocks.len(), 9);
let mut stack = Stack::<TestBlock>::new();
let layers = stack.clone_into_layers();
stack.set_from_layers(layers);
assert_eq!(stack.layouts.len(), 0);
assert_eq!(stack.blocks.len(), 0);
}
#[test] fn layer_partial_clone_test() {
let stack = test_stack();
let layer = stack.clone_layer(1)
.expect("Second layer exists");
assert_eq!(layer.layout.total(), 3);
assert_eq!(layer.layout[0], 1);
assert_eq!(layer.layout[1], 2);
assert_eq!(layer.blocks.len(), 3);
}
}