Add memory layout feature

This commit is contained in:
Jaby 2022-10-09 18:16:58 +02:00 committed by Jaby
parent dbc21ad736
commit d273c6a12b
1 changed files with 42 additions and 25 deletions

View File

@ -1,29 +1,46 @@
use super::*; use super::*;
pub struct DefaultLayoutMut { pub type MemoryLayout<'a> = Vec<Layout<'a>>;
} pub type MemoryLayoutMut<'a> = Vec<LayoutMut<'a>>;
impl DefaultLayoutMut { macro_rules! declare_memory_layout {
pub fn new(parent: &mut CDDesc) -> Vec<LayoutMut> { ($($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(); let mut layout = Vec::new();
add_dir_and_subdir(&mut layout, &mut parent.root); [< add_dir_and_subdir $(_$val),* >](&mut layout, &$($val),* parent.root);
layout 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() { pub enum [< Layout$($val:camel),* >]<'a> {
add_dir_and_subdir(layout, dir); 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);
}
}
}
};
} }
declare_memory_layout!(mut);
declare_memory_layout!();