Skip to content

Commit 254cecc

Browse files
committed
more &mut's rather than Rc<RefCells>.
1 parent e4170b8 commit 254cecc

8 files changed

+63
-55
lines changed

geo/src/algorithm/relate/edge_end_builder.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ impl<F: GeoFloat> EdgeEndBuilder<F> {
2020
}
2121
}
2222

23-
pub fn compute_ends_for_edges(&self, edges: &[Arc<RefCell<Edge<F>>>]) -> Vec<EdgeEnd<F>> {
23+
pub fn compute_ends_for_edges(&self, edges: &mut [Edge<F>]) -> Vec<EdgeEnd<F>> {
2424
let mut list = vec![];
2525
for edge in edges {
26-
self.compute_ends_for_edge(&mut edge.borrow_mut(), &mut list);
26+
self.compute_ends_for_edge(edge, &mut list);
2727
}
2828
list
2929
}

geo/src/algorithm/relate/geomgraph/geometry_graph.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ where
110110
self.planar_graph.edges()
111111
}
112112

113+
pub(crate) fn edges_mut(&mut self) -> &mut [Edge<F>] {
114+
self.planar_graph.edges_mut()
115+
}
116+
113117
pub(crate) fn insert_edge(&mut self, edge: Edge<F>) {
114118
self.planar_graph.insert_edge(edge)
115119
}
@@ -353,8 +357,8 @@ where
353357
}
354358

355359
pub(crate) fn compute_edge_intersections(
356-
&self,
357-
other: &GeometryGraph<F>,
360+
&'a mut self,
361+
other: &mut GeometryGraph<'a, F>,
358362
line_intersector: Box<dyn LineIntersector<F>>,
359363
) -> SegmentIntersector<F> {
360364
let mut segment_intersector = SegmentIntersector::new(line_intersector, false);

geo/src/algorithm/relate/geomgraph/index/edge_set_intersector.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub(crate) trait EdgeSetIntersector<F: GeoFloat> {
1414
/// `segment_intersector`: the SegmentIntersector to use
1515
fn compute_intersections_within_set(
1616
&self,
17-
graph: &GeometryGraph<F>,
17+
graph: &mut GeometryGraph<F>,
1818
check_for_self_intersecting_edges: bool,
1919
segment_intersector: &mut SegmentIntersector<F>,
2020
);
@@ -23,8 +23,8 @@ pub(crate) trait EdgeSetIntersector<F: GeoFloat> {
2323
/// the intersecting edges.
2424
fn compute_intersections_between_sets<'a>(
2525
&self,
26-
graph_0: &GeometryGraph<'a, F>,
27-
graph_1: &GeometryGraph<'a, F>,
26+
graph_0: &mut GeometryGraph<'a, F>,
27+
graph_1: &mut GeometryGraph<'a, F>,
2828
segment_intersector: &mut SegmentIntersector<F>,
2929
);
3030
}

geo/src/algorithm/relate/geomgraph/index/rstar_edge_set_intersector.rs

+14-12
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,19 @@ where
1515
{
1616
fn compute_intersections_within_set(
1717
&self,
18-
graph: &GeometryGraph<F>,
18+
graph: &mut GeometryGraph<F>,
1919
check_for_self_intersecting_edges: bool,
2020
segment_intersector: &mut SegmentIntersector<F>,
2121
) {
22-
let edges = graph.edges();
23-
2422
let tree = graph.get_or_build_tree();
23+
let mut edges = graph.edges_mut();
2524
for (segment_0, segment_1) in tree.intersection_candidates_with_other_tree(&tree) {
2625
if check_for_self_intersecting_edges || segment_0.edge_idx != segment_1.edge_idx {
27-
let edge_0 = &edges[segment_0.edge_idx];
28-
let edge_1 = &edges[segment_1.edge_idx];
26+
// use get_many_mut when available.
27+
assert!(segment_1.edge_idx > segment_0.edge_idx);
28+
let (e0, e1) = edges.split_at_mut(segment_0.edge_idx+1);
29+
let edge_0 = &mut e0[segment_0.edge_idx];
30+
let edge_1 = &mut e1[segment_1.edge_idx-segment_0.edge_idx+1];
2931
segment_intersector.add_intersections(
3032
edge_0,
3133
segment_0.segment_idx,
@@ -38,19 +40,19 @@ where
3840

3941
fn compute_intersections_between_sets<'a>(
4042
&self,
41-
graph_0: &GeometryGraph<'a, F>,
42-
graph_1: &GeometryGraph<'a, F>,
43+
graph_0: &mut GeometryGraph<'a, F>,
44+
graph_1: &mut GeometryGraph<'a, F>,
4345
segment_intersector: &mut SegmentIntersector<F>,
4446
) {
45-
let edges_0 = graph_0.edges();
46-
let edges_1 = graph_1.edges();
47-
4847
let tree_0 = graph_0.get_or_build_tree();
4948
let tree_1 = graph_1.get_or_build_tree();
5049

50+
let edges_0 = graph_0.edges_mut();
51+
let edges_1 = graph_1.edges_mut();
52+
5153
for (segment_0, segment_1) in tree_0.intersection_candidates_with_other_tree(&tree_1) {
52-
let edge_0 = &edges_0[segment_0.edge_idx];
53-
let edge_1 = &edges_1[segment_1.edge_idx];
54+
let edge_0 = &mut edges_0[segment_0.edge_idx];
55+
let edge_1 = &mut edges_1[segment_1.edge_idx];
5456
segment_intersector.add_intersections(
5557
edge_0,
5658
segment_0.segment_idx,

geo/src/algorithm/relate/geomgraph/index/segment_intersector.rs

+6-10
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ where
9696

9797
pub fn add_intersections(
9898
&mut self,
99-
edge0: &Edge<F>,
99+
edge0: &mut Edge<F>,
100100
segment_index_0: usize,
101-
edge1: &Edge<F>,
101+
edge1: &mut Edge<F>,
102102
segment_index_1: usize,
103103
) {
104104
// avoid a segment spuriously "intersecting" with itself
@@ -123,8 +123,8 @@ where
123123
let intersection = intersection.unwrap();
124124

125125
if !self.edges_are_from_same_geometry {
126-
edge0.borrow_mut().mark_as_unisolated();
127-
edge1.borrow_mut().mark_as_unisolated();
126+
edge0.mark_as_unisolated();
127+
edge1.mark_as_unisolated();
128128
}
129129
if !self.is_trivial_intersection(
130130
intersection,
@@ -136,13 +136,9 @@ where
136136
if self.edges_are_from_same_geometry || !intersection.is_proper() {
137137
// In the case of self-noding, `edge0` might alias `edge1`, so it's imperative that
138138
// the mutable borrows are short lived and do not overlap.
139-
edge0
140-
.borrow_mut()
141-
.add_intersections(intersection, line_0, segment_index_0);
139+
edge0.add_intersections(intersection, line_0, segment_index_0);
142140

143-
edge1
144-
.borrow_mut()
145-
.add_intersections(intersection, line_1, segment_index_1);
141+
edge1.add_intersections(intersection, line_1, segment_index_1);
146142
}
147143
if let LineIntersection::SinglePoint {
148144
is_proper: true,

geo/src/algorithm/relate/geomgraph/index/simple_edge_set_intersector.rs

+20-14
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ impl SimpleEdgeSetIntersector {
1515

1616
fn compute_intersects<F: GeoFloat>(
1717
&self,
18-
edge0: &Arc<RefCell<Edge<F>>>,
19-
edge1: &Arc<RefCell<Edge<F>>>,
18+
edge0: &mut Edge<F>,
19+
edge1: &mut Edge<F>,
2020
segment_intersector: &mut SegmentIntersector<F>,
2121
) {
22-
let edge0_coords_len = edge0.borrow().coords().len() - 1;
23-
let edge1_coords_len = edge1.borrow().coords().len() - 1;
22+
let edge0_coords_len = edge0.coords().len() - 1;
23+
let edge1_coords_len = edge1.coords().len() - 1;
2424
for i0 in 0..edge0_coords_len {
2525
for i1 in 0..edge1_coords_len {
2626
segment_intersector.add_intersections(edge0, i0, edge1, i1);
@@ -36,24 +36,30 @@ impl<F: GeoFloat> EdgeSetIntersector<F> for SimpleEdgeSetIntersector {
3636
check_for_self_intersecting_edges: bool,
3737
segment_intersector: &mut SegmentIntersector<F>,
3838
) {
39-
let edges = graph.edges();
40-
for edge0 in edges.iter_mut() {
41-
for edge1 in edges.iter_mut() {
42-
if check_for_self_intersecting_edges || edge0.as_ptr() != edge1.as_ptr() {
43-
self.compute_intersects(edge0, edge1, segment_intersector);
44-
}
39+
let edges = graph.edges_mut();
40+
for i in 0..edges.len() {
41+
let (e0, e1) = edges.split_at_mut(i+1);
42+
let (e0, edge0) = e0.split_at_mut(i);
43+
let edge0 = &mut edge0[0];
44+
45+
if check_for_self_intersecting_edges {
46+
self.compute_intersects(edge0, edge0, segment_intersector);
47+
}
48+
49+
for edge1 in e0.iter_mut().chain(e1) {
50+
self.compute_intersects(edge0, edge1, segment_intersector);
4551
}
4652
}
4753
}
4854

4955
fn compute_intersections_between_sets<'a>(
5056
&self,
51-
graph_0: &GeometryGraph<'a, F>,
52-
graph_1: &GeometryGraph<'a, F>,
57+
graph_0: &mut GeometryGraph<'a, F>,
58+
graph_1: &mut GeometryGraph<'a, F>,
5359
segment_intersector: &mut SegmentIntersector<F>,
5460
) {
55-
let edges_0 = graph_0.edges();
56-
let edges_1 = graph_1.edges();
61+
let edges_0 = graph_0.edges_mut();
62+
let edges_1 = graph_1.edges_mut();
5763

5864
for edge0 in edges_0 {
5965
for edge1 in edges_1 {

geo/src/algorithm/relate/geomgraph/planar_graph.rs

+4
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ impl<F: GeoFloat> PlanarGraph<F> {
6464
&self.edges
6565
}
6666

67+
pub fn edges_mut(&mut self) -> &mut [Edge<F>] {
68+
&mut self.edges
69+
}
70+
6771
pub fn new() -> Self {
6872
PlanarGraph {
6973
nodes: NodeMap::new(),

geo/src/algorithm/relate/relate_operation.rs

+8-12
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ where
2929
graph_b: GeometryGraph<'a, F>,
3030
nodes: NodeMap<F, RelateNodeFactory>,
3131
line_intersector: RobustLineIntersector,
32-
isolated_edges: Vec<Arc<RefCell<Edge<F>>>>,
32+
isolated_edges: Vec<Edge<F>>,
3333
}
3434

3535
#[derive(PartialEq)]
@@ -87,7 +87,7 @@ where
8787
// compute intersections between edges of the two input geometries
8888
let segment_intersector = self
8989
.graph_a
90-
.compute_edge_intersections(&self.graph_b, Box::new(self.line_intersector.clone()));
90+
.compute_edge_intersections(&mut self.graph_b, Box::new(self.line_intersector.clone()));
9191

9292
self.compute_intersection_nodes(0);
9393
self.compute_intersection_nodes(1);
@@ -103,9 +103,9 @@ where
103103
// (eg where one or other of the geometries has a vertex at the intersection point)
104104
// We need to compute the edge graph at all nodes to determine the IM.
105105
let edge_end_builder = EdgeEndBuilder::new();
106-
let edge_ends_a: Vec<_> = edge_end_builder.compute_ends_for_edges(self.graph_a.edges());
106+
let edge_ends_a: Vec<_> = edge_end_builder.compute_ends_for_edges(self.graph_a.edges_mut());
107107
self.insert_edge_ends(edge_ends_a);
108-
let edge_ends_b: Vec<_> = edge_end_builder.compute_ends_for_edges(self.graph_b.edges());
108+
let edge_ends_b: Vec<_> = edge_end_builder.compute_ends_for_edges(self.graph_b.edges_mut());
109109
self.insert_edge_ends(edge_ends_b);
110110

111111
let mut nodes = NodeMap::new();
@@ -268,8 +268,6 @@ where
268268
};
269269

270270
for edge in graph.edges() {
271-
let edge = edge.borrow();
272-
273271
let edge_position = edge.label().on_position(geom_index);
274272
for edge_intersection in edge.edge_intersections() {
275273
let (new_node, _edges) = self
@@ -294,8 +292,7 @@ where
294292
"before updated_intersection_matrix(isolated_edges): {:?}",
295293
intersection_matrix
296294
);
297-
for isolated_edge in &self.isolated_edges {
298-
let edge = isolated_edge.borrow();
295+
for edge in &self.isolated_edges {
299296
Edge::<F>::update_intersection_matrix(edge.label(), intersection_matrix);
300297
debug!(
301298
"after isolated_edge update_intersection_matrix: {:?}, (isolated_edge: {:?}, label: {:?})",
@@ -324,10 +321,9 @@ where
324321
(&self.graph_b, &self.graph_a)
325322
};
326323

327-
for edge in this_graph.edges() {
328-
let mut mut_edge = edge.borrow_mut();
329-
if mut_edge.is_isolated() {
330-
Self::label_isolated_edge(&mut mut_edge, target_index, target_graph.geometry());
324+
for edge in this_graph.edges_mut() {
325+
if edge.is_isolated() {
326+
Self::label_isolated_edge(&mut edge, target_index, target_graph.geometry());
331327
self.isolated_edges.push(edge.clone());
332328
}
333329
}

0 commit comments

Comments
 (0)