Refactor ElementMap, removing its copy-on-write feature

This commit is contained in:
2026-10-11 22:24:00 +02:00
parent 4e20c49486
commit 3d7dda6f7b
9 changed files with 281 additions and 113 deletions
+47 -8
View File
@@ -15,8 +15,10 @@ macro_rules! graph_topology_addition_tests {
reserve_edges_does_not_affect_vertex_capacity,
add_vertex,
add_edge,
vertex_map_new_vertex,
edge_map_new_edge,
sync_vertex_map_after_add,
sync_edge_map_after_add,
sync_vertex_map_preserves_values,
sync_edge_map_preserves_values,
);
};
@@ -122,31 +124,68 @@ where
assert_ne!(graph.add_edge(u, v), e, "unexpected duplicate edge");
}
pub fn vertex_map_new_vertex<G: GraphTopologyAddition>() {
pub fn sync_vertex_map_after_add<G: GraphTopologyAddition>() {
let mut graph = G::default();
let mut map = graph.vertex_map(27);
let u = graph.add_vertex();
let v = graph.add_vertex();
graph.sync_vertex_map(&mut map);
assert_eq!(
map[v], 27,
map[u], 27,
"unexpected value from default map read for new vertex"
);
map[v] = 9;
map[u] = 9;
assert_eq!(
map[v], 9,
map[u], 9,
"unexpected value from map read after write for new vertex"
);
assert_eq!(
map[v], 27,
"unexpected value from default map read for second new vertex"
);
}
pub fn edge_map_new_edge<G: GraphTopologyAddition>() {
pub fn sync_edge_map_after_add<G: GraphTopologyAddition>() {
let mut graph = G::default();
let u = graph.add_vertex();
let v = graph.add_vertex();
let mut map = graph.edge_map(28);
let e = graph.add_edge(u, v);
assert_eq!(map[e], 28);
let f = graph.add_edge(u, v);
graph.sync_edge_map(&mut map);
assert_eq!(
map[e], 28,
"unexpected value from default map read for new edge"
);
map[e] = 8;
assert_eq!(
map[e], 8,
"unexpected value from map read after write for new edge"
);
assert_eq!(
map[f], 28,
"unexpected value from default map read for second new edge"
);
}
pub fn sync_vertex_map_preserves_values<G: GraphTopologyAddition>() {
let mut graph = G::default();
let v = graph.add_vertex();
let mut map = graph.vertex_map(0);
map[v] = 5;
graph.reserve_vertices(20);
graph.sync_vertex_map(&mut map);
assert_eq!(map[v], 5, "sync should not change existing map values");
}
pub fn sync_edge_map_preserves_values<G: GraphTopologyAddition>() {
let mut graph = G::default();
let u = graph.add_vertex();
let v = graph.add_vertex();
let e = graph.add_edge(u, v);
let mut map = graph.edge_map(0);
map[e] = 6;
graph.reserve_edges(20);
graph.sync_edge_map(&mut map);
assert_eq!(map[e], 6, "sync should not change existing map values");
}