Fix sizing bug
The available space was updated while removing elements, but the check for the next element expected the old value.
This commit is contained in:
parent
42d22e2a49
commit
3fb3a7b92b
1 changed files with 4 additions and 4 deletions
|
|
@ -105,23 +105,23 @@ fn grow(segments: &mut [Segment], mut available: u16) {
|
||||||
total_weight = segments.len() as f32;
|
total_weight = segments.len() as f32;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut changed = false;
|
let mut removed = 0;
|
||||||
segments.retain(|s| {
|
segments.retain(|s| {
|
||||||
let allotment = s.weight / total_weight * available as f32;
|
let allotment = s.weight / total_weight * available as f32;
|
||||||
if (s.size as f32) < allotment {
|
if (s.size as f32) < allotment {
|
||||||
return true; // May need to grow
|
return true; // May need to grow
|
||||||
}
|
}
|
||||||
available -= s.size;
|
removed += s.size;
|
||||||
changed = true;
|
|
||||||
false
|
false
|
||||||
});
|
});
|
||||||
|
available -= removed;
|
||||||
|
|
||||||
// If all segments were at least as large as their allotments, we would
|
// If all segments were at least as large as their allotments, we would
|
||||||
// be trying to shrink, not grow them. Hence, there must be at least one
|
// be trying to shrink, not grow them. Hence, there must be at least one
|
||||||
// segment that is smaller than its allotment.
|
// segment that is smaller than its allotment.
|
||||||
assert!(!segments.is_empty());
|
assert!(!segments.is_empty());
|
||||||
|
|
||||||
if !changed {
|
if removed == 0 {
|
||||||
break; // All remaining segments are smaller than their allotments
|
break; // All remaining segments are smaller than their allotments
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue