From d6b0c8bff4302f4f62b1e788a16fc2d875410ae6 Mon Sep 17 00:00:00 2001 From: jaby Date: Sun, 9 Oct 2022 18:16:58 +0200 Subject: [PATCH] Add memory layout feature --- src/Tools/psxcdgen_ex/src/types/layout.rs | 67 ++++++++++++++--------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/src/Tools/psxcdgen_ex/src/types/layout.rs b/src/Tools/psxcdgen_ex/src/types/layout.rs index c18426f1..996fa119 100644 --- a/src/Tools/psxcdgen_ex/src/types/layout.rs +++ b/src/Tools/psxcdgen_ex/src/types/layout.rs @@ -1,29 +1,46 @@ use super::*; -pub struct DefaultLayoutMut { +pub type MemoryLayout<'a> = Vec>; +pub type MemoryLayoutMut<'a> = Vec>; + +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 { - 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>, 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!(); \ No newline at end of file