java-topology/defects/curaengine-0001/patch/curaengine-0001-path-order-monotonic-vector-find.patch

38 lines
2.1 KiB
Diff

# UNDF: UNDF-2026-000001073
# UNDF: (leave blank — assigned later)
--- a/src/PathOrderMonotonic.cpp
+++ b/src/PathOrderMonotonic.cpp
@@ -278,6 +278,8 @@ std::vector<typename PathOrderMonotonic<PathType>::Path> PathOrderMonotonic<Path
std::unordered_set<Path*> starting_lines;
std::unordered_map<Path*, Path*> connections;
+ // Pre-build an index from Path* to its position in polylines for O(1) iterator lookup.
+ std::unordered_map<Path*, typename std::vector<Path*>::iterator> polyline_index;
+ for (auto it = polylines.begin(); it != polylines.end(); ++it)
+ polyline_index[*it] = it;
+
for (auto polyline_it = polylines.begin(); polyline_it != polylines.end(); polyline_it++)
{
if (connections.contains(*polyline_it))
@@ -291,15 +295,17 @@ std::vector<typename PathOrderMonotonic<PathType>::Path> PathOrderMonotonic<Path
if (polystring.size() > 1)
{
starting_lines.insert(polystring[0]);
+ // Build a set of paths in this polystring for O(1) membership checks.
+ std::unordered_set<Path*> polystring_set(polystring.begin(), polystring.end());
for (size_t i = 0; i < polystring.size() - 1; ++i)
{
connections[polystring[i]] = polystring[i + 1];
connected_lines.insert(polystring[i + 1]);
const std::vector<Path*> overlapping_lines
- = getOverlappingLines(std::find(polylines.begin(), polylines.end(), polystring[i]), perpendicular, polylines, max_adjacent_distance);
+ = getOverlappingLines(polyline_index.at(polystring[i]), perpendicular, polylines, max_adjacent_distance);
for (Path* overlapping_line : overlapping_lines)
{
- if (std::find(polystring.begin(), polystring.end(), overlapping_line)
- == polystring.end())
+ if (polystring_set.find(overlapping_line) == polystring_set.end())
{
starting_lines.insert(overlapping_line);
starting_lines.insert(polystring[i + 1]);