Skip to content

Commit ea85b31

Browse files
NickGerlemanfacebook-github-bot
authored andcommitted
Remove usage of Dimension arrays and YGDimension as index (#39567)
Summary: X-link: facebook/yoga#1402 Pull Request resolved: #39567 This change hides away most usages of YGDimension as an index. We do this for a couple reasons: 1. Right now the style interface may return a full array of resolved edge or dimension values, as a CompactValue. As we abstract away from CompactValue, and move towards ValuePool, this will no longer be the internal interface, and cheap to return. We instead change the interface to return a single value at once, which lets us resolve values lazily. 2. As we move internal usage to scoped enums, enums are not implicitly convertible to intergers (broadly a good thing). Hiding the enum as index prevents the need for callers to cast or convert to underlying. Instead of making a new version of `IdxRef` for this, I converted to a more traditional setter. I will be making similar changes later for other styles, when I hide CompactValue from the public interface. To review I would recommend filtering to changes in `xplat`, or viewing this in a single one of the OSS PRs exported. Everything apart from the below 20 files is a mirror. {F1096792573} Changelog: [Internal] Reviewed By: javache Differential Revision: D49362819 fbshipit-source-id: 30d730d78e62f36597d43f477120f65694e51ea3
1 parent 97b6829 commit ea85b31

File tree

19 files changed

+365
-352
lines changed

19 files changed

+365
-352
lines changed

packages/react-native/React/Tests/Text/RCTParagraphComponentViewTests.mm

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ - (void)setUp
121121
auto &props = *sharedProps;
122122
props.layoutConstraints = LayoutConstraints{{0, 0}, {500, 500}};
123123
auto &yogaStyle = props.yogaStyle;
124-
yogaStyle.dimensions()[YGDimensionWidth] = YGValue{200, YGUnitPoint};
125-
yogaStyle.dimensions()[YGDimensionHeight] = YGValue{200, YGUnitPoint};
124+
yogaStyle.setDimension(YGDimensionWidth, yoga::CompactValue::of<YGUnitPoint>(200));
125+
yogaStyle.setDimension(YGDimensionHeight, yoga::CompactValue::of<YGUnitPoint>(200));
126126
return sharedProps;
127127
})
128128
.children({
@@ -136,8 +136,8 @@ - (void)setUp
136136
yogaStyle.positionType() = yoga::PositionType::Absolute;
137137
yogaStyle.position()[YGEdgeLeft] = YGValue{0, YGUnitPoint};
138138
yogaStyle.position()[YGEdgeTop] = YGValue{0, YGUnitPoint};
139-
yogaStyle.dimensions()[YGDimensionWidth] = YGValue{200, YGUnitPoint};
140-
yogaStyle.dimensions()[YGDimensionHeight] = YGValue{20, YGUnitPoint};
139+
yogaStyle.setDimension(YGDimensionWidth, yoga::CompactValue::of<YGUnitPoint>(200));
140+
yogaStyle.setDimension(YGDimensionHeight, yoga::CompactValue::of<YGUnitPoint>(200));
141141
return sharedProps;
142142
})
143143
.children({
@@ -216,8 +216,8 @@ - (void)setUp
216216
yogaStyle.positionType() = yoga::PositionType::Absolute;
217217
yogaStyle.position()[YGEdgeLeft] = YGValue{0, YGUnitPoint};
218218
yogaStyle.position()[YGEdgeTop] = YGValue{30, YGUnitPoint};
219-
yogaStyle.dimensions()[YGDimensionWidth] = YGValue{200, YGUnitPoint};
220-
yogaStyle.dimensions()[YGDimensionHeight] = YGValue{50, YGUnitPoint};
219+
yogaStyle.setDimension(YGDimensionWidth, yoga::CompactValue::of<YGUnitPoint>(200));
220+
yogaStyle.setDimension(YGDimensionHeight, yoga::CompactValue::of<YGUnitPoint>(50));
221221
return sharedProps;
222222
})
223223
.children({
@@ -260,8 +260,8 @@ - (void)setUp
260260
yogaStyle.positionType() = yoga::PositionType::Absolute;
261261
yogaStyle.position()[YGEdgeLeft] = YGValue{0, YGUnitPoint};
262262
yogaStyle.position()[YGEdgeTop] = YGValue{90, YGUnitPoint};
263-
yogaStyle.dimensions()[YGDimensionWidth] = YGValue{200, YGUnitPoint};
264-
yogaStyle.dimensions()[YGDimensionHeight] = YGValue{50, YGUnitPoint};
263+
yogaStyle.setDimension(YGDimensionWidth, yoga::CompactValue::of<YGUnitPoint>(200));
264+
yogaStyle.setDimension(YGDimensionHeight, yoga::CompactValue::of<YGUnitPoint>(50));
265265
return sharedProps;
266266
})
267267
.children({
@@ -418,8 +418,8 @@ - (void)testEntireParagraphLink
418418
auto &props = *sharedProps;
419419
props.layoutConstraints = LayoutConstraints{{0, 0}, {500, 500}};
420420
auto &yogaStyle = props.yogaStyle;
421-
yogaStyle.dimensions()[YGDimensionWidth] = YGValue{200, YGUnitPoint};
422-
yogaStyle.dimensions()[YGDimensionHeight] = YGValue{200, YGUnitPoint};
421+
yogaStyle.setDimension(YGDimensionWidth, yoga::CompactValue::of<YGUnitPoint>(200));
422+
yogaStyle.setDimension(YGDimensionHeight, yoga::CompactValue::of<YGUnitPoint>(200));
423423
return sharedProps;
424424
})
425425
.children({
@@ -434,8 +434,8 @@ - (void)testEntireParagraphLink
434434
yogaStyle.positionType() = yoga::PositionType::Absolute;
435435
yogaStyle.position()[YGEdgeLeft] = YGValue{0, YGUnitPoint};
436436
yogaStyle.position()[YGEdgeTop] = YGValue{0, YGUnitPoint};
437-
yogaStyle.dimensions()[YGDimensionWidth] = YGValue{200, YGUnitPoint};
438-
yogaStyle.dimensions()[YGDimensionHeight] = YGValue{20, YGUnitPoint};
437+
yogaStyle.setDimension(YGDimensionWidth, yoga::CompactValue::of<YGUnitPoint>(200));
438+
yogaStyle.setDimension(YGDimensionHeight, yoga::CompactValue::of<YGUnitPoint>(20));
439439
return sharedProps;
440440
})
441441
.children({

packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -532,8 +532,10 @@ void YogaLayoutableShadowNode::setSize(Size size) const {
532532
ensureUnsealed();
533533

534534
auto style = yogaNode_.getStyle();
535-
style.dimensions()[YGDimensionWidth] = yogaStyleValueFromFloat(size.width);
536-
style.dimensions()[YGDimensionHeight] = yogaStyleValueFromFloat(size.height);
535+
style.setDimension(
536+
YGDimensionWidth, yoga::CompactValue::ofMaybe<YGUnitPoint>(size.width));
537+
style.setDimension(
538+
YGDimensionHeight, yoga::CompactValue::ofMaybe<YGUnitPoint>(size.height));
537539
yogaNode_.setStyle(style);
538540
yogaNode_.setDirty(true);
539541
}
@@ -543,19 +545,23 @@ void YogaLayoutableShadowNode::setPadding(RectangleEdges<Float> padding) const {
543545

544546
auto style = yogaNode_.getStyle();
545547

546-
auto leftPadding = yogaStyleValueFromFloat(padding.left);
547-
auto topPadding = yogaStyleValueFromFloat(padding.top);
548-
auto rightPadding = yogaStyleValueFromFloat(padding.right);
549-
auto bottomPadding = yogaStyleValueFromFloat(padding.bottom);
548+
auto leftPadding = yoga::CompactValue::ofMaybe<YGUnitPoint>(padding.left);
549+
auto topPadding = yoga::CompactValue::ofMaybe<YGUnitPoint>(padding.top);
550+
auto rightPadding = yoga::CompactValue::ofMaybe<YGUnitPoint>(padding.right);
551+
auto bottomPadding = yoga::CompactValue::ofMaybe<YGUnitPoint>(padding.bottom);
550552

551553
if (leftPadding != style.padding()[YGEdgeLeft] ||
552554
topPadding != style.padding()[YGEdgeTop] ||
553555
rightPadding != style.padding()[YGEdgeRight] ||
554556
bottomPadding != style.padding()[YGEdgeBottom]) {
555-
style.padding()[YGEdgeTop] = yogaStyleValueFromFloat(padding.top);
556-
style.padding()[YGEdgeLeft] = yogaStyleValueFromFloat(padding.left);
557-
style.padding()[YGEdgeRight] = yogaStyleValueFromFloat(padding.right);
558-
style.padding()[YGEdgeBottom] = yogaStyleValueFromFloat(padding.bottom);
557+
style.padding()[YGEdgeTop] =
558+
yoga::CompactValue::ofMaybe<YGUnitPoint>(padding.top);
559+
style.padding()[YGEdgeLeft] =
560+
yoga::CompactValue::ofMaybe<YGUnitPoint>(padding.left);
561+
style.padding()[YGEdgeRight] =
562+
yoga::CompactValue::ofMaybe<YGUnitPoint>(padding.right);
563+
style.padding()[YGEdgeBottom] =
564+
yoga::CompactValue::ofMaybe<YGUnitPoint>(padding.bottom);
559565
yogaNode_.setStyle(style);
560566
yogaNode_.setDirty(true);
561567
}
@@ -624,22 +630,21 @@ void YogaLayoutableShadowNode::layoutTree(
624630
auto ownerWidth = yogaFloatFromFloat(maximumSize.width);
625631
auto ownerHeight = yogaFloatFromFloat(maximumSize.height);
626632

627-
yogaStyle.maxDimensions()[YGDimensionWidth] = std::isfinite(maximumSize.width)
628-
? yogaStyleValueFromFloat(maximumSize.width)
629-
: YGValueUndefined;
633+
yogaStyle.setMaxDimension(
634+
YGDimensionWidth,
635+
yoga::CompactValue::ofMaybe<YGUnitPoint>(maximumSize.width));
630636

631-
yogaStyle.maxDimensions()[YGDimensionHeight] =
632-
std::isfinite(maximumSize.height)
633-
? yogaStyleValueFromFloat(maximumSize.height)
634-
: YGValueUndefined;
637+
yogaStyle.setMaxDimension(
638+
YGDimensionHeight,
639+
yoga::CompactValue::ofMaybe<YGUnitPoint>(maximumSize.height));
635640

636-
yogaStyle.minDimensions()[YGDimensionWidth] = minimumSize.width > 0
637-
? yogaStyleValueFromFloat(minimumSize.width)
638-
: YGValueUndefined;
641+
yogaStyle.setMinDimension(
642+
YGDimensionWidth,
643+
yoga::CompactValue::ofMaybe<YGUnitPoint>(minimumSize.width));
639644

640-
yogaStyle.minDimensions()[YGDimensionHeight] = minimumSize.height > 0
641-
? yogaStyleValueFromFloat(minimumSize.height)
642-
: YGValueUndefined;
645+
yogaStyle.setMinDimension(
646+
YGDimensionHeight,
647+
yoga::CompactValue::ofMaybe<YGUnitPoint>(minimumSize.height));
643648

644649
auto direction =
645650
yogaDirectionFromLayoutDirection(layoutConstraints.layoutDirection);

packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,19 @@ static inline T const getFieldValue(
181181
return; \
182182
}
183183

184-
#define REBUILD_FIELD_YG_DIMENSION(field, widthStr, heightStr) \
185-
REBUILD_YG_FIELD_SWITCH_CASE_INDEXED(field, YGDimensionWidth, widthStr); \
186-
REBUILD_YG_FIELD_SWITCH_CASE_INDEXED(field, YGDimensionHeight, heightStr);
184+
#define REBUILD_YG_FIELD_SWITCH_CASE_INDEXED_SETTER( \
185+
field, setter, index, fieldName) \
186+
case CONSTEXPR_RAW_PROPS_KEY_HASH(fieldName): { \
187+
yogaStyle.setter( \
188+
index, getFieldValue(context, value, ygDefaults.field(index))); \
189+
return; \
190+
}
191+
192+
#define REBUILD_FIELD_YG_DIMENSION(field, setter, widthStr, heightStr) \
193+
REBUILD_YG_FIELD_SWITCH_CASE_INDEXED_SETTER( \
194+
field, setter, YGDimensionWidth, widthStr); \
195+
REBUILD_YG_FIELD_SWITCH_CASE_INDEXED_SETTER( \
196+
field, setter, YGDimensionHeight, heightStr);
187197

188198
#define REBUILD_FIELD_YG_GUTTER(field, rowGapStr, columnGapStr, gapStr) \
189199
REBUILD_YG_FIELD_SWITCH_CASE_INDEXED(field, YGGutterRow, rowGapStr); \
@@ -242,9 +252,11 @@ void YogaStylableProps::setProp(
242252
REBUILD_FIELD_SWITCH_CASE2(positionType, "position");
243253
REBUILD_FIELD_YG_GUTTER(gap, "rowGap", "columnGap", "gap");
244254
REBUILD_FIELD_SWITCH_CASE_YSP(aspectRatio);
245-
REBUILD_FIELD_YG_DIMENSION(dimensions, "width", "height");
246-
REBUILD_FIELD_YG_DIMENSION(minDimensions, "minWidth", "minHeight");
247-
REBUILD_FIELD_YG_DIMENSION(maxDimensions, "maxWidth", "maxHeight");
255+
REBUILD_FIELD_YG_DIMENSION(dimension, setDimension, "width", "height");
256+
REBUILD_FIELD_YG_DIMENSION(
257+
minDimension, setMinDimension, "minWidth", "minHeight");
258+
REBUILD_FIELD_YG_DIMENSION(
259+
maxDimension, setMaxDimension, "maxWidth", "maxHeight");
248260
REBUILD_FIELD_YG_EDGES_POSITION();
249261
REBUILD_FIELD_YG_EDGES(margin, "margin", "");
250262
REBUILD_FIELD_YG_EDGES(padding, "padding", "");
@@ -336,15 +348,29 @@ SharedDebugStringConvertibleList YogaStylableProps::getDebugProps() const {
336348
debugStringConvertibleItem(
337349
"border", yogaStyle.border(), defaultYogaStyle.border()),
338350
debugStringConvertibleItem(
339-
"dimensions", yogaStyle.dimensions(), defaultYogaStyle.dimensions()),
351+
"width",
352+
yogaStyle.dimension(YGDimensionWidth),
353+
defaultYogaStyle.dimension(YGDimensionWidth)),
354+
debugStringConvertibleItem(
355+
"height",
356+
yogaStyle.dimension(YGDimensionHeight),
357+
defaultYogaStyle.dimension(YGDimensionHeight)),
358+
debugStringConvertibleItem(
359+
"minWidth",
360+
yogaStyle.minDimension(YGDimensionWidth),
361+
defaultYogaStyle.minDimension(YGDimensionWidth)),
362+
debugStringConvertibleItem(
363+
"minHeight",
364+
yogaStyle.minDimension(YGDimensionHeight),
365+
defaultYogaStyle.minDimension(YGDimensionHeight)),
340366
debugStringConvertibleItem(
341-
"minDimensions",
342-
yogaStyle.minDimensions(),
343-
defaultYogaStyle.minDimensions()),
367+
"maxWidth",
368+
yogaStyle.maxDimension(YGDimensionWidth),
369+
defaultYogaStyle.maxDimension(YGDimensionWidth)),
344370
debugStringConvertibleItem(
345-
"maxDimensions",
346-
yogaStyle.maxDimensions(),
347-
defaultYogaStyle.maxDimensions()),
371+
"maxHeight",
372+
yogaStyle.maxDimension(YGDimensionHeight),
373+
defaultYogaStyle.maxDimension(YGDimensionHeight)),
348374
debugStringConvertibleItem(
349375
"aspectRatio",
350376
yogaStyle.aspectRatio(),

packages/react-native/ReactCommon/react/renderer/components/view/conversions.h

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,22 +81,6 @@ inline yoga::FloatOptional yogaOptionalFloatFromFloat(Float value) {
8181
return yoga::FloatOptional((float)value);
8282
}
8383

84-
/*
85-
* `YGValue` <-> `React Native's `Float`
86-
*
87-
* `YGValue` represents optional dimensionful (a real number and some unit, e.g.
88-
* pixels).
89-
*/
90-
inline YGValue yogaStyleValueFromFloat(
91-
const Float& value,
92-
YGUnit unit = YGUnitPoint) {
93-
if (!std::isfinite(value)) {
94-
return YGValueUndefined;
95-
}
96-
97-
return {(float)value, unit};
98-
}
99-
10084
inline std::optional<Float> optionalFloatFromYogaValue(
10185
const YGValue value,
10286
std::optional<Float> base = {}) {
@@ -409,7 +393,7 @@ inline void fromRawValue(
409393
const RawValue& value,
410394
yoga::Style::ValueRepr& result) {
411395
if (value.hasType<Float>()) {
412-
result = yogaStyleValueFromFloat((Float)value);
396+
result = yoga::CompactValue::ofMaybe<YGUnitPoint>((float)value);
413397
return;
414398
} else if (value.hasType<std::string>()) {
415399
const auto stringValue = (std::string)value;

packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h

Lines changed: 53 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,6 @@ namespace facebook::react {
1717

1818
// Nearly this entire file can be deleted when iterator-style Prop parsing
1919
// ships fully for View
20-
static inline yoga::Style::Dimensions convertRawProp(
21-
const PropsParserContext& context,
22-
const RawProps& rawProps,
23-
const char* widthName,
24-
const char* heightName,
25-
const yoga::Style::Dimensions& sourceValue,
26-
const yoga::Style::Dimensions& defaultValue) {
27-
auto dimensions = defaultValue;
28-
dimensions[YGDimensionWidth] = convertRawProp(
29-
context,
30-
rawProps,
31-
widthName,
32-
sourceValue[YGDimensionWidth],
33-
defaultValue[YGDimensionWidth]);
34-
dimensions[YGDimensionHeight] = convertRawProp(
35-
context,
36-
rawProps,
37-
heightName,
38-
sourceValue[YGDimensionHeight],
39-
defaultValue[YGDimensionHeight]);
40-
return dimensions;
41-
}
4220

4321
static inline yoga::Style::Edges convertRawProp(
4422
const PropsParserContext& context,
@@ -294,33 +272,65 @@ static inline yoga::Style convertRawProp(
294272
"Width",
295273
sourceValue.border(),
296274
yogaStyle.border());
297-
yogaStyle.dimensions() = convertRawProp(
298-
context,
299-
rawProps,
300-
"width",
301-
"height",
302-
sourceValue.dimensions(),
303-
yogaStyle.dimensions());
304-
yogaStyle.minDimensions() = convertRawProp(
305-
context,
306-
rawProps,
307-
"minWidth",
308-
"minHeight",
309-
sourceValue.minDimensions(),
310-
yogaStyle.minDimensions());
311-
yogaStyle.maxDimensions() = convertRawProp(
312-
context,
313-
rawProps,
314-
"maxWidth",
315-
"maxHeight",
316-
sourceValue.maxDimensions(),
317-
yogaStyle.maxDimensions());
275+
276+
yogaStyle.setDimension(
277+
YGDimensionWidth,
278+
convertRawProp(
279+
context,
280+
rawProps,
281+
"width",
282+
sourceValue.dimension(YGDimensionWidth),
283+
{}));
284+
yogaStyle.setDimension(
285+
YGDimensionHeight,
286+
convertRawProp(
287+
context,
288+
rawProps,
289+
"height",
290+
sourceValue.dimension(YGDimensionHeight),
291+
{}));
292+
293+
yogaStyle.setMinDimension(
294+
YGDimensionWidth,
295+
convertRawProp(
296+
context,
297+
rawProps,
298+
"minWidth",
299+
sourceValue.minDimension(YGDimensionWidth),
300+
{}));
301+
yogaStyle.setMinDimension(
302+
YGDimensionHeight,
303+
convertRawProp(
304+
context,
305+
rawProps,
306+
"minHeight",
307+
sourceValue.minDimension(YGDimensionHeight),
308+
{}));
309+
310+
yogaStyle.setMaxDimension(
311+
YGDimensionWidth,
312+
convertRawProp(
313+
context,
314+
rawProps,
315+
"maxWidth",
316+
sourceValue.maxDimension(YGDimensionWidth),
317+
{}));
318+
yogaStyle.setMaxDimension(
319+
YGDimensionHeight,
320+
convertRawProp(
321+
context,
322+
rawProps,
323+
"maxHeight",
324+
sourceValue.maxDimension(YGDimensionHeight),
325+
{}));
326+
318327
yogaStyle.aspectRatio() = convertRawProp(
319328
context,
320329
rawProps,
321330
"aspectRatio",
322331
sourceValue.aspectRatio(),
323332
yogaStyle.aspectRatio());
333+
324334
return yogaStyle;
325335
}
326336

0 commit comments

Comments
 (0)