Add memory layout feature

This commit is contained in:
jaby 2022-10-09 18:16:58 +02:00
parent 64267c953b
commit d6b0c8bff4
1 changed files with 42 additions and 25 deletions

View File

@ -1,29 +1,46 @@
use super::*;
pub struct DefaultLayoutMut {
pub type MemoryLayout<'a> = Vec<Layout<'a>>;
pub type MemoryLayoutMut<'a> = Vec<LayoutMut<'a>>;
macro_rules! declare_memory_layout {
($($val:ident),*) => {
/*
Creates Layout(Mut)
- add $($val),* to toggle mut
- add $($val:camel),* inside paste::item to make NameMut or Name
*/
paste::item! {
pub struct [< DefaultLayout$($val:camel),* >] {
}
impl [< DefaultLayout$($val:camel),* >] {
pub fn new(parent: &$($val),* CDDesc) -> Vec<[< Layout$($val:camel),* >]> {
let mut layout = Vec::new();
[< add_dir_and_subdir $(_$val),* >](&mut layout, &$($val),* parent.root);
layout
}
}
pub enum [< Layout$($val:camel),* >]<'a> {
Directory{name: &'a $($val),* DirectoryName, properties: &'a $($val),* Properties},
Data(&'a $($val),* Data)
}
fn [< add_dir_and_subdir $(_$val),* >]<'a>(layout: &mut Vec<[< Layout$($val:camel),* >]::<'a>>, dir: &'a $($val),* Directory) {
layout.push([< Layout$($val:camel),* >]::Directory{name: &$($val),* dir.name, properties: &$($val),* dir.properties});
for data in dir.data.[< iter$(_$val),* >]() {
layout.push([< Layout$($val:camel),* >]::Data(data));
}
for dir in dir.dirs.[< iter$(_$val),* >]() {
[< add_dir_and_subdir $(_$val),* >](layout, dir);
}
}
}
};
}
impl DefaultLayoutMut {
pub fn new(parent: &mut CDDesc) -> Vec<LayoutMut> {
let mut layout = Vec::new();
add_dir_and_subdir(&mut layout, &mut parent.root);
layout
}
}
pub enum LayoutMut<'a> {
Directory{name: &'a mut DirectoryName, properties: &'a mut Properties},
Data(&'a mut Data)
}
fn add_dir_and_subdir<'a>(layout: &mut Vec<LayoutMut::<'a>>, dir: &'a mut Directory) {
layout.push(LayoutMut::Directory{name: &mut dir.name, properties: &mut dir.properties});
for data in dir.data.iter_mut() {
layout.push(LayoutMut::Data(data));
}
for dir in dir.dirs.iter_mut() {
add_dir_and_subdir(layout, dir);
}
}
declare_memory_layout!(mut);
declare_memory_layout!();