From d13bff00bf9798d078d870c39de07c56b108477e Mon Sep 17 00:00:00 2001 From: Quaternions <krakow20@gmail.com> Date: Thu, 1 Feb 2024 00:09:30 -0800 Subject: [PATCH] refine Updatable concept --- src/gameplay_modes.rs | 71 +++++++++---------------------------------- src/model.rs | 11 +------ src/updatable.rs | 10 ++---- 3 files changed, 18 insertions(+), 74 deletions(-) diff --git a/src/gameplay_modes.rs b/src/gameplay_modes.rs index 66ed787..5d6d032 100644 --- a/src/gameplay_modes.rs +++ b/src/gameplay_modes.rs @@ -49,22 +49,10 @@ pub struct StageUpdate{ ordered_checkpoints:HashMap<CheckpointId,ModelId>, unordered_checkpoints:HashSet<ModelId>, } -impl Updatable<&StageUpdate> for Stage{ - fn insert(&mut self,update:&StageUpdate){ - for (&checkpoint,&model) in &update.ordered_checkpoints{ - self.ordered_checkpoints.insert(checkpoint,model); - } - for &checkpoint in &update.unordered_checkpoints{ - self.unordered_checkpoints.insert(checkpoint); - } - } - fn remove(&mut self,update:&StageUpdate){ - for (checkpoint,_) in &update.ordered_checkpoints{ - self.ordered_checkpoints.remove(checkpoint); - } - for model in &update.unordered_checkpoints{ - self.unordered_checkpoints.remove(model); - } +impl Updatable<StageUpdate> for Stage{ + fn update(&mut self,update:StageUpdate){ + self.ordered_checkpoints.extend(update.ordered_checkpoints); + self.unordered_checkpoints.extend(update.unordered_checkpoints); } } @@ -132,38 +120,16 @@ pub struct ModeUpdate{ elements:HashMap<ModelId,StageElement>, jump_limit:HashMap<ModelId,u32>, } -impl Updatable<&ModeUpdate> for Mode{ - fn insert(&mut self,update:&ModeUpdate){ - for (&model,&zone) in &update.zones{ - self.zones.insert(model,zone); - } - for (stage,stage_update) in &update.stages{ +impl Updatable<ModeUpdate> for Mode{ + fn update(&mut self,update:ModeUpdate){ + self.zones.extend(update.zones); + for (stage,stage_update) in update.stages{ if let Some(stage)=self.stages.get_mut(stage.0 as usize){ - stage.insert(stage_update); + stage.update(stage_update); } } - for (&model,stage_element) in &update.elements{ - self.elements.insert(model,stage_element.clone()); - } - for (&model,&limit) in &update.jump_limit{ - self.jump_limit.insert(model,limit); - } - } - fn remove(&mut self,update:&ModeUpdate){ - for (model,_) in &update.zones{ - self.zones.remove(model); - } - for (stage,stage_update) in &update.stages{ - if let Some(stage)=self.stages.get_mut(stage.0 as usize){ - stage.remove(stage_update); - } - } - for (model,_) in &update.elements{ - self.elements.remove(model); - } - for (model,_) in &update.jump_limit{ - self.jump_limit.remove(model); - } + self.elements.extend(update.elements); + self.jump_limit.extend(update.jump_limit); } } impl ModeUpdate{ @@ -206,18 +172,11 @@ impl Modes{ pub struct ModesUpdate{ modes:HashMap<ModeId,ModeUpdate>, } -impl Updatable<&ModesUpdate> for Modes{ - fn insert(&mut self,update:&ModesUpdate){ - for (mode,mode_update) in &update.modes{ +impl Updatable<ModesUpdate> for Modes{ + fn update(&mut self,update:ModesUpdate){ + for (mode,mode_update) in update.modes{ if let Some(mode)=self.modes.get_mut(mode.0 as usize){ - mode.insert(mode_update); - } - } - } - fn remove(&mut self,update:&ModesUpdate){ - for (mode,mode_update) in &update.modes{ - if let Some(mode)=self.modes.get_mut(mode.0 as usize){ - mode.remove(mode_update); + mode.update(mode_update); } } } diff --git a/src/model.rs b/src/model.rs index ebbfabe..f2f9033 100644 --- a/src/model.rs +++ b/src/model.rs @@ -62,17 +62,8 @@ pub struct Models{ models:HashMap<ModelId,Model>, } impl Updatable<Models> for Models{ - fn insert(&mut self,update:Models){ + fn update(&mut self,update:Models){ self.indexed_models.extend(update.indexed_models); self.models.extend(update.models); } - fn remove(&mut self,update:Models){ - for (indexed_model_id,_) in &update.indexed_models{ - self.indexed_models.remove(indexed_model_id); - } - for (model_id,_) in &update.models{ - self.models.remove(model_id); - } - todo!("stop cloning models for remove"); - } } \ No newline at end of file diff --git a/src/updatable.rs b/src/updatable.rs index f3d6b4d..13b6dd2 100644 --- a/src/updatable.rs +++ b/src/updatable.rs @@ -1,10 +1,4 @@ pub trait Updatable<Updater>{ - fn insert(&mut self,update:Updater); - fn remove(&mut self,update:Updater); -} -//what if do like this -//* -pub trait Updatable2<Updater>{ fn update(&mut self,update:Updater); } #[derive(Clone,Copy,Hash,Eq,PartialEq)] @@ -37,14 +31,14 @@ struct OuterUpdate{ //#[updatable(Update)] //inners:std::collections::HashMap<InnerId,InnerUpdate>, } -impl Updatable2<InnerUpdate> for Inner{ +impl Updatable<InnerUpdate> for Inner{ fn update(&mut self,update:InnerUpdate){ if let Some(enabled)=update.enabled{ self.enabled=enabled; } } } -impl Updatable2<OuterUpdate> for Outer{ +impl Updatable<OuterUpdate> for Outer{ fn update(&mut self,update:OuterUpdate){ for (id,up) in update.inners{ match up{