Skip to content

Commit a3d99f1

Browse files
NickGerlemanfacebook-github-bot
authored andcommitted
Make CompactValue internal detail of yoga::Style
Summary: In preparation to replace `CompactValue`, this fully encapsulates it as an implementation detail of `yoga::Style`. The internal API now always operates on `Style::Length`, converted to `YGValue` at the public API boundary. In the next step, we can plug in a new representation within `Style`, which should enable 64 bit values, and lower memory usage. Changelog: [Internal] Differential Revision: D51775346
1 parent 382faa3 commit a3d99f1

File tree

11 files changed

+477
-470
lines changed

11 files changed

+477
-470
lines changed

tests/CompactValueTest.cpp

Lines changed: 151 additions & 213 deletions
Large diffs are not rendered by default.

yoga/YGNodeStyle.cpp

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -195,11 +195,7 @@ void YGNodeStyleSetFlexBasisAuto(const YGNodeRef node) {
195195
}
196196

197197
YGValue YGNodeStyleGetFlexBasis(const YGNodeConstRef node) {
198-
YGValue flexBasis = resolveRef(node)->getStyle().flexBasis();
199-
if (flexBasis.unit == YGUnitUndefined || flexBasis.unit == YGUnitAuto) {
200-
flexBasis.value = YGUndefined;
201-
}
202-
return flexBasis;
198+
return (YGValue)resolveRef(node)->getStyle().flexBasis();
203199
}
204200

205201
void YGNodeStyleSetPosition(YGNodeRef node, YGEdge edge, float points) {
@@ -213,7 +209,7 @@ void YGNodeStyleSetPositionPercent(YGNodeRef node, YGEdge edge, float percent) {
213209
}
214210

215211
YGValue YGNodeStyleGetPosition(YGNodeConstRef node, YGEdge edge) {
216-
return resolveRef(node)->getStyle().position(scopedEnum(edge));
212+
return (YGValue)resolveRef(node)->getStyle().position(scopedEnum(edge));
217213
}
218214

219215
void YGNodeStyleSetMargin(YGNodeRef node, YGEdge edge, float points) {
@@ -232,7 +228,7 @@ void YGNodeStyleSetMarginAuto(YGNodeRef node, YGEdge edge) {
232228
}
233229

234230
YGValue YGNodeStyleGetMargin(YGNodeConstRef node, YGEdge edge) {
235-
return resolveRef(node)->getStyle().margin(scopedEnum(edge));
231+
return (YGValue)resolveRef(node)->getStyle().margin(scopedEnum(edge));
236232
}
237233

238234
void YGNodeStyleSetPadding(YGNodeRef node, YGEdge edge, float points) {
@@ -246,7 +242,7 @@ void YGNodeStyleSetPaddingPercent(YGNodeRef node, YGEdge edge, float percent) {
246242
}
247243

248244
YGValue YGNodeStyleGetPadding(YGNodeConstRef node, YGEdge edge) {
249-
return resolveRef(node)->getStyle().padding(scopedEnum(edge));
245+
return (YGValue)resolveRef(node)->getStyle().padding(scopedEnum(edge));
250246
}
251247

252248
void YGNodeStyleSetBorder(
@@ -309,7 +305,7 @@ void YGNodeStyleSetWidthAuto(YGNodeRef node) {
309305
}
310306

311307
YGValue YGNodeStyleGetWidth(YGNodeConstRef node) {
312-
return resolveRef(node)->getStyle().dimension(Dimension::Width);
308+
return (YGValue)resolveRef(node)->getStyle().dimension(Dimension::Width);
313309
}
314310

315311
void YGNodeStyleSetHeight(YGNodeRef node, float points) {
@@ -328,7 +324,7 @@ void YGNodeStyleSetHeightAuto(YGNodeRef node) {
328324
}
329325

330326
YGValue YGNodeStyleGetHeight(YGNodeConstRef node) {
331-
return resolveRef(node)->getStyle().dimension(Dimension::Height);
327+
return (YGValue)resolveRef(node)->getStyle().dimension(Dimension::Height);
332328
}
333329

334330
void YGNodeStyleSetMinWidth(const YGNodeRef node, const float minWidth) {
@@ -342,7 +338,7 @@ void YGNodeStyleSetMinWidthPercent(const YGNodeRef node, const float minWidth) {
342338
}
343339

344340
YGValue YGNodeStyleGetMinWidth(const YGNodeConstRef node) {
345-
return resolveRef(node)->getStyle().minDimension(Dimension::Width);
341+
return (YGValue)resolveRef(node)->getStyle().minDimension(Dimension::Width);
346342
}
347343

348344
void YGNodeStyleSetMinHeight(const YGNodeRef node, const float minHeight) {
@@ -358,7 +354,7 @@ void YGNodeStyleSetMinHeightPercent(
358354
}
359355

360356
YGValue YGNodeStyleGetMinHeight(const YGNodeConstRef node) {
361-
return resolveRef(node)->getStyle().minDimension(Dimension::Height);
357+
return (YGValue)resolveRef(node)->getStyle().minDimension(Dimension::Height);
362358
}
363359

364360
void YGNodeStyleSetMaxWidth(const YGNodeRef node, const float maxWidth) {
@@ -372,7 +368,7 @@ void YGNodeStyleSetMaxWidthPercent(const YGNodeRef node, const float maxWidth) {
372368
}
373369

374370
YGValue YGNodeStyleGetMaxWidth(const YGNodeConstRef node) {
375-
return resolveRef(node)->getStyle().maxDimension(Dimension::Width);
371+
return (YGValue)resolveRef(node)->getStyle().maxDimension(Dimension::Width);
376372
}
377373

378374
void YGNodeStyleSetMaxHeight(const YGNodeRef node, const float maxHeight) {
@@ -388,5 +384,5 @@ void YGNodeStyleSetMaxHeightPercent(
388384
}
389385

390386
YGValue YGNodeStyleGetMaxHeight(const YGNodeConstRef node) {
391-
return resolveRef(node)->getStyle().maxDimension(Dimension::Height);
387+
return (YGValue)resolveRef(node)->getStyle().maxDimension(Dimension::Height);
392388
}

yoga/algorithm/CalculateLayout.cpp

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,17 @@ static inline bool styleDefinesDimension(
6363
const FlexDirection axis,
6464
const float ownerSize) {
6565
bool isDefined =
66-
yoga::isDefined(node->getResolvedDimension(dimension(axis)).value);
66+
node->getResolvedDimension(dimension(axis)).value().isDefined();
6767

6868
auto resolvedDimension = node->getResolvedDimension(dimension(axis));
6969
return !(
70-
resolvedDimension.unit == YGUnitAuto ||
71-
resolvedDimension.unit == YGUnitUndefined ||
72-
(resolvedDimension.unit == YGUnitPoint && isDefined &&
73-
resolvedDimension.value < 0.0f) ||
74-
(resolvedDimension.unit == YGUnitPercent && isDefined &&
75-
(resolvedDimension.value < 0.0f || yoga::isUndefined(ownerSize))));
70+
resolvedDimension.unit() == Unit::Auto ||
71+
resolvedDimension.unit() == Unit::Undefined ||
72+
(resolvedDimension.unit() == Unit::Point && isDefined &&
73+
resolvedDimension.value().unwrap() < 0.0f) ||
74+
(resolvedDimension.unit() == Unit::Percent && isDefined &&
75+
(resolvedDimension.value().unwrap() < 0.0f ||
76+
yoga::isUndefined(ownerSize))));
7677
}
7778

7879
static inline bool isLayoutDimensionDefined(
@@ -947,9 +948,9 @@ static float distributeFreeSpaceSecondPass(
947948
sizingModeCrossDim == SizingMode::StretchFit &&
948949
!(isNodeFlexWrap && mainAxisOverflows) &&
949950
resolveChildAlignment(node, currentLineChild) == Align::Stretch &&
950-
currentLineChild->getFlexStartMarginValue(crossAxis).unit !=
951-
YGUnitAuto &&
952-
currentLineChild->marginTrailingValue(crossAxis).unit != YGUnitAuto) {
951+
currentLineChild->getFlexStartMarginValue(crossAxis).unit() !=
952+
Unit::Auto &&
953+
currentLineChild->marginTrailingValue(crossAxis).unit() != Unit::Auto) {
953954
childCrossSize = availableInnerCrossDim;
954955
childCrossSizingMode = SizingMode::StretchFit;
955956
} else if (!styleDefinesDimension(
@@ -966,8 +967,8 @@ static float distributeFreeSpaceSecondPass(
966967
.unwrap() +
967968
marginCross;
968969
const bool isLoosePercentageMeasurement =
969-
currentLineChild->getResolvedDimension(dimension(crossAxis)).unit ==
970-
YGUnitPercent &&
970+
currentLineChild->getResolvedDimension(dimension(crossAxis)).unit() ==
971+
Unit::Percent &&
971972
sizingModeCrossDim != SizingMode::StretchFit;
972973
childCrossSizingMode =
973974
yoga::isUndefined(childCrossSize) || isLoosePercentageMeasurement
@@ -994,9 +995,9 @@ static float distributeFreeSpaceSecondPass(
994995
!styleDefinesDimension(
995996
currentLineChild, crossAxis, availableInnerCrossDim) &&
996997
resolveChildAlignment(node, currentLineChild) == Align::Stretch &&
997-
currentLineChild->getFlexStartMarginValue(crossAxis).unit !=
998-
YGUnitAuto &&
999-
currentLineChild->marginTrailingValue(crossAxis).unit != YGUnitAuto;
998+
currentLineChild->getFlexStartMarginValue(crossAxis).unit() !=
999+
Unit::Auto &&
1000+
currentLineChild->marginTrailingValue(crossAxis).unit() != Unit::Auto;
10001001

10011002
const float childWidth = isMainAxisRow ? childMainSize : childCrossSize;
10021003
const float childHeight = !isMainAxisRow ? childMainSize : childCrossSize;
@@ -1243,10 +1244,10 @@ static void justifyMainAxis(
12431244
for (size_t i = startOfLineIndex; i < flexLine.endOfLineIndex; i++) {
12441245
auto child = node->getChild(i);
12451246
if (child->getStyle().positionType() != PositionType::Absolute) {
1246-
if (child->getFlexStartMarginValue(mainAxis).unit == YGUnitAuto) {
1247+
if (child->getFlexStartMarginValue(mainAxis).unit() == Unit::Auto) {
12471248
numberOfAutoMarginsOnCurrentLine++;
12481249
}
1249-
if (child->marginTrailingValue(mainAxis).unit == YGUnitAuto) {
1250+
if (child->marginTrailingValue(mainAxis).unit() == Unit::Auto) {
12501251
numberOfAutoMarginsOnCurrentLine++;
12511252
}
12521253
}
@@ -1323,7 +1324,7 @@ static void justifyMainAxis(
13231324
// We need to do that only for relative elements. Absolute elements do not
13241325
// take part in that phase.
13251326
if (childStyle.positionType() != PositionType::Absolute) {
1326-
if (child->getFlexStartMarginValue(mainAxis).unit == YGUnitAuto) {
1327+
if (child->getFlexStartMarginValue(mainAxis).unit() == Unit::Auto) {
13271328
flexLine.layout.mainDim += flexLine.layout.remainingFreeSpace /
13281329
static_cast<float>(numberOfAutoMarginsOnCurrentLine);
13291330
}
@@ -1339,7 +1340,7 @@ static void justifyMainAxis(
13391340
flexLine.layout.mainDim += betweenMainDim;
13401341
}
13411342

1342-
if (child->marginTrailingValue(mainAxis).unit == YGUnitAuto) {
1343+
if (child->marginTrailingValue(mainAxis).unit() == Unit::Auto) {
13431344
flexLine.layout.mainDim += flexLine.layout.remainingFreeSpace /
13441345
static_cast<float>(numberOfAutoMarginsOnCurrentLine);
13451346
}
@@ -1886,8 +1887,8 @@ static void calculateLayoutImpl(
18861887
// time, this time forcing the cross-axis size to be the computed
18871888
// cross size for the current line.
18881889
if (alignItem == Align::Stretch &&
1889-
child->getFlexStartMarginValue(crossAxis).unit != YGUnitAuto &&
1890-
child->marginTrailingValue(crossAxis).unit != YGUnitAuto) {
1890+
child->getFlexStartMarginValue(crossAxis).unit() != Unit::Auto &&
1891+
child->marginTrailingValue(crossAxis).unit() != Unit::Auto) {
18911892
// If the child defines a definite size for its cross axis, there's
18921893
// no need to stretch.
18931894
if (!styleDefinesDimension(
@@ -1960,15 +1961,17 @@ static void calculateLayoutImpl(
19601961
const float remainingCrossDim = containerCrossAxis -
19611962
dimensionWithMargin(child, crossAxis, availableInnerWidth);
19621963

1963-
if (child->getFlexStartMarginValue(crossAxis).unit == YGUnitAuto &&
1964-
child->marginTrailingValue(crossAxis).unit == YGUnitAuto) {
1964+
if (child->getFlexStartMarginValue(crossAxis).unit() ==
1965+
Unit::Auto &&
1966+
child->marginTrailingValue(crossAxis).unit() == Unit::Auto) {
19651967
leadingCrossDim +=
19661968
yoga::maxOrDefined(0.0f, remainingCrossDim / 2);
19671969
} else if (
1968-
child->marginTrailingValue(crossAxis).unit == YGUnitAuto) {
1970+
child->marginTrailingValue(crossAxis).unit() == Unit::Auto) {
19691971
// No-Op
19701972
} else if (
1971-
child->getFlexStartMarginValue(crossAxis).unit == YGUnitAuto) {
1973+
child->getFlexStartMarginValue(crossAxis).unit() ==
1974+
Unit::Auto) {
19721975
leadingCrossDim += yoga::maxOrDefined(0.0f, remainingCrossDim);
19731976
} else if (alignItem == Align::FlexStart) {
19741977
// No-Op

yoga/debug/NodeToString.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,34 +46,38 @@ static void appendFloatOptionalIfDefined(
4646
static void appendNumberIfNotUndefined(
4747
std::string& base,
4848
const std::string key,
49-
const YGValue number) {
50-
if (number.unit != YGUnitUndefined) {
51-
if (number.unit == YGUnitAuto) {
49+
const Style::Length& number) {
50+
if (number.unit() != Unit::Undefined) {
51+
if (number.unit() == Unit::Auto) {
5252
base.append(key + ": auto; ");
5353
} else {
54-
std::string unit = number.unit == YGUnitPoint ? "px" : "%%";
54+
std::string unit = number.unit() == Unit::Point ? "px" : "%%";
5555
appendFormattedString(
56-
base, "%s: %g%s; ", key.c_str(), number.value, unit.c_str());
56+
base,
57+
"%s: %g%s; ",
58+
key.c_str(),
59+
number.value().unwrap(),
60+
unit.c_str());
5761
}
5862
}
5963
}
6064

6165
static void appendNumberIfNotAuto(
6266
std::string& base,
6367
const std::string& key,
64-
const YGValue number) {
65-
if (number.unit != YGUnitAuto) {
68+
const Style::Length& number) {
69+
if (number.unit() != Unit::Auto) {
6670
appendNumberIfNotUndefined(base, key, number);
6771
}
6872
}
6973

7074
static void appendNumberIfNotZero(
7175
std::string& base,
7276
const std::string& str,
73-
const YGValue number) {
74-
if (number.unit == YGUnitAuto) {
77+
const Style::Length& number) {
78+
if (number.unit() == Unit::Auto) {
7579
base.append(str + ": auto; ");
76-
} else if (!yoga::inexactEquals(number.value, 0)) {
80+
} else if (!yoga::inexactEquals(number.value().unwrap(), 0)) {
7781
appendNumberIfNotUndefined(base, str, number);
7882
}
7983
}

0 commit comments

Comments
 (0)