Update `undoredo` to 0.10

This commit is contained in:
Mikolaj Wielgus 2026-05-17 14:12:22 +02:00
parent 272bdb326d
commit 7f67a24808
7 changed files with 47 additions and 85 deletions

View File

@ -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.8", features = ["stable-vec"] }
undoredo = { version = "0.10", features = ["derive", "stable-vec", "rstar"] }
[profile.release]
opt-level = 2 # Fast and small WASM.

View File

@ -14,7 +14,7 @@ dearcut = { version = "0.3", features = ["serde", "undoredo"] }
derive-getters.workspace = true
derive_more.workspace = true
i_triangle = "0.40"
polygon_unionfind = "0.5"
polygon_unionfind = "0.7"
rstar = "0.12"
serde.workspace = true
spade = "2.15"

View File

@ -201,11 +201,11 @@ pub struct BoardHalfDelta {
}
impl ApplyDelta<BoardHalfDelta> for Board {
fn apply_delta(&mut self, delta: &Delta<BoardHalfDelta>) {
let (removed, inserted) = delta.clone().dissolve();
fn apply_delta(&mut self, delta: Delta<BoardHalfDelta>) {
let (removed, inserted) = delta.dissolve();
let layout_delta = Delta::with_removed_inserted(removed.layout, inserted.layout);
self.layout.apply_delta(&layout_delta);
self.layout.apply_delta(layout_delta);
}
}

View File

@ -16,13 +16,13 @@ impl Connectivity {
pub fn new(board: &Board) -> Self {
let mut this = Connectivity {
joints_unionfind: UnionFind::with_len(
board.layout().joints().collection().num_elements(),
board.layout().joints().container().num_elements(),
),
segments_unionfind: UnionFind::with_len(
board.layout().segments().collection().num_elements(),
board.layout().segments().container().num_elements(),
),
polygons_unionfind: UnionFind::with_len(
board.layout().polygons().collection().num_elements(),
board.layout().polygons().container().num_elements(),
),
};

View File

@ -2,9 +2,7 @@
//
// SPDX-License-Identifier: MIT OR Apache-2.0
use std::collections::BTreeMap;
use derive_getters::{Dissolve, Getters};
use derive_getters::Getters;
use derive_more::Constructor;
use rstar::{
AABB, RTree,
@ -12,7 +10,8 @@ use rstar::{
};
use serde::{Deserialize, Serialize};
use stable_vec::StableVec;
use undoredo::{ApplyDelta, Delta, FlushDelta, Recorder};
use undoredo::aliases::RTreeHalfDelta;
use undoredo::{Delta, Recorder};
use crate::{
Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Vector2, Via, ViaId,
@ -64,12 +63,16 @@ impl NetId {
}
}
#[derive(Clone, Debug, Getters)]
#[derive(Delta, Clone, Debug, Getters)]
pub struct Layout {
#[undoredo(skip)]
boundary: Vec<[i64; 2]>,
#[undoredo(skip)]
place_boundary: Vec<[i64; 2]>,
#[undoredo(skip)]
layer_count: usize,
#[undoredo(skip)]
pins: StableVec<Pin>,
joints: Recorder<StableVec<Joint>>,
@ -77,10 +80,22 @@ pub struct Layout {
vias: Recorder<StableVec<Via>>,
polygons: Recorder<StableVec<Polygon>>,
joints_rtree: Recorder<RTree<GeomWithData<Rectangle<[i64; 3]>, JointId>>>,
segments_rtree: Recorder<RTree<GeomWithData<Rectangle<[i64; 3]>, SegmentId>>>,
vias_rtree: Recorder<RTree<GeomWithData<Rectangle<[i64; 3]>, ViaId>>>,
polygons_rtree: Recorder<RTree<GeomWithData<Rectangle<[i64; 3]>, PolygonId>>>,
joints_rtree: Recorder<
RTree<GeomWithData<Rectangle<[i64; 3]>, JointId>>,
RTreeHalfDelta<GeomWithData<Rectangle<[i64; 3]>, JointId>>,
>,
segments_rtree: Recorder<
RTree<GeomWithData<Rectangle<[i64; 3]>, SegmentId>>,
RTreeHalfDelta<GeomWithData<Rectangle<[i64; 3]>, SegmentId>>,
>,
vias_rtree: Recorder<
RTree<GeomWithData<Rectangle<[i64; 3]>, ViaId>>,
RTreeHalfDelta<GeomWithData<Rectangle<[i64; 3]>, ViaId>>,
>,
polygons_rtree: Recorder<
RTree<GeomWithData<Rectangle<[i64; 3]>, PolygonId>>,
RTreeHalfDelta<GeomWithData<Rectangle<[i64; 3]>, PolygonId>>,
>,
}
impl Layout {
@ -201,7 +216,7 @@ impl Layout {
.as_ref()
.locate_all_at_point(&[point.x, point.y, layer as i64])
.map(|geom_with_data| geom_with_data.data)
.filter(move |joint_id| {
.filter(move |&joint_id| {
self.joints
.get(&joint_id.index())
.unwrap()
@ -232,7 +247,7 @@ impl Layout {
.as_ref()
.locate_all_at_point(&[point.x, point.y, layer as i64])
.map(|geom_with_data| geom_with_data.data)
.filter(move |polygon_id| {
.filter(move |&polygon_id| {
self.polygons
.get(&polygon_id.index())
.unwrap()
@ -290,57 +305,3 @@ impl Layout {
&self.pins[pin_id.index()]
}
}
#[derive(Clone, Debug, Dissolve)]
pub struct LayoutHalfDelta {
joints: BTreeMap<usize, Joint>,
segments: BTreeMap<usize, Segment>,
vias: BTreeMap<usize, Via>,
polygons: BTreeMap<usize, Polygon>,
}
impl ApplyDelta<LayoutHalfDelta> for Layout {
fn apply_delta(&mut self, delta: &Delta<LayoutHalfDelta>) {
let (removed, inserted) = delta.clone().dissolve();
let joints_delta = Delta::with_removed_inserted(removed.joints, inserted.joints);
self.joints.apply_delta(&joints_delta);
let segments_delta = Delta::with_removed_inserted(removed.segments, inserted.segments);
self.segments.apply_delta(&segments_delta);
let vias_delta = Delta::with_removed_inserted(removed.vias, inserted.vias);
self.vias.apply_delta(&vias_delta);
let polygons_delta = Delta::with_removed_inserted(removed.polygons, inserted.polygons);
self.polygons.apply_delta(&polygons_delta);
// TODO R-trees.
}
}
impl FlushDelta<LayoutHalfDelta> for Layout {
fn flush_delta(&mut self) -> Delta<LayoutHalfDelta> {
let (removed_joints, inserted_joints) = self.joints.flush_delta().dissolve();
let (removed_segments, inserted_segments) = self.segments.flush_delta().dissolve();
let (removed_vias, inserted_vias) = self.vias.flush_delta().dissolve();
let (removed_polygons, inserted_polygons) = self.polygons.flush_delta().dissolve();
// TODO R-trees.
Delta::with_removed_inserted(
LayoutHalfDelta {
joints: removed_joints,
segments: removed_segments,
vias: removed_vias,
polygons: removed_polygons,
},
LayoutHalfDelta {
joints: inserted_joints,
segments: inserted_segments,
vias: inserted_vias,
polygons: inserted_polygons,
},
)
}
}

View File

@ -6,6 +6,7 @@ use dearcut::{RecordingTriangulator, VertexId};
use derive_getters::Getters;
use derive_more::Constructor;
use serde::{Deserialize, Serialize};
use stable_vec::StableVec;
use undoredo::Recorder;
use crate::{Board, Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Vector2};
@ -176,9 +177,9 @@ pub struct NavmesherBoard {
navmesher: Navmesher,
board: Board,
joint_multiobstacles: Recorder<Vec<MultiObstacleId>>,
segment_multiobstacles: Recorder<Vec<MultiObstacleId>>,
polygon_multiobstacles: Recorder<Vec<MultiObstacleId>>,
joint_multiobstacles: Recorder<StableVec<MultiObstacleId>>,
segment_multiobstacles: Recorder<StableVec<MultiObstacleId>>,
polygon_multiobstacles: Recorder<StableVec<MultiObstacleId>>,
}
impl NavmesherBoard {
@ -194,12 +195,12 @@ impl NavmesherBoard {
),
board,
joint_multiobstacles: Recorder::new(Vec::new()),
segment_multiobstacles: Recorder::new(Vec::new()),
polygon_multiobstacles: Recorder::new(Vec::new()),
joint_multiobstacles: Recorder::new(StableVec::new()),
segment_multiobstacles: Recorder::new(StableVec::new()),
polygon_multiobstacles: Recorder::new(StableVec::new()),
};
for (i, joint) in this.board.layout().joints().collection() {
for (i, joint) in this.board.layout().joints().container().iter() {
this.joint_multiobstacles.insert(
i,
this.navmesher
@ -207,7 +208,7 @@ impl NavmesherBoard {
);
}
for (i, segment) in this.board.layout().segments().collection() {
for (i, segment) in this.board.layout().segments().container().iter() {
this.segment_multiobstacles.insert(
i,
this.navmesher
@ -215,7 +216,7 @@ impl NavmesherBoard {
);
}
for (i, polygon) in this.board.layout().polygons().collection() {
for (i, polygon) in this.board.layout().polygons().container().iter() {
this.polygon_multiobstacles.insert(
i,
this.navmesher

View File

@ -46,7 +46,7 @@ impl Ratsnest {
let mut triangulations: BTreeMap<(NetId, usize), DelaunayTriangulation<DelaunayVertex>> =
BTreeMap::new();
for (i, joint) in board.layout().joints().collection() {
for (i, joint) in board.layout().joints().container().iter() {
let _ = triangulations
.entry((joint.net, joint.layer))
.or_insert_with(DelaunayTriangulation::new)
@ -58,7 +58,7 @@ impl Ratsnest {
});
}
for (i, segment) in board.layout().segments().collection() {
for (i, segment) in board.layout().segments().container().iter() {
let segment_center = segment.center();
let _ = triangulations
.entry((segment.net, segment.layer))
@ -71,7 +71,7 @@ impl Ratsnest {
});
}
for (i, polygon) in board.layout().polygons().collection() {
for (i, polygon) in board.layout().polygons().container().iter() {
let _ = triangulations
.entry((polygon.net, polygon.layer))
.or_insert_with(DelaunayTriangulation::new)