Skip to content

Commit d6f5782

Browse files
Keavontimon-schelling
authored andcommitted
Pre-allocate for pushes to the vector domains
1 parent 7db9c62 commit d6f5782

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
@@ -2314,6 +2314,32 @@ async fn morph<I: IntoGraphicTable + 'n + Send + Clone>(
23142314
let extra_source = source_subpaths.split_off(matched_count);
23152315
let extra_target = target_subpaths.split_off(matched_count);
23162316

2317+
// Pre-allocate domain storage based on total manipulator counts across all subpaths
2318+
let mut total_points = 0;
2319+
let mut total_segments = 0;
2320+
let mut total_regions = 0;
2321+
for ((source_manips, source_closed), (target_manips, _)) in source_subpaths.iter().zip(target_subpaths.iter()) {
2322+
if source_manips.is_empty() || target_manips.is_empty() {
2323+
continue;
2324+
}
2325+
let manip_count = source_manips.len().max(target_manips.len());
2326+
total_points += manip_count;
2327+
total_segments += if *source_closed { manip_count } else { manip_count.saturating_sub(1) };
2328+
if *source_closed {
2329+
total_regions += 1;
2330+
}
2331+
}
2332+
for (manips, closed) in extra_source.iter().chain(extra_target.iter()) {
2333+
total_points += manips.len();
2334+
total_segments += if *closed { manips.len() } else { manips.len().saturating_sub(1) };
2335+
if *closed {
2336+
total_regions += 1;
2337+
}
2338+
}
2339+
vector.point_domain.reserve(total_points);
2340+
vector.segment_domain.reserve(total_segments);
2341+
vector.region_domain.reserve(total_regions);
2342+
23172343
let mut point_id = PointId::ZERO;
23182344
let mut segment_id = SegmentId::ZERO;
23192345

0 commit comments

Comments
 (0)