From 464e670be481a637b570f97b765c79ad105edeaa Mon Sep 17 00:00:00 2001 From: lifning <> Date: Thu, 11 Nov 2021 02:10:31 -0800 Subject: [PATCH] variable storage component --- ferretro_base/src/retro/wrapped_types.rs | 9 ++++ .../src/provided/stdlib/memory.rs | 14 +++++ .../src/provided/stdlib/mod.rs | 3 ++ .../src/provided/stdlib/variables.rs | 51 +++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 ferretro_components/src/provided/stdlib/memory.rs create mode 100644 ferretro_components/src/provided/stdlib/variables.rs diff --git a/ferretro_base/src/retro/wrapped_types.rs b/ferretro_base/src/retro/wrapped_types.rs index e27faab..8705160 100644 --- a/ferretro_base/src/retro/wrapped_types.rs +++ b/ferretro_base/src/retro/wrapped_types.rs @@ -155,6 +155,15 @@ impl From<&Variable> for Variable2 { } } +#[derive(Clone, Debug)] +pub struct MemoryDescriptor2 { +} + +#[derive(Clone, Debug)] +pub struct MemoryMap2 { + pub descriptors: Vec +} + #[derive(Clone, Debug)] pub struct ControllerDescription2 { pub name: String, diff --git a/ferretro_components/src/provided/stdlib/memory.rs b/ferretro_components/src/provided/stdlib/memory.rs new file mode 100644 index 0000000..f5903b8 --- /dev/null +++ b/ferretro_components/src/provided/stdlib/memory.rs @@ -0,0 +1,14 @@ +use crate::prelude::*; + +pub struct MemoryMapComponent { + map: MemoryMap, +} + +impl RetroCallbacks for MemoryMapComponent { + fn set_memory_maps(&mut self, memory_map: &MemoryMap) -> Option { + self.map = memory_map.clone(); + Some(true) + } +} + +impl RetroComponent for MemoryMapComponent {} diff --git a/ferretro_components/src/provided/stdlib/mod.rs b/ferretro_components/src/provided/stdlib/mod.rs index e50cd93..31a64d3 100644 --- a/ferretro_components/src/provided/stdlib/mod.rs +++ b/ferretro_components/src/provided/stdlib/mod.rs @@ -5,7 +5,9 @@ mod camera; mod fps; mod input; mod logs; +mod memory; mod paths; +mod variables; pub use camera::CameraInfoComponent; pub use fps::SleepFramerateLimitComponent; @@ -14,3 +16,4 @@ pub use logs::StderrCallTraceComponent; pub use logs::StderrLogComponent; pub use logs::StderrSysInfoLogComponent; pub use paths::PathBufComponent; +pub use variables::VariableStoreComponent; diff --git a/ferretro_components/src/provided/stdlib/variables.rs b/ferretro_components/src/provided/stdlib/variables.rs new file mode 100644 index 0000000..c55ad3c --- /dev/null +++ b/ferretro_components/src/provided/stdlib/variables.rs @@ -0,0 +1,51 @@ +use std::collections::BTreeMap; +use crate::prelude::*; + +#[derive(Default)] +pub struct VariableStoreComponent { + base_variables: BTreeMap>, + override_variables: BTreeMap, + update: bool, +} + +impl VariableStoreComponent { + pub fn insert(&mut self, key: impl ToString, value: impl ToString) { + let key = key.to_string(); + let value = value.to_string(); + if let Some(options) = self.base_variables.get(&key) { + if !options.contains(&value) { + panic!("Invalid value {:?} for variable {:?} (expected one of {:?})", value, key, options); + } + } + self.override_variables.insert(key, value); + self.update = true; + } +} + +impl RetroComponent for VariableStoreComponent {} + +impl RetroCallbacks for VariableStoreComponent { + fn set_variables(&mut self, variables: &[Variable2]) -> Option { + for v in variables { + if let Some(x) = self.override_variables.get(&v.key) { + if !v.options.contains(x) { + panic!("Invalid value {:?} for variable {:?} (expected one of {:?})", x, v.key, v.options); + } + } + self.base_variables.insert(v.key.to_owned(), v.options.to_owned()); + } + Some(true) + } + + fn get_variable(&mut self, key: &str) -> Option { + self.update = false; + self.override_variables.get(key) + .or_else(|| self.base_variables.get(key) + .and_then(|opts| opts.first())) + .cloned() + } + + fn get_variable_update(&mut self) -> Option { + Some(self.update) + } +}