Add memory layout feature
This commit is contained in:
parent
64267c953b
commit
d6b0c8bff4
|
@ -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!();
|
Loading…
Reference in New Issue