Repository: GraphiteEditor/Graphite (language: rust)

Issue:
Reduce linear searches in fn append_subpath
The `fn append_subpath` uses a lot of unnecessary iterations which slow down text and boolean operations. These should be removed.


Discussion / hints:

Fix patch:
diff --git a/node-graph/gcore/src/vector/vector_data/attributes.rs b/node-graph/gcore/src/vector/vector_data/attributes.rs
index cb9b7b1db2..b164b09e72 100644
--- a/node-graph/gcore/src/vector/vector_data/attributes.rs
+++ b/node-graph/gcore/src/vector/vector_data/attributes.rs
@@ -129,10 +129,7 @@ impl PointDomain {
 	}
 
 	pub fn push(&mut self, id: PointId, position: DVec2) {
-		if self.id.contains(&id) {
-			warn!("Duplicate point");
-			return;
-		}
+		debug_assert!(!self.id.contains(&id));
 		self.id.push(id);
 		self.positions.push(position);
 	}
@@ -292,22 +289,13 @@ impl SegmentDomain {
 	}
 
 	pub(crate) fn push(&mut self, id: SegmentId, start: usize, end: usize, handles: bezier_rs::BezierHandles, stroke: StrokeId) {
-		if self.ids.contains(&id) {
-			return;
-		}
-		// Attempt to keep line joins?
-		let after = self.end_point.iter().copied().position(|other_end| other_end == start);
-		let before = self.start_point.iter().copied().position(|other_start| other_start == end);
-		let index = match (before, after) {
-			(_, Some(after)) => after + 1,
-			(Some(before), _) => before,
-			(None, None) => self.ids.len(),
-		};
-		self.ids.insert(index, id);
-		self.start_point.insert(index, start);
-		self.end_point.insert(index, end);
-		self.handles.insert(index, handles);
-		self.stroke.insert(index, stroke);
+		debug_assert!(!self.ids.contains(&id), "Tried to push an existing point to a point domain");
+
+		self.ids.push(id);
+		self.start_point.push(start);
+		self.end_point.push(end);
+		self.handles.push(handles);
+		self.stroke.push(stroke);
 	}
 
 	pub(crate) fn start_point_mut(&mut self) -> impl Iterator<Item = (SegmentId, &mut usize)> {


Test patch: