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));
19void ComputeGrow(std::vector<Element>* elements,
22 for (
Element& element : *elements) {
23 const int added_space =
24 SafeRatio(extra_space, element.flex_grow, flex_grow_sum);
25 extra_space -= added_space;
26 flex_grow_sum -= element.flex_grow;
27 element.size = element.min_size + added_space;
32void ComputeShrinkEasy(std::vector<Element>* elements,
34 int flex_shrink_sum) {
35 for (
Element& element : *elements) {
36 const int added_space = SafeRatio(
37 extra_space, element.min_size * element.flex_shrink, flex_shrink_sum);
38 extra_space -= added_space;
39 flex_shrink_sum -= element.flex_shrink * element.min_size;
40 element.size = element.min_size + added_space;
45void ComputeShrinkHard(std::vector<Element>* elements,
48 for (
Element& element : *elements) {
49 if (element.flex_shrink != 0) {
54 const int added_space = SafeRatio(extra_space, element.min_size, size);
56 extra_space -= added_space;
57 size -= element.min_size;
59 element.size = element.min_size + added_space;
65void Compute(std::vector<Element>* elements,
int target_size) {
67 int flex_grow_sum = 0;
68 int flex_shrink_sum = 0;
69 int flex_shrink_size = 0;
71 for (
auto& element : *elements) {
72 flex_grow_sum += element.flex_grow;
73 flex_shrink_sum += element.min_size * element.flex_shrink;
74 if (element.flex_shrink != 0) {
75 flex_shrink_size += element.min_size;
77 size += element.min_size;
80 const int extra_space = target_size -
size;
81 if (extra_space >= 0) {
82 ComputeGrow(elements, extra_space, flex_grow_sum);
83 }
else if (flex_shrink_size + extra_space >= 0) {
84 ComputeShrinkEasy(elements, extra_space, flex_shrink_sum);
87 ComputeShrinkHard(elements, extra_space + flex_shrink_size,
88 size - flex_shrink_size);