diff --git a/Cargo.toml b/Cargo.toml index 94f8e3d..f03c5d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ derive-getters = "0.5" derive_more = { version = "2.1", features = ["full"] } serde = { version = "1", features = ["derive", "rc"] } thiserror = "2.0" -undoredo = { version = "0.10", features = ["derive", "stable-vec", "rstar"] } +undoredo = { version = "0.10", features = ["derive", "bidimap", "stable-vec", "rstar"] } [profile.release] opt-level = 2 # Fast and small WASM. diff --git a/topola/Cargo.toml b/topola/Cargo.toml index 4fd4922..fb40f4a 100644 --- a/topola/Cargo.toml +++ b/topola/Cargo.toml @@ -9,7 +9,7 @@ version = "0.1.0" edition = "2024" [dependencies] -bimap = "0.6" +bidimap = "0.7" dearcut = { version = "0.3", features = ["serde", "undoredo"] } derive-getters.workspace = true derive_more.workspace = true diff --git a/topola/src/board/mod.rs b/topola/src/board/mod.rs index 89995e1..f2ff3b6 100644 --- a/topola/src/board/mod.rs +++ b/topola/src/board/mod.rs @@ -7,9 +7,9 @@ mod select; pub mod selections; mod transforms; -use bimap::BiBTreeMap; -use derive_getters::{Dissolve, Getters}; -use undoredo::{ApplyDelta, Delta, FlushDelta}; +use bidimap::BiBTreeMap; +use derive_getters::Getters; +use undoredo::{Delta, Recorder}; use crate::{ compounds::{ComponentId, NetId, PinId}, @@ -23,27 +23,27 @@ use crate::{ math::Vector2, }; -#[derive(Clone, Debug, Getters)] +#[derive(Clone, Debug, Getters, Delta)] pub struct Board { layout: Layout, #[getter(skip)] - component_names: BiBTreeMap, + component_names: Recorder>, #[getter(skip)] - pin_names: BiBTreeMap, + pin_names: Recorder>, #[getter(skip)] - layer_names: BiBTreeMap, + layer_names: Recorder>, #[getter(skip)] - net_names: BiBTreeMap, + net_names: Recorder>, } impl Board { pub fn new(boundary: Vec>, layer_count: usize) -> Self { Self { layout: Layout::new(boundary.into_iter().map(Into::into).collect(), layer_count), - component_names: BiBTreeMap::new(), - pin_names: BiBTreeMap::new(), - layer_names: BiBTreeMap::new(), - net_names: BiBTreeMap::new(), + component_names: Recorder::new(BiBTreeMap::new()), + pin_names: Recorder::new(BiBTreeMap::new()), + layer_names: Recorder::new(BiBTreeMap::new()), + net_names: Recorder::new(BiBTreeMap::new()), } } @@ -55,10 +55,10 @@ impl Board { ) -> Self { Self { layout: Layout::new(boundary.into_iter().map(Into::into).collect(), layer_count), - component_names: BiBTreeMap::new(), - pin_names: BiBTreeMap::new(), - layer_names, - net_names, + component_names: Recorder::new(BiBTreeMap::new()), + pin_names: Recorder::new(BiBTreeMap::new()), + layer_names: Recorder::new(layer_names), + net_names: Recorder::new(net_names), } } @@ -117,7 +117,10 @@ impl Board { } pub fn component_id(&self, component_name: &str) -> Option { - self.component_names.get_by_right(component_name).copied() + self.component_names + .as_ref() + .get_by_right(component_name) + .copied() } pub fn pin_name(&self, id: PinId) -> Option<&str> { @@ -125,7 +128,7 @@ impl Board { } pub fn pin_id(&self, pin_name: &str) -> Option { - self.pin_names.get_by_right(pin_name).copied() + self.pin_names.as_ref().get_by_right(pin_name).copied() } pub fn layer_name(&self, layer: usize) -> Option<&str> { @@ -133,7 +136,7 @@ impl Board { } pub fn layer_id(&self, layer_name: &str) -> Option { - self.layer_names.get_by_right(layer_name).copied() + self.layer_names.as_ref().get_by_right(layer_name).copied() } pub fn net_name(&self, id: NetId) -> Option<&str> { @@ -141,35 +144,6 @@ impl Board { } pub fn net_id(&self, net_name: &str) -> Option { - self.net_names.get_by_right(net_name).copied() - } -} - -#[derive(Clone, Debug, Dissolve)] -pub struct BoardHalfDelta { - layout: LayoutHalfDelta, -} - -impl ApplyDelta for Board { - fn apply_delta(&mut self, delta: Delta) { - let (removed, inserted) = delta.dissolve(); - - let layout_delta = Delta::with_removed_inserted(removed.layout, inserted.layout); - self.layout.apply_delta(layout_delta); - } -} - -impl FlushDelta for Board { - fn flush_delta(&mut self) -> Delta { - let (removed_layout, inserted_layout) = self.layout.flush_delta().dissolve(); - - Delta::with_removed_inserted( - BoardHalfDelta { - layout: removed_layout, - }, - BoardHalfDelta { - layout: inserted_layout, - }, - ) + self.net_names.as_ref().get_by_right(net_name).copied() } } diff --git a/topola/src/specctra.rs b/topola/src/specctra.rs index 077ee86..7b79cf7 100644 --- a/topola/src/specctra.rs +++ b/topola/src/specctra.rs @@ -4,7 +4,7 @@ use std::collections::BTreeMap; -use bimap::BiBTreeMap; +use bidimap::BiBTreeMap; use specctra::{ math::PointWithRotation, structure::{DsnFile, Layer, Point, Shape},