From f947e3777db7764b1f3b4a669d1cca247e4b5e5e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Mon, 7 Aug 2023 15:15:17 +0100
Subject: [PATCH] chore: simplified code structure

---
 src/state.rs | 76 ++++++++++++++++++++++------------------------------
 1 file changed, 32 insertions(+), 44 deletions(-)

diff --git a/src/state.rs b/src/state.rs
index 0094fd54..e60d2217 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -52,44 +52,36 @@ impl BeesState {
         self.core.verify()?;
         Ok(())
     }
-}
 
-impl Serialize for BeesState {
-    fn save(&mut self, buffer: &mut Vec<u8>) {
+    /// Dumps the core data into the provided buffer and returns.
+    /// This will effectively populate the majority of the save
+    /// file with the core emulator contents.
+    fn dump_core(&mut self, buffer: &mut Vec<u8>) -> u32 {
         let mut offset = 0x0000_u32;
 
-        self.core.ram.offset = offset;
-        buffer.write_all(&self.core.ram.buffer).unwrap();
-        offset += self.core.ram.size;
-
-        self.core.vram.offset = offset;
-        buffer.write_all(&self.core.vram.buffer).unwrap();
-        offset += self.core.vram.size;
-
-        self.core.mbc_ram.offset = offset;
-        buffer.write_all(&self.core.mbc_ram.buffer).unwrap();
-        offset += self.core.mbc_ram.size;
-
-        self.core.oam.offset = offset;
-        buffer.write_all(&self.core.oam.buffer).unwrap();
-        offset += self.core.oam.size;
-
-        self.core.hram.offset = offset;
-        buffer.write_all(&self.core.hram.buffer).unwrap();
-        offset += self.core.hram.size;
-
-        self.core.background_palettes.offset = offset;
-        buffer
-            .write_all(&self.core.background_palettes.buffer)
-            .unwrap();
-        offset += self.core.background_palettes.size;
-
-        self.core.object_palettes.offset = offset;
-        buffer.write_all(&self.core.object_palettes.buffer).unwrap();
-        offset += self.core.object_palettes.size;
+        let mut buffers = vec![
+            &mut self.core.ram,
+            &mut self.core.vram,
+            &mut self.core.mbc_ram,
+            &mut self.core.oam,
+            &mut self.core.hram,
+            &mut self.core.background_palettes,
+            &mut self.core.object_palettes,
+        ];
+
+        for item in buffers.iter_mut() {
+            (*item).offset = offset;
+            buffer.write_all(&(*item).buffer).unwrap();
+            offset += (*item).size;
+        }
 
-        self.footer.start_offset = offset;
+        offset
+    }
+}
 
+impl Serialize for BeesState {
+    fn save(&mut self, buffer: &mut Vec<u8>) {
+        self.footer.start_offset = self.dump_core(buffer);
         self.name.save(buffer);
         self.info.save(buffer);
         self.core.save(buffer);
@@ -191,11 +183,10 @@ impl BeesBuffer {
         }
     }
 
-    /// Fills the buffer with new data and optionally sets the offset
-    /// position of such data in the owner data.
-    fn fill_buffer(&mut self, data: &[u8], offset: Option<u32>) {
+    /// Fills the buffer with new data and updating the size
+    /// value accordingly.
+    fn fill_buffer(&mut self, data: &[u8]) {
         self.size = data.len() as u32;
-        self.offset = offset.unwrap_or(0);
         self.buffer = data.to_vec();
     }
 
@@ -593,13 +584,10 @@ impl State for BeesCore {
             0,
             gb.mmu().read_many(0xff00, 128).try_into().unwrap(),
         );
-        core.ram.fill_buffer(gb.mmu().ram(), None);
-        core.vram
-            .fill_buffer(&gb.mmu().read_many(0x8000, 0x2000), None);
-        core.oam
-            .fill_buffer(&gb.mmu().read_many(0xfe00, 0x00a0), None);
-        core.hram
-            .fill_buffer(&gb.mmu().read_many(0xff80, 0x007f), None);
+        core.ram.fill_buffer(gb.mmu().ram());
+        core.vram.fill_buffer(&gb.mmu().read_many(0x8000, 0x2000));
+        core.oam.fill_buffer(&gb.mmu().read_many(0xfe00, 0x00a0));
+        core.hram.fill_buffer(&gb.mmu().read_many(0xff80, 0x007f));
         core
     }
 
-- 
GitLab