Skip to content

Commit 170d48c

Browse files
committed
Pre-allocate for pushes to the vector domains
1 parent cbeac5a commit 170d48c

2 files changed

Lines changed: 45 additions & 0 deletions

File tree

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
@@ -604,6 +617,12 @@ impl RegionDomain {
604617
self.fill.clear();
605618
}
606619

620+
pub fn reserve(&mut self, additional: usize) {
621+
self.id.reserve(additional);
622+
self.segment_range.reserve(additional);
623+
self.fill.reserve(additional);
624+
}
625+
607626
pub fn retain(&mut self, f: impl Fn(&RegionId) -> bool) {
608627
let mut keep = self.id.iter().map(&f);
609628
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
@@ -2389,6 +2389,32 @@ async fn morph<I: IntoGraphicTable + 'n + Send + Clone>(
23892389
let extra_source = source_subpaths.split_off(matched_count);
23902390
let extra_target = target_subpaths.split_off(matched_count);
23912391

2392+
// Pre-allocate domain storage based on total manipulator counts across all subpaths
2393+
let mut total_points = 0;
2394+
let mut total_segments = 0;
2395+
let mut total_regions = 0;
2396+
for ((source_manips, source_closed), (target_manips, _)) in source_subpaths.iter().zip(target_subpaths.iter()) {
2397+
if source_manips.is_empty() || target_manips.is_empty() {
2398+
continue;
2399+
}
2400+
let manip_count = source_manips.len().max(target_manips.len());
2401+
total_points += manip_count;
2402+
total_segments += if *source_closed { manip_count } else { manip_count.saturating_sub(1) };
2403+
if *source_closed {
2404+
total_regions += 1;
2405+
}
2406+
}
2407+
for (manips, closed) in extra_source.iter().chain(extra_target.iter()) {
2408+
total_points += manips.len();
2409+
total_segments += if *closed { manips.len() } else { manips.len().saturating_sub(1) };
2410+
if *closed {
2411+
total_regions += 1;
2412+
}
2413+
}
2414+
vector.point_domain.reserve(total_points);
2415+
vector.segment_domain.reserve(total_segments);
2416+
vector.region_domain.reserve(total_regions);
2417+
23922418
let mut point_id = PointId::ZERO;
23932419
let mut segment_id = SegmentId::ZERO;
23942420

0 commit comments

Comments
 (0)