Skip to content

Commit 947f34e

Browse files
committed
refactor: use FNV-1a hashing for calc expression property identification
1 parent e8119dd commit 947f34e

7 files changed

Lines changed: 109 additions & 345 deletions

File tree

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -950,12 +950,11 @@ YGValue YogaLayoutableShadowNode::yogaNodeCalcValueResolver(
950950

951951
auto& node = shadowNodeFromContext(yogaNode);
952952
auto& props = static_cast<const YogaStylableProps&>(*node.props_);
953-
auto key = static_cast<CalcExpressionPropertyID>(id);
954-
if (!props.calcExpressions.contains(key)) {
953+
if (!props.calcExpressions.contains(id)) {
955954
return {};
956955
}
957-
958-
auto& calc = props.calcExpressions.at(key);
956+
957+
auto& calc = props.calcExpressions.at(id);
959958
return YGValue(
960959
calc.resolve(
961960
context.referenceLength,

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

Lines changed: 92 additions & 290 deletions
Large diffs are not rendered by default.

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

Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <bitset>
1818
#include <cmath>
1919
#include <optional>
20+
#include <unordered_map>
2021

2122
namespace facebook::react {
2223

@@ -254,46 +255,6 @@ inline bool areBorderRadiiCircular(const BorderRadii &borderRadii)
254255
return borderRadii.isUniform() && borderRadii.topLeft.horizontal == borderRadii.topLeft.vertical;
255256
}
256257

257-
enum class CalcExpressionPropertyID : uint8_t {
258-
Width,
259-
Height,
260-
MinWidth,
261-
MinHeight,
262-
MaxWidth,
263-
MaxHeight,
264-
FlexBasis,
265-
RowGap,
266-
ColumnGap,
267-
Gap,
268-
Left,
269-
Top,
270-
Right,
271-
Bottom,
272-
Start,
273-
End,
274-
InsetInline,
275-
InsetBlock,
276-
Inset,
277-
MarginLeft,
278-
MarginTop,
279-
MarginRight,
280-
MarginBottom,
281-
MarginStart,
282-
MarginEnd,
283-
MarginHorizontal,
284-
MarginVertical,
285-
MarginAll,
286-
PaddingLeft,
287-
PaddingTop,
288-
PaddingRight,
289-
PaddingBottom,
290-
PaddingStart,
291-
PaddingEnd,
292-
PaddingHorizontal,
293-
PaddingVertical,
294-
PaddingAll,
295-
};
296-
297-
using CalcExpressions = std::unordered_map<CalcExpressionPropertyID, CSSCalc>;
258+
using CalcExpressions = std::unordered_map<uint32_t, CSSCalc>;
298259

299260
} // namespace facebook::react

packages/react-native/ReactCommon/yoga/yoga/YGValue.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ YG_EXPORT bool YGFloatIsUndefined(float value);
5858
/**
5959
* Host-defined identifier for a dynamic style value.
6060
*/
61-
typedef uint8_t YGValueDynamicID;
61+
typedef uint32_t YGValueDynamicID;
6262

6363
/**
6464
* Layout context passed to YGValueDynamic for resolving dynamic values.
@@ -77,14 +77,6 @@ typedef YGValue (*YGValueDynamic)(
7777
YGValueDynamicID id,
7878
YGValueDynamicContext context);
7979

80-
/**
81-
* Callback + identifier pair for internal storage.
82-
*/
83-
struct YGValueDynamicData {
84-
YGValueDynamic callback;
85-
YGValueDynamicID id;
86-
};
87-
8880
YG_EXTERN_C_END
8981

9082
// Equality operators for comparison of YGValue in C++

packages/react-native/ReactCommon/yoga/yoga/style/StyleLength.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@ class StyleLength {
147147
}
148148

149149
private:
150+
struct YGValueDynamicData {
151+
YGValueDynamic callback;
152+
YGValueDynamicID id;
153+
};
154+
150155
union Payload {
151156
constexpr Payload() : value{} {}
152157
constexpr explicit Payload(FloatOptional val) : value(val) {}

packages/react-native/ReactCommon/yoga/yoga/style/StyleSizeLength.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,11 @@ class StyleSizeLength {
178178
}
179179

180180
private:
181+
struct YGValueDynamicData {
182+
YGValueDynamic callback;
183+
YGValueDynamicID id;
184+
};
185+
181186
union Payload {
182187
constexpr Payload() : value{} {}
183188
constexpr explicit Payload(FloatOptional val) : value(val) {}

packages/react-native/ReactCommon/yoga/yoga/style/StyleValuePool.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ class StyleValuePool {
185185
YGValueDynamicID getDynamicCallbackID(StyleValueHandle handle) const {
186186
assert(handle.isDynamic());
187187
assert(handle.isValueIndexed());
188-
return static_cast<uint8_t>(buffer_.get32(handle.value() + 2));
188+
return buffer_.get32(handle.value() + 2);
189189
}
190190

191191
static constexpr bool isIntegerPackable(float f) {

0 commit comments

Comments
 (0)