13int SafeRatio(
int value,
int numerator,
int denominator) {
14 return static_cast<int64_t
>(value) *
static_cast<int64_t
>(numerator) /
15 std::max(
static_cast<int64_t
>(denominator),
static_cast<int64_t
>(1));
20void ComputeGrow(std::vector<Element>* elements,
23 for (
Element& element : *elements) {
24 const int added_space =
25 SafeRatio(extra_space, element.flex_grow, flex_grow_sum);
26 extra_space -= added_space;
27 flex_grow_sum -= element.flex_grow;
28 element.size = element.min_size + added_space;
35void ComputeShrinkEasy(std::vector<Element>* elements,
37 int flex_shrink_sum) {
38 for (
Element& element : *elements) {
39 const int added_space = SafeRatio(
40 extra_space, element.min_size * element.flex_shrink, flex_shrink_sum);
41 extra_space -= added_space;
42 flex_shrink_sum -= element.flex_shrink * element.min_size;
43 element.size = element.min_size + added_space;
51void ComputeShrinkHard(std::vector<Element>* elements,
54 for (
Element& element : *elements) {
55 if (element.flex_shrink != 0) {
60 const int added_space = SafeRatio(extra_space, element.min_size, size);
62 extra_space -= added_space;
63 size -= element.min_size;
65 element.size = element.min_size + added_space;
71void Compute(std::vector<Element>* elements,
int target_size) {
73 int flex_grow_sum = 0;
74 int flex_shrink_sum = 0;
75 int flex_shrink_size = 0;
77 for (
auto& element : *elements) {
78 flex_grow_sum += element.flex_grow;
79 flex_shrink_sum += element.min_size * element.flex_shrink;
80 if (element.flex_shrink != 0) {
81 flex_shrink_size += element.min_size;
83 size += element.min_size;
86 const int extra_space = target_size -
size;
87 if (extra_space >= 0) {
88 ComputeGrow(elements, extra_space, flex_grow_sum);
89 }
else if (flex_shrink_size + extra_space >= 0) {
90 ComputeShrinkEasy(elements, extra_space, flex_shrink_sum);
93 ComputeShrinkHard(elements, extra_space + flex_shrink_size,
94 size - flex_shrink_size);