Skip to content

Commit 0022680

Browse files
authored
Avoid memory allocation when precomputed segments lengths is provided. (#2637)
* Avoid allocating a Vec when precomputed segments lengths is provided. * improved using option type. * we don't even need option type as Vec::new() doesn't allocate. * clean up
1 parent c9984a8 commit 0022680

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,19 +150,24 @@ enum BezPathTValue {
150150

151151
/// Convert a [BezPathTValue] to a parametric `(segment_index, t)` tuple.
152152
/// - Asserts that `t` values contained within the `SubpathTValue` argument lie in the range [0, 1].
153-
fn bezpath_t_value_to_parametric(bezpath: &kurbo::BezPath, t: BezPathTValue, segments_length: Option<&[f64]>) -> (usize, f64) {
153+
fn bezpath_t_value_to_parametric(bezpath: &kurbo::BezPath, t: BezPathTValue, precomputed_segments_length: Option<&[f64]>) -> (usize, f64) {
154154
let segment_count = bezpath.segments().count();
155155
assert!(segment_count >= 1);
156156

157157
match t {
158158
BezPathTValue::GlobalEuclidean(t) => {
159-
let lengths = segments_length
160-
.map(|segments_length| segments_length.to_vec())
161-
.unwrap_or(bezpath.segments().map(|segment| segment.perimeter(PERIMETER_ACCURACY)).collect());
159+
let computed_segments_length;
162160

163-
let total_length = lengths.iter().sum();
161+
let segments_length = if let Some(segments_length) = precomputed_segments_length {
162+
segments_length
163+
} else {
164+
computed_segments_length = bezpath.segments().map(|segment| segment.perimeter(PERIMETER_ACCURACY)).collect::<Vec<f64>>();
165+
computed_segments_length.as_slice()
166+
};
164167

165-
global_euclidean_to_local_euclidean(bezpath, t, lengths.as_slice(), total_length)
168+
let total_length = segments_length.iter().sum();
169+
170+
global_euclidean_to_local_euclidean(bezpath, t, segments_length, total_length)
166171
}
167172
BezPathTValue::GlobalParametric(global_t) => {
168173
assert!((0.0..=1.).contains(&global_t));

0 commit comments

Comments
 (0)