From cdee22d63e108b95bc2d7791455bd9ae0a13bc1e Mon Sep 17 00:00:00 2001 From: Ellen Emilia Anna Zscheile Date: Mon, 24 Mar 2025 14:19:50 +0100 Subject: [PATCH] feat(geometry/edit): impl ApplyGeometryEdit for GeometryEdit --- src/geometry/edit.rs | 77 +++++++++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/src/geometry/edit.rs b/src/geometry/edit.rs index e799578..1b98c87 100644 --- a/src/geometry/edit.rs +++ b/src/geometry/edit.rs @@ -33,6 +33,10 @@ pub struct GeometryEdit { primitive_weight_marker: PhantomData, } +fn swap_tuple_inplace(x: &mut (D, D)) { + core::mem::swap(&mut x.0, &mut x.1); +} + impl< PW: GetWidth + GetLayer + TryInto + TryInto + TryInto + Retag + Copy, DW: AccessDotWeight + Into + GetLayer, @@ -55,33 +59,54 @@ impl< } } + 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); + } + pub fn reverse(&self) -> Self { - Self { - dots: self - .dots - .clone() - .into_iter() - .map(|(k, v)| (k, (v.1, v.0))) - .collect(), - segs: self - .segs - .clone() - .into_iter() - .map(|(k, v)| (k, (v.1, v.0))) - .collect(), - bends: self - .bends - .clone() - .into_iter() - .map(|(k, v)| (k, (v.1, v.0))) - .collect(), - compounds: self - .compounds - .clone() - .into_iter() - .map(|(k, v)| (k, (v.1, v.0))) - .collect(), - primitive_weight_marker: PhantomData, + let mut rev = self.clone(); + rev.reverse_inplace(); + 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< + PW: GetWidth + GetLayer + TryInto + TryInto + TryInto + Retag + Copy, + DW: AccessDotWeight + Into + GetLayer, + SW: AccessSegWeight + Into + GetLayer, + BW: AccessBendWeight + Into + GetLayer, + CW: 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); + } +}