Skip to content

Commit 53e0927

Browse files
separate grid track layout state from style definition
1 parent 083f895 commit 53e0927

6 files changed

Lines changed: 67 additions & 46 deletions

File tree

yoga/YGNodeStyle.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,8 @@ GridTrackSize gridTrackSizeFromTypeAndValue(YGGridTrackType type, float value) {
622622
case YGGridTrackTypeMinmax:
623623
return GridTrackSize::auto_();
624624
}
625+
// Unreachable, but needed to silence GCC -Wreturn-type
626+
return GridTrackSize::auto_();
625627
}
626628

627629
StyleSizeLength styleSizeLengthFromTypeAndValue(
@@ -639,6 +641,8 @@ StyleSizeLength styleSizeLengthFromTypeAndValue(
639641
case YGGridTrackTypeMinmax:
640642
return StyleSizeLength::ofAuto();
641643
}
644+
// Unreachable, but needed to silence GCC -Wreturn-type
645+
return StyleSizeLength::ofAuto();
642646
}
643647

644648
} // namespace

yoga/algorithm/grid/GridLayout.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -442,8 +442,8 @@ GridTracks createGridTracks(
442442
auto gridExplicitColumns = node->style().gridTemplateColumns();
443443
auto gridExplicitRows = node->style().gridTemplateRows();
444444

445-
std::vector<GridTrackSize> columnTracks;
446-
std::vector<GridTrackSize> rowTracks;
445+
std::vector<GridTrack> columnTracks;
446+
std::vector<GridTrack> rowTracks;
447447
columnTracks.reserve(
448448
static_cast<size_t>(
449449
autoPlacement.maxColumnEnd - autoPlacement.minColumnStart));
@@ -472,11 +472,11 @@ GridTracks createGridTracks(
472472
autoColumnTracksSize;
473473
auto autoColumnTrack =
474474
autoColumnTracks[autoColumnTracksSize - currentColumnTrackIndex - 1];
475-
columnTracks.push_back(autoColumnTrack);
475+
columnTracks.push_back(GridTrack(autoColumnTrack));
476476
}
477477

478478
for (size_t i = 0; i < gridExplicitColumns.size(); i++) {
479-
columnTracks.push_back(gridExplicitColumns[i]);
479+
columnTracks.push_back(GridTrack(gridExplicitColumns[i]));
480480
}
481481

482482
// The first track after the last explicitly-sized track receives the first
@@ -485,7 +485,7 @@ GridTracks createGridTracks(
485485
gridExplicitColumns.size();
486486
i++) {
487487
auto autoColumnTrack = autoColumnTracks[i % autoColumnTracksSize];
488-
columnTracks.push_back(autoColumnTrack);
488+
columnTracks.push_back(GridTrack(autoColumnTrack));
489489
}
490490

491491
auto negativeImplicitGridRowTrackCount = -autoPlacement.minRowStart;
@@ -496,16 +496,16 @@ GridTracks createGridTracks(
496496
autoRowTracksSize;
497497
auto autoRowTrack =
498498
autoRowTracks[autoRowTracksSize - currentRowTrackIndex - 1];
499-
rowTracks.push_back(autoRowTrack);
499+
rowTracks.push_back(GridTrack(autoRowTrack));
500500
}
501501
for (const auto& explicitRow : gridExplicitRows) {
502-
rowTracks.push_back(explicitRow);
502+
rowTracks.push_back(GridTrack(explicitRow));
503503
}
504504
for (size_t i = 0; i <
505505
static_cast<size_t>(autoPlacement.maxRowEnd) - gridExplicitRows.size();
506506
i++) {
507507
auto autoRowTrack = autoRowTracks[i % autoRowTracksSize];
508-
rowTracks.push_back(autoRowTrack);
508+
rowTracks.push_back(GridTrack(autoRowTrack));
509509
}
510510

511511
return {std::move(columnTracks), std::move(rowTracks)};

yoga/algorithm/grid/GridLayout.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <yoga/Yoga.h>
1111
#include <yoga/algorithm/grid/AutoPlacement.h>
12+
#include <yoga/algorithm/grid/GridTrack.h>
1213
#include <yoga/event/event.h>
1314
#include <yoga/node/Node.h>
1415
#include <vector>
@@ -31,8 +32,8 @@ void calculateGridLayoutInternal(
3132
uint32_t generationCount);
3233

3334
struct GridTracks {
34-
std::vector<GridTrackSize> columnTracks;
35-
std::vector<GridTrackSize> rowTracks;
35+
std::vector<GridTrack> columnTracks;
36+
std::vector<GridTrack> rowTracks;
3637
};
3738
// Creates implicit grid tracks based on the auto placement result
3839
GridTracks createGridTracks(

yoga/algorithm/grid/GridTrack.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#pragma once
9+
10+
#include <yoga/style/GridTrack.h>
11+
12+
namespace facebook::yoga {
13+
14+
struct GridTrack : GridTrackSize {
15+
float baseSize = 0.0f;
16+
float growthLimit = 0.0f;
17+
bool infinitelyGrowable = false;
18+
19+
explicit GridTrack(const GridTrackSize& trackSize)
20+
: GridTrackSize(trackSize) {}
21+
};
22+
23+
} // namespace facebook::yoga

yoga/algorithm/grid/TrackSizing.h

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,22 @@ struct TrackSizing {
4242

4343
struct ItemSizeContribution {
4444
const GridItem* item;
45-
std::vector<GridTrackSize*> affectedTracks;
45+
std::vector<GridTrack*> affectedTracks;
4646
float sizeContribution;
4747

4848
ItemSizeContribution(
4949
const GridItem* item,
50-
const std::vector<GridTrackSize*>& affectedTracks,
50+
const std::vector<GridTrack*>& affectedTracks,
5151
float sizeContribution)
5252
: item(item),
5353
affectedTracks(affectedTracks),
5454
sizeContribution(sizeContribution) {}
5555
};
5656

5757
Node* node;
58-
std::vector<GridTrackSize>&
58+
std::vector<GridTrack>&
5959
columnTracks; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
60-
std::vector<GridTrackSize>&
60+
std::vector<GridTrack>&
6161
rowTracks; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
6262
float containerInnerWidth;
6363
float containerInnerHeight;
@@ -87,8 +87,8 @@ struct TrackSizing {
8787

8888
TrackSizing(
8989
yoga::Node* node,
90-
std::vector<GridTrackSize>& columnTracks,
91-
std::vector<GridTrackSize>& rowTracks,
90+
std::vector<GridTrack>& columnTracks,
91+
std::vector<GridTrack>& rowTracks,
9292
float containerInnerWidth,
9393
float containerInnerHeight,
9494
std::vector<GridItem>& gridItems,
@@ -470,9 +470,9 @@ struct TrackSizing {
470470
previousSpan = span;
471471
}
472472

473-
std::vector<GridTrackSize*> intrinsicMinimumSizingFunctionTracks;
474-
std::vector<GridTrackSize*> intrinsicMaximumSizingFunctionTracks;
475-
std::vector<GridTrackSize*> maxContentMaximumSizingFunctionTracks;
473+
std::vector<GridTrack*> intrinsicMinimumSizingFunctionTracks;
474+
std::vector<GridTrack*> intrinsicMaximumSizingFunctionTracks;
475+
std::vector<GridTrack*> maxContentMaximumSizingFunctionTracks;
476476

477477
for (size_t i = startIndex; i < endIndex; i++) {
478478
if (isIntrinsicSizingFunction(
@@ -547,7 +547,7 @@ struct TrackSizing {
547547

548548
auto start = item.*startIndexkey;
549549
auto end = item.*endIndexKey;
550-
std::vector<GridTrackSize*> flexibleTracks;
550+
std::vector<GridTrack*> flexibleTracks;
551551

552552
for (size_t i = start; i < end && i < tracks.size(); i++) {
553553
auto& track = tracks[i];
@@ -585,7 +585,7 @@ struct TrackSizing {
585585
auto containerSize = dimension == Dimension::Width ? containerInnerWidth
586586
: containerInnerHeight;
587587
auto gap = node->style().computeGapForDimension(dimension, containerSize);
588-
std::unordered_map<GridTrackSize*, float> plannedIncrease;
588+
std::unordered_map<GridTrack*, float> plannedIncrease;
589589
plannedIncrease.reserve(gridItemSizeContributions.size());
590590

591591
// 1. Maintain separately for each affected track a planned increase,
@@ -599,7 +599,7 @@ struct TrackSizing {
599599

600600
// 2. For each accommodated item, considering only tracks the item spans:
601601
for (const auto& itemSizeContribution : gridItemSizeContributions) {
602-
std::unordered_map<GridTrackSize*, float> itemIncurredIncrease;
602+
std::unordered_map<GridTrack*, float> itemIncurredIncrease;
603603
itemIncurredIncrease.reserve(itemSizeContribution.affectedTracks.size());
604604
for (auto& track : itemSizeContribution.affectedTracks) {
605605
itemIncurredIncrease[track] = 0.0f;
@@ -627,7 +627,7 @@ struct TrackSizing {
627627

628628
float spaceToDistribute = std::max(
629629
0.0f, itemSizeContribution.sizeContribution - totalSpannedTracksSize);
630-
std::unordered_set<GridTrackSize*> frozenTracks;
630+
std::unordered_set<GridTrack*> frozenTracks;
631631
frozenTracks.reserve(itemSizeContribution.affectedTracks.size());
632632

633633
// 2.2. Distribute space up to limits
@@ -687,7 +687,7 @@ struct TrackSizing {
687687
// 2.4. Distribute space beyond limits
688688
if (spaceToDistribute > 0.0f &&
689689
!yoga::inexactEquals(spaceToDistribute, 0.0f)) {
690-
std::vector<GridTrackSize*> tracksToGrowBeyondLimits;
690+
std::vector<GridTrack*> tracksToGrowBeyondLimits;
691691
for (auto& track : itemSizeContribution.affectedTracks) {
692692
if (isIntrinsicSizingFunction(
693693
track->maxSizingFunction, containerSize)) {
@@ -755,7 +755,7 @@ struct TrackSizing {
755755
: &GridItem::rowEnd;
756756

757757
// Step 1: Maintain planned increase for each affected track
758-
std::unordered_map<GridTrackSize*, float> plannedIncrease;
758+
std::unordered_map<GridTrack*, float> plannedIncrease;
759759
for (const auto& itemSizeContribution : gridItemSizeContributions) {
760760
for (auto& track : itemSizeContribution.affectedTracks) {
761761
plannedIncrease[track] = 0.0f;
@@ -764,7 +764,7 @@ struct TrackSizing {
764764

765765
// Step 2: For each item
766766
for (const auto& itemSizeContribution : gridItemSizeContributions) {
767-
std::unordered_map<GridTrackSize*, float> itemIncurredIncrease;
767+
std::unordered_map<GridTrack*, float> itemIncurredIncrease;
768768
for (auto& track : itemSizeContribution.affectedTracks) {
769769
itemIncurredIncrease[track] = 0.0f;
770770
}
@@ -910,7 +910,7 @@ struct TrackSizing {
910910
track.baseSize = track.growthLimit;
911911
}
912912
} else {
913-
std::unordered_set<GridTrackSize*> frozenTracks;
913+
std::unordered_set<GridTrack*> frozenTracks;
914914
frozenTracks.reserve(tracks.size());
915915
auto extraSpace = freeSpace;
916916

@@ -921,7 +921,7 @@ struct TrackSizing {
921921
extraSpace / static_cast<float>(unfrozenTrackCount);
922922

923923
for (auto& track : tracks) {
924-
GridTrackSize* trackPtr = &track;
924+
GridTrack* trackPtr = &track;
925925
if (frozenTracks.contains(trackPtr)) {
926926
continue;
927927
}
@@ -972,7 +972,7 @@ struct TrackSizing {
972972
0,
973973
gridTracks.size(),
974974
containerSize,
975-
std::unordered_set<GridTrackSize*>());
975+
std::unordered_set<GridTrack*>());
976976
}
977977
// Otherwise, if the free space is an indefinite length:
978978
// The used flex fraction is the maximum of:
@@ -1015,7 +1015,7 @@ struct TrackSizing {
10151015
item.*startIndexKey,
10161016
item.*endIndexKey,
10171017
itemMaxContentContribution,
1018-
std::unordered_set<GridTrackSize*>()));
1018+
std::unordered_set<GridTrack*>()));
10191019
}
10201020
}
10211021

@@ -1064,7 +1064,7 @@ struct TrackSizing {
10641064
0,
10651065
gridTracks.size(),
10661066
minContainerSize,
1067-
std::unordered_set<GridTrackSize*>());
1067+
std::unordered_set<GridTrack*>());
10681068
}
10691069
}
10701070

@@ -1087,7 +1087,7 @@ struct TrackSizing {
10871087
0,
10881088
gridTracks.size(),
10891089
maxContainerSize,
1090-
std::unordered_set<GridTrackSize*>());
1090+
std::unordered_set<GridTrack*>());
10911091
}
10921092
}
10931093

@@ -1113,13 +1113,13 @@ struct TrackSizing {
11131113
size_t startIndex,
11141114
size_t endIndex,
11151115
float spaceToFill,
1116-
const std::unordered_set<GridTrackSize*>& nonFlexibleTracks) {
1116+
const std::unordered_set<GridTrack*>& nonFlexibleTracks) {
11171117
auto containerSize = dimension == Dimension::Width ? containerInnerWidth
11181118
: containerInnerHeight;
11191119
auto gap = node->style().computeGapForDimension(dimension, containerSize);
11201120
auto leftoverSpace = spaceToFill;
11211121
auto flexFactorSum = 0.0f;
1122-
std::vector<GridTrackSize*> flexibleTracks;
1122+
std::vector<GridTrack*> flexibleTracks;
11231123
auto& tracks = dimension == Dimension::Width ? columnTracks : rowTracks;
11241124

11251125
for (size_t i = startIndex; i < endIndex; i++) {
@@ -1156,7 +1156,7 @@ struct TrackSizing {
11561156
// If the product of the hypothetical fr size and a flexible track's flex
11571157
// factor is less than the track's base size, restart this algorithm
11581158
// treating all such tracks as inflexible.
1159-
std::unordered_set<GridTrackSize*> inflexibleTracks;
1159+
std::unordered_set<GridTrack*> inflexibleTracks;
11601160
for (auto& track : flexibleTracks) {
11611161
if (track->maxSizingFunction.isStretch() &&
11621162
track->maxSizingFunction.value().isDefined()) {
@@ -1205,7 +1205,7 @@ struct TrackSizing {
12051205

12061206
if (shouldStretch) {
12071207
// Count only auto tracks for distribution
1208-
std::vector<GridTrackSize*> autoTracks;
1208+
std::vector<GridTrack*> autoTracks;
12091209
for (auto& track : gridTracks) {
12101210
if (isAutoSizingFunction(track.maxSizingFunction, containerSize)) {
12111211
autoTracks.push_back(&track);
@@ -1388,7 +1388,7 @@ struct TrackSizing {
13881388
const GridItem& item,
13891389
Dimension dimension,
13901390
const ItemConstraint& itemConstraints,
1391-
const std::vector<GridTrackSize>& tracks,
1391+
const std::vector<GridTrack>& tracks,
13921392
float containerSize) {
13931393
auto overflow = item.node->style().overflow();
13941394
size_t startIndex =
@@ -1434,7 +1434,7 @@ struct TrackSizing {
14341434
const GridItem& item,
14351435
Dimension dimension,
14361436
const ItemConstraint& itemConstraints,
1437-
const std::vector<GridTrackSize>& tracks,
1437+
const std::vector<GridTrack>& tracks,
14381438
float containerSize) {
14391439
float result = measureItem(item, dimension, itemConstraints);
14401440
// Clamp by fixed track limit if all spanned tracks have fixed max sizing
@@ -1484,7 +1484,7 @@ struct TrackSizing {
14841484
float computeFixedTracksLimit(
14851485
const GridItem& item,
14861486
Dimension dimension,
1487-
const std::vector<GridTrackSize>& tracks,
1487+
const std::vector<GridTrack>& tracks,
14881488
float containerSize) {
14891489
size_t startIndex =
14901490
dimension == Dimension::Width ? item.columnStart : item.rowStart;

yoga/style/GridTrack.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,6 @@ struct GridTrackSize {
1616
StyleSizeLength minSizingFunction;
1717
StyleSizeLength maxSizingFunction;
1818

19-
// These are used in the grid layout algorithm when distributing spaces among
20-
// tracks
21-
// TODO: maybe move them to TrackSizing since these are track states
22-
float baseSize = 0.0f;
23-
float growthLimit = 0.0f;
24-
bool infinitelyGrowable = false;
25-
2619
// Static factory methods for common cases
2720
constexpr static GridTrackSize auto_() {
2821
return GridTrackSize{

0 commit comments

Comments
 (0)