14int SafeRatio(
int value,
int numerator,
int denominator) {
15 return static_cast<int>(
16 static_cast<int64_t
>(value) *
static_cast<int64_t
>(numerator) /
17 std::max(
static_cast<int64_t
>(denominator),
static_cast<int64_t
>(1)));
23void ComputeGrow(std::vector<Element>* elements,
26 for (
Element& element : *elements) {
27 const int added_space =
28 SafeRatio(extra_space, element.flex_grow, flex_grow_sum);
29 extra_space -= added_space;
30 flex_grow_sum -= element.flex_grow;
31 element.size = element.min_size + added_space;
38void ComputeShrinkEasy(std::vector<Element>* elements,
40 int flex_shrink_sum) {
41 for (
Element& element : *elements) {
42 const int added_space = SafeRatio(
43 extra_space, element.min_size * element.flex_shrink, flex_shrink_sum);
44 extra_space -= added_space;
45 flex_shrink_sum -= element.flex_shrink * element.min_size;
46 element.size = element.min_size + added_space;
54void ComputeShrinkHard(std::vector<Element>* elements,
57 for (
Element& element : *elements) {
58 if (element.flex_shrink != 0) {
63 const int added_space = SafeRatio(extra_space, element.min_size, size);
65 extra_space -= added_space;
66 size -= element.min_size;
68 element.size = element.min_size + added_space;
74void Compute(std::vector<Element>* elements,
int target_size) {
76 int flex_grow_sum = 0;
77 int flex_shrink_sum = 0;
78 int flex_shrink_size = 0;
80 for (
auto& element : *elements) {
81 flex_grow_sum += element.flex_grow;
82 flex_shrink_sum += element.min_size * element.flex_shrink;
83 if (element.flex_shrink != 0) {
84 flex_shrink_size += element.min_size;
86 size += element.min_size;
89 const int extra_space = target_size -
size;
90 if (extra_space >= 0) {
91 ComputeGrow(elements, extra_space, flex_grow_sum);
92 }
else if (flex_shrink_size + extra_space >= 0) {
93 ComputeShrinkEasy(elements, extra_space, flex_shrink_sum);
96 ComputeShrinkHard(elements, extra_space + flex_shrink_size,
97 size - flex_shrink_size);