12void ComputeGrow(std::vector<Element>* elements,
15 for (
Element& element : *elements) {
17 extra_space * element.flex_grow / std::max(flex_grow_sum, 1);
18 extra_space -= added_space;
19 flex_grow_sum -= element.flex_grow;
20 element.size = element.min_size + added_space;
27void ComputeShrinkEasy(std::vector<Element>* elements,
29 int flex_shrink_sum) {
30 for (
Element& element : *elements) {
31 int added_space = extra_space * element.min_size * element.flex_shrink /
32 std::max(flex_shrink_sum, 1);
33 extra_space -= added_space;
34 flex_shrink_sum -= element.flex_shrink * element.min_size;
35 element.size = element.min_size + added_space;
43void ComputeShrinkHard(std::vector<Element>* elements,
46 for (
Element& element : *elements) {
47 if (element.flex_shrink) {
52 int added_space = extra_space * element.min_size / std::max(1,
size);
53 extra_space -= added_space;
54 size -= element.min_size;
56 element.size = element.min_size + added_space;
62void Compute(std::vector<Element>* elements,
int target_size) {
64 int flex_grow_sum = 0;
65 int flex_shrink_sum = 0;
66 int flex_shrink_size = 0;
68 for (
auto& element : *elements) {
69 flex_grow_sum += element.flex_grow;
70 flex_shrink_sum += element.min_size * element.flex_shrink;
71 if (element.flex_shrink)
72 flex_shrink_size += element.min_size;
73 size += element.min_size;
76 int extra_space = target_size -
size;
78 ComputeGrow(elements, extra_space, flex_grow_sum);
79 else if (flex_shrink_size + extra_space >= 0)
80 ComputeShrinkEasy(elements, extra_space, flex_shrink_sum);
82 ComputeShrinkHard(elements, extra_space + flex_shrink_size,
83 size - flex_shrink_size);