diff --git a/src/autorouter/autoroute.rs b/src/autorouter/autoroute.rs index dc6dfa7..4705a9b 100644 --- a/src/autorouter/autoroute.rs +++ b/src/autorouter/autoroute.rs @@ -14,7 +14,7 @@ use crate::{ AccessMesadata, }, drawing::{band::BandTermsegIndex, graph::PrimitiveIndex, Collect}, - geometry::primitive::PrimitiveShape, + geometry::{edit::Edit, primitive::PrimitiveShape}, graph::MakeRef, layout::LayoutEdit, router::{ diff --git a/src/autorouter/invoker.rs b/src/autorouter/invoker.rs index 850cb01..9eb7474 100644 --- a/src/autorouter/invoker.rs +++ b/src/autorouter/invoker.rs @@ -15,7 +15,7 @@ use thiserror::Error; use crate::{ board::AccessMesadata, drawing::graph::PrimitiveIndex, - geometry::primitive::PrimitiveShape, + geometry::{edit::Edit, primitive::PrimitiveShape}, graph::GenericIndex, layout::poly::PolyWeight, router::{ diff --git a/src/board/edit.rs b/src/board/edit.rs index 505bfca..a809392 100644 --- a/src/board/edit.rs +++ b/src/board/edit.rs @@ -4,9 +4,7 @@ use std::collections::BTreeMap; -use crate::{drawing::band::BandUid, layout::LayoutEdit}; - -use super::BandName; +use crate::{board::BandName, drawing::band::BandUid, geometry::edit::Edit, layout::LayoutEdit}; #[derive(Debug, Clone)] pub struct BoardDataEdit { @@ -21,6 +19,16 @@ impl BoardDataEdit { } } +impl Edit for BoardDataEdit { + fn reverse_inplace(&mut self) { + self.bands.reverse_inplace(); + } + + fn merge(&mut self, edit: Self) { + self.bands.merge(edit.bands); + } +} + #[derive(Debug, Clone)] pub struct BoardEdit { pub data_edit: BoardDataEdit, @@ -41,22 +49,16 @@ impl BoardEdit { layout_edit, } } +} - pub fn reverse_inplace(&mut self) { - self.data_edit - .bands - .values_mut() - .for_each(Self::swap_tuple_inplace); +impl Edit for BoardEdit { + fn reverse_inplace(&mut self) { + self.data_edit.reverse_inplace(); self.layout_edit.reverse_inplace(); } - fn swap_tuple_inplace(x: &mut (D, D)) { - core::mem::swap(&mut x.0, &mut x.1); - } - - pub fn reverse(&self) -> Self { - let mut rev = self.clone(); - rev.reverse_inplace(); - rev + fn merge(&mut self, edit: Self) { + self.data_edit.merge(edit.data_edit); + self.layout_edit.merge(edit.layout_edit); } } diff --git a/src/geometry/edit.rs b/src/geometry/edit.rs index 7abfa56..3091e42 100644 --- a/src/geometry/edit.rs +++ b/src/geometry/edit.rs @@ -8,6 +8,21 @@ use crate::graph::{GenericIndex, GetPetgraphIndex}; use super::{AccessBendWeight, AccessDotWeight, AccessSegWeight, GetLayer}; +pub trait Edit: Sized { + fn reverse(&self) -> Self + where + Self: Clone, + { + let mut rev = self.clone(); + rev.reverse_inplace(); + rev + } + + fn reverse_inplace(&mut self); + + fn merge(&mut self, edit: Self); +} + pub trait ApplyGeometryEdit< DW: AccessDotWeight + GetLayer, SW: AccessSegWeight + GetLayer, @@ -58,50 +73,56 @@ impl< compounds: BTreeMap::new(), } } +} - 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); +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, + > Edit for GeometryEdit +{ + fn reverse_inplace(&mut self) { + self.dots.reverse_inplace(); + self.segs.reverse_inplace(); + self.bends.reverse_inplace(); + self.compounds.reverse_inplace(); } - fn merge_btmap( - main: &mut BTreeMap, Option)>, - edit: &BTreeMap, Option)>, - ) { + fn merge(&mut self, edit: Self) { + self.dots.merge(edit.dots); + self.segs.merge(edit.segs); + self.bends.merge(edit.bends); + self.compounds.merge(edit.compounds); + } +} + +impl Edit for BTreeMap, Option)> { + fn reverse_inplace(&mut self) { + self.values_mut() + .for_each(|x| core::mem::swap(&mut x.0, &mut x.1)); + } + + fn merge(&mut self, edit: Self) { for (index, (old, new)) in edit { - match main.entry(*index) { + match self.entry(index) { Entry::Vacant(vac) => { - vac.insert((old.clone(), new.clone())); + vac.insert((old, new)); } - Entry::Occupied(mut occ) => { - if let ((None, ..), None) = (occ.get(), new) { + Entry::Occupied(mut occ) => match (occ.get(), new) { + ((None, _), None) => { occ.remove(); - } else { - occ.get_mut().1 = new.clone(); } - } + (_, new) => { + occ.get_mut().1 = new; + } + }, } } } - - pub fn reverse_inplace(&mut self) { - 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 { - let mut rev = self.clone(); - rev.reverse_inplace(); - rev - } }