diff --git a/yoga/YGNodeStyle.cpp b/yoga/YGNodeStyle.cpp index 441b7797f7..14f2dc3062 100644 --- a/yoga/YGNodeStyle.cpp +++ b/yoga/YGNodeStyle.cpp @@ -14,54 +14,26 @@ using namespace facebook::yoga; namespace { -template -void updateStyle( - yoga::Node* node, - T value, - NeedsUpdate&& needsUpdate, - Update&& update) { - if (needsUpdate(node->getStyle(), value)) { - update(node->getStyle(), value); - node->markDirtyAndPropagate(); - } -} - -template -void updateStyle(YGNodeRef node, Ref (Style::*prop)(), ValueT value) { - updateStyle( - resolveRef(node), - value, - [prop](Style& s, ValueT x) { return (s.*prop)() != x; }, - [prop](Style& s, ValueT x) { (s.*prop)() = x; }); -} - template void updateStyle(YGNodeRef node, ValueT value) { - updateStyle( - resolveRef(node), - value, - [](Style& s, ValueT x) { return (s.*GetterT)() != x; }, - [](Style& s, ValueT x) { (s.*SetterT)(x); }); + auto& style = resolveRef(node)->getStyle(); + if ((style.*GetterT)() != value) { + (style.*SetterT)(value); + resolveRef(node)->markDirtyAndPropagate(); + } } template -void updateIndexedStyleProp(YGNodeRef node, IdxT idx, ValueT value) { - updateStyle( - resolveRef(node), - value, - [idx](Style& s, ValueT x) { return (s.*GetterT)(idx) != x; }, - [idx](Style& s, ValueT x) { (s.*SetterT)(idx, x); }); +void updateStyle(YGNodeRef node, IdxT idx, ValueT value) { + auto& style = resolveRef(node)->getStyle(); + if ((style.*GetterT)(idx) != value) { + (style.*SetterT)(idx, value); + resolveRef(node)->markDirtyAndPropagate(); + } } } // namespace -// MSVC has trouble inferring the return type of pointer to member functions -// with const and non-const overloads, instead of preferring the non-const -// overload like clang and GCC. For the purposes of updateStyle(), we can help -// MSVC by specifying that return type explicitly. In combination with -// decltype, MSVC will prefer the non-const version. -#define MSVC_HINT(PROP) decltype(Style{}.PROP()) - void YGNodeCopyStyle( const YGNodeRef dstNodeRef, const YGNodeConstRef srcNodeRef) { @@ -75,7 +47,7 @@ void YGNodeCopyStyle( } void YGNodeStyleSetDirection(const YGNodeRef node, const YGDirection value) { - updateStyle(node, &Style::direction, scopedEnum(value)); + updateStyle<&Style::direction, &Style::setDirection>(node, scopedEnum(value)); } YGDirection YGNodeStyleGetDirection(const YGNodeConstRef node) { @@ -85,8 +57,8 @@ YGDirection YGNodeStyleGetDirection(const YGNodeConstRef node) { void YGNodeStyleSetFlexDirection( const YGNodeRef node, const YGFlexDirection flexDirection) { - updateStyle( - node, &Style::flexDirection, scopedEnum(flexDirection)); + updateStyle<&Style::flexDirection, &Style::setFlexDirection>( + node, scopedEnum(flexDirection)); } YGFlexDirection YGNodeStyleGetFlexDirection(const YGNodeConstRef node) { @@ -96,8 +68,8 @@ YGFlexDirection YGNodeStyleGetFlexDirection(const YGNodeConstRef node) { void YGNodeStyleSetJustifyContent( const YGNodeRef node, const YGJustify justifyContent) { - updateStyle( - node, &Style::justifyContent, scopedEnum(justifyContent)); + updateStyle<&Style::justifyContent, &Style::setJustifyContent>( + node, scopedEnum(justifyContent)); } YGJustify YGNodeStyleGetJustifyContent(const YGNodeConstRef node) { @@ -107,8 +79,8 @@ YGJustify YGNodeStyleGetJustifyContent(const YGNodeConstRef node) { void YGNodeStyleSetAlignContent( const YGNodeRef node, const YGAlign alignContent) { - updateStyle( - node, &Style::alignContent, scopedEnum(alignContent)); + updateStyle<&Style::alignContent, &Style::setAlignContent>( + node, scopedEnum(alignContent)); } YGAlign YGNodeStyleGetAlignContent(const YGNodeConstRef node) { @@ -116,8 +88,8 @@ YGAlign YGNodeStyleGetAlignContent(const YGNodeConstRef node) { } void YGNodeStyleSetAlignItems(const YGNodeRef node, const YGAlign alignItems) { - updateStyle( - node, &Style::alignItems, scopedEnum(alignItems)); + updateStyle<&Style::alignItems, &Style::setAlignItems>( + node, scopedEnum(alignItems)); } YGAlign YGNodeStyleGetAlignItems(const YGNodeConstRef node) { @@ -125,8 +97,8 @@ YGAlign YGNodeStyleGetAlignItems(const YGNodeConstRef node) { } void YGNodeStyleSetAlignSelf(const YGNodeRef node, const YGAlign alignSelf) { - updateStyle( - node, &Style::alignSelf, scopedEnum(alignSelf)); + updateStyle<&Style::alignSelf, &Style::setAlignSelf>( + node, scopedEnum(alignSelf)); } YGAlign YGNodeStyleGetAlignSelf(const YGNodeConstRef node) { @@ -136,8 +108,8 @@ YGAlign YGNodeStyleGetAlignSelf(const YGNodeConstRef node) { void YGNodeStyleSetPositionType( const YGNodeRef node, const YGPositionType positionType) { - updateStyle( - node, &Style::positionType, scopedEnum(positionType)); + updateStyle<&Style::positionType, &Style::setPositionType>( + node, scopedEnum(positionType)); } YGPositionType YGNodeStyleGetPositionType(const YGNodeConstRef node) { @@ -145,8 +117,8 @@ YGPositionType YGNodeStyleGetPositionType(const YGNodeConstRef node) { } void YGNodeStyleSetFlexWrap(const YGNodeRef node, const YGWrap flexWrap) { - updateStyle( - node, &Style::flexWrap, scopedEnum(flexWrap)); + updateStyle<&Style::flexWrap, &Style::setFlexWrap>( + node, scopedEnum(flexWrap)); } YGWrap YGNodeStyleGetFlexWrap(const YGNodeConstRef node) { @@ -154,8 +126,8 @@ YGWrap YGNodeStyleGetFlexWrap(const YGNodeConstRef node) { } void YGNodeStyleSetOverflow(const YGNodeRef node, const YGOverflow overflow) { - updateStyle( - node, &Style::overflow, scopedEnum(overflow)); + updateStyle<&Style::overflow, &Style::setOverflow>( + node, scopedEnum(overflow)); } YGOverflow YGNodeStyleGetOverflow(const YGNodeConstRef node) { @@ -163,7 +135,7 @@ YGOverflow YGNodeStyleGetOverflow(const YGNodeConstRef node) { } void YGNodeStyleSetDisplay(const YGNodeRef node, const YGDisplay display) { - updateStyle(node, &Style::display, scopedEnum(display)); + updateStyle<&Style::display, &Style::setDisplay>(node, scopedEnum(display)); } YGDisplay YGNodeStyleGetDisplay(const YGNodeConstRef node) { @@ -231,12 +203,12 @@ YGValue YGNodeStyleGetFlexBasis(const YGNodeConstRef node) { } void YGNodeStyleSetPosition(YGNodeRef node, YGEdge edge, float points) { - updateIndexedStyleProp<&Style::position, &Style::setPosition>( + updateStyle<&Style::position, &Style::setPosition>( node, scopedEnum(edge), value::points(points)); } void YGNodeStyleSetPositionPercent(YGNodeRef node, YGEdge edge, float percent) { - updateIndexedStyleProp<&Style::position, &Style::setPosition>( + updateStyle<&Style::position, &Style::setPosition>( node, scopedEnum(edge), value::percent(percent)); } @@ -245,17 +217,17 @@ YGValue YGNodeStyleGetPosition(YGNodeConstRef node, YGEdge edge) { } void YGNodeStyleSetMargin(YGNodeRef node, YGEdge edge, float points) { - updateIndexedStyleProp<&Style::margin, &Style::setMargin>( + updateStyle<&Style::margin, &Style::setMargin>( node, scopedEnum(edge), value::points(points)); } void YGNodeStyleSetMarginPercent(YGNodeRef node, YGEdge edge, float percent) { - updateIndexedStyleProp<&Style::margin, &Style::setMargin>( + updateStyle<&Style::margin, &Style::setMargin>( node, scopedEnum(edge), value::percent(percent)); } void YGNodeStyleSetMarginAuto(YGNodeRef node, YGEdge edge) { - updateIndexedStyleProp<&Style::margin, &Style::setMargin>( + updateStyle<&Style::margin, &Style::setMargin>( node, scopedEnum(edge), value::ofAuto()); } @@ -264,12 +236,12 @@ YGValue YGNodeStyleGetMargin(YGNodeConstRef node, YGEdge edge) { } void YGNodeStyleSetPadding(YGNodeRef node, YGEdge edge, float points) { - updateIndexedStyleProp<&Style::padding, &Style::setPadding>( + updateStyle<&Style::padding, &Style::setPadding>( node, scopedEnum(edge), value::points(points)); } void YGNodeStyleSetPaddingPercent(YGNodeRef node, YGEdge edge, float percent) { - updateIndexedStyleProp<&Style::padding, &Style::setPadding>( + updateStyle<&Style::padding, &Style::setPadding>( node, scopedEnum(edge), value::percent(percent)); } @@ -281,7 +253,7 @@ void YGNodeStyleSetBorder( const YGNodeRef node, const YGEdge edge, const float border) { - updateIndexedStyleProp<&Style::border, &Style::setBorder>( + updateStyle<&Style::border, &Style::setBorder>( node, scopedEnum(edge), value::points(border)); } @@ -298,7 +270,7 @@ void YGNodeStyleSetGap( const YGNodeRef node, const YGGutter gutter, const float gapLength) { - updateIndexedStyleProp<&Style::gap, &Style::setGap>( + updateStyle<&Style::gap, &Style::setGap>( node, scopedEnum(gutter), value::points(gapLength)); } @@ -322,17 +294,17 @@ float YGNodeStyleGetAspectRatio(const YGNodeConstRef node) { } void YGNodeStyleSetWidth(YGNodeRef node, float points) { - updateIndexedStyleProp<&Style::dimension, &Style::setDimension>( + updateStyle<&Style::dimension, &Style::setDimension>( node, Dimension::Width, value::points(points)); } void YGNodeStyleSetWidthPercent(YGNodeRef node, float percent) { - updateIndexedStyleProp<&Style::dimension, &Style::setDimension>( + updateStyle<&Style::dimension, &Style::setDimension>( node, Dimension::Width, value::percent(percent)); } void YGNodeStyleSetWidthAuto(YGNodeRef node) { - updateIndexedStyleProp<&Style::dimension, &Style::setDimension>( + updateStyle<&Style::dimension, &Style::setDimension>( node, Dimension::Width, value::ofAuto()); } @@ -341,17 +313,17 @@ YGValue YGNodeStyleGetWidth(YGNodeConstRef node) { } void YGNodeStyleSetHeight(YGNodeRef node, float points) { - updateIndexedStyleProp<&Style::dimension, &Style::setDimension>( + updateStyle<&Style::dimension, &Style::setDimension>( node, Dimension::Height, value::points(points)); } void YGNodeStyleSetHeightPercent(YGNodeRef node, float percent) { - updateIndexedStyleProp<&Style::dimension, &Style::setDimension>( + updateStyle<&Style::dimension, &Style::setDimension>( node, Dimension::Height, value::percent(percent)); } void YGNodeStyleSetHeightAuto(YGNodeRef node) { - updateIndexedStyleProp<&Style::dimension, &Style::setDimension>( + updateStyle<&Style::dimension, &Style::setDimension>( node, Dimension::Height, value::ofAuto()); } @@ -360,12 +332,12 @@ YGValue YGNodeStyleGetHeight(YGNodeConstRef node) { } void YGNodeStyleSetMinWidth(const YGNodeRef node, const float minWidth) { - updateIndexedStyleProp<&Style::minDimension, &Style::setMinDimension>( + updateStyle<&Style::minDimension, &Style::setMinDimension>( node, Dimension::Width, value::points(minWidth)); } void YGNodeStyleSetMinWidthPercent(const YGNodeRef node, const float minWidth) { - updateIndexedStyleProp<&Style::minDimension, &Style::setMinDimension>( + updateStyle<&Style::minDimension, &Style::setMinDimension>( node, Dimension::Width, value::percent(minWidth)); } @@ -374,14 +346,14 @@ YGValue YGNodeStyleGetMinWidth(const YGNodeConstRef node) { } void YGNodeStyleSetMinHeight(const YGNodeRef node, const float minHeight) { - updateIndexedStyleProp<&Style::minDimension, &Style::setMinDimension>( + updateStyle<&Style::minDimension, &Style::setMinDimension>( node, Dimension::Height, value::points(minHeight)); } void YGNodeStyleSetMinHeightPercent( const YGNodeRef node, const float minHeight) { - updateIndexedStyleProp<&Style::minDimension, &Style::setMinDimension>( + updateStyle<&Style::minDimension, &Style::setMinDimension>( node, Dimension::Height, value::percent(minHeight)); } @@ -390,12 +362,12 @@ YGValue YGNodeStyleGetMinHeight(const YGNodeConstRef node) { } void YGNodeStyleSetMaxWidth(const YGNodeRef node, const float maxWidth) { - updateIndexedStyleProp<&Style::maxDimension, &Style::setMaxDimension>( + updateStyle<&Style::maxDimension, &Style::setMaxDimension>( node, Dimension::Width, value::points(maxWidth)); } void YGNodeStyleSetMaxWidthPercent(const YGNodeRef node, const float maxWidth) { - updateIndexedStyleProp<&Style::maxDimension, &Style::setMaxDimension>( + updateStyle<&Style::maxDimension, &Style::setMaxDimension>( node, Dimension::Width, value::percent(maxWidth)); } @@ -404,14 +376,14 @@ YGValue YGNodeStyleGetMaxWidth(const YGNodeConstRef node) { } void YGNodeStyleSetMaxHeight(const YGNodeRef node, const float maxHeight) { - updateIndexedStyleProp<&Style::maxDimension, &Style::setMaxDimension>( + updateStyle<&Style::maxDimension, &Style::setMaxDimension>( node, Dimension::Height, value::points(maxHeight)); } void YGNodeStyleSetMaxHeightPercent( const YGNodeRef node, const float maxHeight) { - updateIndexedStyleProp<&Style::maxDimension, &Style::setMaxDimension>( + updateStyle<&Style::maxDimension, &Style::setMaxDimension>( node, Dimension::Height, value::percent(maxHeight)); } diff --git a/yoga/node/Node.h b/yoga/node/Node.h index d01a1ed4ca..0cb9fabc8e 100644 --- a/yoga/node/Node.h +++ b/yoga/node/Node.h @@ -61,8 +61,8 @@ class YG_EXPORT Node : public ::YGNode { Direction direction) const; void useWebDefaults() { - style_.flexDirection() = FlexDirection::Row; - style_.alignContent() = Align::Stretch; + style_.setFlexDirection(FlexDirection::Row); + style_.setAlignContent(Align::Stretch); } template diff --git a/yoga/style/Style.h b/yoga/style/Style.h index 09f5c3c1fb..74736d27b9 100644 --- a/yoga/style/Style.h +++ b/yoga/style/Style.h @@ -55,22 +55,9 @@ class YG_EXPORT Style { static constexpr float DefaultFlexShrink = 0.0f; static constexpr float WebDefaultFlexShrink = 1.0f; - template - struct BitfieldRef { - Style& style; - uint8_t offset; - operator T() const { - return getEnumData(style.flags, offset); - } - BitfieldRef& operator=(T x) { - setEnumData(style.flags, offset, x); - return *this; - } - }; - Style() { - alignContent() = Align::FlexStart; - alignItems() = Align::Stretch; + setAlignContent(Align::FlexStart); + setAlignItems(Align::Stretch); } ~Style() = default; @@ -99,7 +86,7 @@ class YG_EXPORT Style { static constexpr uint8_t displayOffset = overflowOffset + minimumBitCount(); - uint32_t flags = 0; + uint32_t flags_ = 0; FloatOptional flex_ = {}; FloatOptional flexGrow_ = {}; @@ -118,73 +105,73 @@ class YG_EXPORT Style { public: Direction direction() const { - return getEnumData(flags, directionOffset); + return getEnumData(flags_, directionOffset); } - BitfieldRef direction() { - return {*this, directionOffset}; + void setDirection(Direction value) { + setEnumData(flags_, directionOffset, value); } FlexDirection flexDirection() const { - return getEnumData(flags, flexdirectionOffset); + return getEnumData(flags_, flexdirectionOffset); } - BitfieldRef flexDirection() { - return {*this, flexdirectionOffset}; + void setFlexDirection(FlexDirection value) { + setEnumData(flags_, flexdirectionOffset, value); } Justify justifyContent() const { - return getEnumData(flags, justifyContentOffset); + return getEnumData(flags_, justifyContentOffset); } - BitfieldRef justifyContent() { - return {*this, justifyContentOffset}; + void setJustifyContent(Justify value) { + setEnumData(flags_, justifyContentOffset, value); } Align alignContent() const { - return getEnumData(flags, alignContentOffset); + return getEnumData(flags_, alignContentOffset); } - BitfieldRef alignContent() { - return {*this, alignContentOffset}; + void setAlignContent(Align value) { + setEnumData(flags_, alignContentOffset, value); } Align alignItems() const { - return getEnumData(flags, alignItemsOffset); + return getEnumData(flags_, alignItemsOffset); } - BitfieldRef alignItems() { - return {*this, alignItemsOffset}; + void setAlignItems(Align value) { + setEnumData(flags_, alignItemsOffset, value); } Align alignSelf() const { - return getEnumData(flags, alignSelfOffset); + return getEnumData(flags_, alignSelfOffset); } - BitfieldRef alignSelf() { - return {*this, alignSelfOffset}; + void setAlignSelf(Align value) { + setEnumData(flags_, alignSelfOffset, value); } PositionType positionType() const { - return getEnumData(flags, positionTypeOffset); + return getEnumData(flags_, positionTypeOffset); } - BitfieldRef positionType() { - return {*this, positionTypeOffset}; + void setPositionType(PositionType value) { + setEnumData(flags_, positionTypeOffset, value); } Wrap flexWrap() const { - return getEnumData(flags, flexWrapOffset); + return getEnumData(flags_, flexWrapOffset); } - BitfieldRef flexWrap() { - return {*this, flexWrapOffset}; + void setFlexWrap(Wrap value) { + setEnumData(flags_, flexWrapOffset, value); } Overflow overflow() const { - return getEnumData(flags, overflowOffset); + return getEnumData(flags_, overflowOffset); } - BitfieldRef overflow() { - return {*this, overflowOffset}; + void setOverflow(Overflow value) { + setEnumData(flags_, overflowOffset, value); } Display display() const { - return getEnumData(flags, displayOffset); + return getEnumData(flags_, displayOffset); } - BitfieldRef display() { - return {*this, displayOffset}; + void setDisplay(Display value) { + setEnumData(flags_, displayOffset, value); } FloatOptional flex() const { @@ -295,7 +282,7 @@ class YG_EXPORT Style { } bool operator==(const Style& other) const { - return flags == other.flags && inexactEquals(flex_, other.flex_) && + return flags_ == other.flags_ && inexactEquals(flex_, other.flex_) && inexactEquals(flexGrow_, other.flexGrow_) && inexactEquals(flexShrink_, other.flexShrink_) && inexactEquals(flexBasis_, other.flexBasis_) &&