From 8647df026dcf2a476485849626bfbcf4b31b80da Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Sun, 25 May 2025 18:39:49 +0200 Subject: [PATCH] refactor(geometry/edit): "merge" instead of "apply" edit on another edit This is just a small terminological distinction. --- src/drawing/drawing.rs | 3 +- src/geometry/edit.rs | 81 ++++++++++++++++++------------------------ 2 files changed, 36 insertions(+), 48 deletions(-) diff --git a/src/drawing/drawing.rs b/src/drawing/drawing.rs index 3e96252..7a336ee 100644 --- a/src/drawing/drawing.rs +++ b/src/drawing/drawing.rs @@ -773,8 +773,9 @@ impl Drawing { ) -> Result<(), DrawingException> { let mut temp_recorder = DrawingEdit::new(); let ret = self.update_this_and_outward_bows_intern(&mut temp_recorder, around); + if ret.is_ok() { - recorder.apply(&temp_recorder); + recorder.merge(temp_recorder); } else { temp_recorder.reverse_inplace(); self.recording_geometry_with_rtree.apply(&temp_recorder); diff --git a/src/geometry/edit.rs b/src/geometry/edit.rs index 8342b14..814e79b 100644 --- a/src/geometry/edit.rs +++ b/src/geometry/edit.rs @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: MIT -use std::collections::BTreeMap; +use std::collections::{btree_map::Entry, BTreeMap}; use crate::graph::{GenericIndex, GetPetgraphIndex}; @@ -32,10 +32,6 @@ pub struct GeometryEdit { BTreeMap, (Option<(Vec<(Cel, PI)>, CW)>, Option<(Vec<(Cel, PI)>, CW)>)>, } -fn swap_tuple_inplace(x: &mut (D, D)) { - core::mem::swap(&mut x.0, &mut x.1); -} - impl< DW: AccessDotWeight + GetLayer, SW: AccessSegWeight + GetLayer, @@ -57,11 +53,40 @@ impl< } } + pub fn merge(&mut self, edit: GeometryEdit) { + Self::merge_btmap(&mut self.dots, &edit.dots); + Self::merge_btmap(&mut self.segs, &edit.segs); + Self::merge_btmap(&mut self.bends, &edit.bends); + Self::merge_btmap(&mut self.compounds, &edit.compounds); + } + + fn merge_btmap( + main: &mut BTreeMap, Option)>, + edit: &BTreeMap, Option)>, + ) { + for (index, (old, new)) in edit { + match main.entry(*index) { + Entry::Vacant(vac) => { + vac.insert((old.clone(), new.clone())); + } + Entry::Occupied(mut occ) => { + occ.get_mut().1 = new.clone(); + } + } + } + } + pub fn reverse_inplace(&mut self) { - self.dots.values_mut().for_each(swap_tuple_inplace); - self.segs.values_mut().for_each(swap_tuple_inplace); - self.bends.values_mut().for_each(swap_tuple_inplace); - self.compounds.values_mut().for_each(swap_tuple_inplace); + self.dots.values_mut().for_each(Self::swap_tuple_inplace); + self.segs.values_mut().for_each(Self::swap_tuple_inplace); + self.bends.values_mut().for_each(Self::swap_tuple_inplace); + self.compounds + .values_mut() + .for_each(Self::swap_tuple_inplace); + } + + fn swap_tuple_inplace(x: &mut (D, D)) { + core::mem::swap(&mut x.0, &mut x.1); } pub fn reverse(&self) -> Self { @@ -70,41 +95,3 @@ impl< rev } } - -fn apply_btmap( - main: &mut BTreeMap, Option)>, - edit: &BTreeMap, Option)>, -) { - use std::collections::btree_map::Entry; - for (index, (old, new)) in edit { - match main.entry(*index) { - Entry::Vacant(vac) => { - vac.insert((old.clone(), new.clone())); - } - Entry::Occupied(mut occ) => { - occ.get_mut().1 = new.clone(); - } - } - } -} - -impl< - DW: AccessDotWeight + GetLayer, - SW: AccessSegWeight + GetLayer, - BW: AccessBendWeight + GetLayer, - CW: Clone, - Cel: Copy, - PI: GetPetgraphIndex + TryInto + TryInto + TryInto + Eq + Ord + Copy, - DI: GetPetgraphIndex + Into + Eq + Ord + Copy, - SI: GetPetgraphIndex + Into + Eq + Ord + Copy, - BI: GetPetgraphIndex + Into + Eq + Ord + Copy, - > ApplyGeometryEdit - for GeometryEdit -{ - fn apply(&mut self, edit: &GeometryEdit) { - apply_btmap(&mut self.dots, &edit.dots); - apply_btmap(&mut self.segs, &edit.segs); - apply_btmap(&mut self.bends, &edit.bends); - apply_btmap(&mut self.compounds, &edit.compounds); - } -}