Skip to content

Commit 17a6942

Browse files
committed
Pre-allocate for pushes to the vector domains
1 parent a9a3fe1 commit 17a6942

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

node-graph/libraries/vector-types/src/vector/vector_attributes.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@ impl PointDomain {
104104
self.position.clear();
105105
}
106106

107+
pub fn reserve(&mut self, additional: usize) {
108+
self.id.reserve(additional);
109+
self.position.reserve(additional);
110+
}
111+
107112
pub fn retain(&mut self, segment_domain: &mut SegmentDomain, f: impl Fn(&PointId) -> bool) {
108113
let mut keep = self.id.iter().map(&f);
109114
self.position.retain(|_| keep.next().unwrap_or_default());
@@ -236,6 +241,14 @@ impl SegmentDomain {
236241
self.stroke.clear();
237242
}
238243

244+
pub fn reserve(&mut self, additional: usize) {
245+
self.id.reserve(additional);
246+
self.start_point.reserve(additional);
247+
self.end_point.reserve(additional);
248+
self.handles.reserve(additional);
249+
self.stroke.reserve(additional);
250+
}
251+
239252
pub fn retain(&mut self, f: impl Fn(&SegmentId) -> bool, points_length: usize) {
240253
let additional_delete_ids = self
241254
.id
@@ -517,6 +530,12 @@ impl RegionDomain {
517530
self.fill.clear();
518531
}
519532

533+
pub fn reserve(&mut self, additional: usize) {
534+
self.id.reserve(additional);
535+
self.segment_range.reserve(additional);
536+
self.fill.reserve(additional);
537+
}
538+
520539
pub fn retain(&mut self, f: impl Fn(&RegionId) -> bool) {
521540
let mut keep = self.id.iter().map(&f);
522541
self.segment_range.retain(|_| keep.next().unwrap_or_default());

node-graph/nodes/vector/src/vector_nodes.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2297,6 +2297,32 @@ async fn morph<I: IntoGraphicTable + 'n + Send + Clone>(
22972297
let extra_source = source_subpaths.split_off(matched_count);
22982298
let extra_target = target_subpaths.split_off(matched_count);
22992299

2300+
// Pre-allocate domain storage based on total manipulator counts across all subpaths
2301+
let mut total_points = 0;
2302+
let mut total_segments = 0;
2303+
let mut total_regions = 0;
2304+
for ((source_manips, source_closed), (target_manips, _)) in source_subpaths.iter().zip(target_subpaths.iter()) {
2305+
if source_manips.is_empty() || target_manips.is_empty() {
2306+
continue;
2307+
}
2308+
let manip_count = source_manips.len().max(target_manips.len());
2309+
total_points += manip_count;
2310+
total_segments += if *source_closed { manip_count } else { manip_count.saturating_sub(1) };
2311+
if *source_closed {
2312+
total_regions += 1;
2313+
}
2314+
}
2315+
for (manips, closed) in extra_source.iter().chain(extra_target.iter()) {
2316+
total_points += manips.len();
2317+
total_segments += if *closed { manips.len() } else { manips.len().saturating_sub(1) };
2318+
if *closed {
2319+
total_regions += 1;
2320+
}
2321+
}
2322+
vector.point_domain.reserve(total_points);
2323+
vector.segment_domain.reserve(total_segments);
2324+
vector.region_domain.reserve(total_regions);
2325+
23002326
let mut point_id = PointId::ZERO;
23012327
let mut segment_id = SegmentId::ZERO;
23022328

0 commit comments

Comments
 (0)