diff --git a/packages/react-native/ReactCommon/yoga/yoga/bits/EnumBitset.h b/packages/react-native/ReactCommon/yoga/yoga/bits/EnumBitset.h new file mode 100644 index 00000000000..3dff663f8fc --- /dev/null +++ b/packages/react-native/ReactCommon/yoga/yoga/bits/EnumBitset.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include + +namespace facebook::yoga { + +// std::bitset with one bit for each option defined in YG_ENUM_SEQ_DECL +template +using EnumBitset = std::bitset()>; + +} // namespace facebook::yoga diff --git a/packages/react-native/ReactCommon/yoga/yoga/BitUtils.h b/packages/react-native/ReactCommon/yoga/yoga/bits/NumericBitfield.h similarity index 64% rename from packages/react-native/ReactCommon/yoga/yoga/BitUtils.h rename to packages/react-native/ReactCommon/yoga/yoga/bits/NumericBitfield.h index 7c91550585d..af3fc6927d1 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/BitUtils.h +++ b/packages/react-native/ReactCommon/yoga/yoga/bits/NumericBitfield.h @@ -13,11 +13,7 @@ #include -namespace facebook::yoga::detail { - -// std::bitset with one bit for each option defined in YG_ENUM_SEQ_DECL -template -using EnumBitset = std::bitset()>; +namespace facebook::yoga::details { constexpr size_t log2ceilFn(size_t n) { return n < 1 ? 0 : (1 + log2ceilFn(n / 2)); @@ -27,30 +23,37 @@ constexpr int mask(size_t bitWidth, size_t index) { return ((1 << bitWidth) - 1) << index; } +} // namespace facebook::yoga::details + +namespace facebook::yoga { + // The number of bits necessary to represent enums defined with YG_ENUM_SEQ_DECL template -constexpr size_t bitWidthFn() { +constexpr size_t minimumBitCount() { static_assert( enums::count() > 0, "Enums must have at least one entries"); - return log2ceilFn(enums::count() - 1); + return details::log2ceilFn(enums::count() - 1); } template constexpr Enum getEnumData(int flags, size_t index) { - return static_cast((flags & mask(bitWidthFn(), index)) >> index); + return static_cast( + (flags & details::mask(minimumBitCount(), index)) >> index); } template void setEnumData(uint32_t& flags, size_t index, int newValue) { - flags = (flags & ~mask(bitWidthFn(), index)) | - ((newValue << index) & (mask(bitWidthFn(), index))); + flags = (flags & ~details::mask(minimumBitCount(), index)) | + ((newValue << index) & (details::mask(minimumBitCount(), index))); } template void setEnumData(uint8_t& flags, size_t index, int newValue) { - flags = (flags & ~static_cast(mask(bitWidthFn(), index))) | + flags = + (flags & + ~static_cast(details::mask(minimumBitCount(), index))) | ((newValue << index) & - (static_cast(mask(bitWidthFn(), index)))); + (static_cast(details::mask(minimumBitCount(), index)))); } constexpr bool getBooleanData(int flags, size_t index) { @@ -65,4 +68,4 @@ inline void setBooleanData(uint8_t& flags, size_t index, bool value) { } } -} // namespace facebook::yoga::detail +} // namespace facebook::yoga diff --git a/packages/react-native/ReactCommon/yoga/yoga/config/Config.cpp b/packages/react-native/ReactCommon/yoga/yoga/config/Config.cpp index 2f07454b976..d8809cf5a2c 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/config/Config.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/config/Config.cpp @@ -46,7 +46,7 @@ bool Config::isExperimentalFeatureEnabled(YGExperimentalFeature feature) const { return experimentalFeatures_.test(feature); } -ExperimentalFeatureSet Config::getEnabledExperiments() const { +EnumBitset Config::getEnabledExperiments() const { return experimentalFeatures_; } diff --git a/packages/react-native/ReactCommon/yoga/yoga/config/Config.h b/packages/react-native/ReactCommon/yoga/yoga/config/Config.h index 6470ebde4db..d0894b86be3 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/config/Config.h +++ b/packages/react-native/ReactCommon/yoga/yoga/config/Config.h @@ -9,7 +9,7 @@ #include -#include +#include #include // Tag struct used to form the opaque YGConfigRef for the public C API @@ -38,8 +38,6 @@ using CloneWithContextFn = YGNodeRef (*)( int childIndex, void* cloneContext); -using ExperimentalFeatureSet = detail::EnumBitset; - #pragma pack(push) #pragma pack(1) // Packed structure of <32-bit options to miminize size per node. @@ -65,7 +63,7 @@ public: YGExperimentalFeature feature, bool enabled); bool isExperimentalFeatureEnabled(YGExperimentalFeature feature) const; - ExperimentalFeatureSet getEnabledExperiments() const; + EnumBitset getEnabledExperiments() const; void setErrata(YGErrata errata); void addErrata(YGErrata errata); @@ -104,7 +102,7 @@ private: } logger_; ConfigFlags flags_{}; - ExperimentalFeatureSet experimentalFeatures_{}; + EnumBitset experimentalFeatures_{}; YGErrata errata_ = YGErrataNone; float pointScaleFactor_ = 1.0f; void* context_ = nullptr; diff --git a/packages/react-native/ReactCommon/yoga/yoga/node/LayoutResults.h b/packages/react-native/ReactCommon/yoga/yoga/node/LayoutResults.h index d920e9a24cf..c0d2bee26d1 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/node/LayoutResults.h +++ b/packages/react-native/ReactCommon/yoga/yoga/node/LayoutResults.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include @@ -23,7 +23,7 @@ struct LayoutResults { private: static constexpr size_t directionOffset = 0; static constexpr size_t hadOverflowOffset = - directionOffset + facebook::yoga::detail::bitWidthFn(); + directionOffset + minimumBitCount(); uint8_t flags = 0; public: @@ -43,21 +43,16 @@ public: YGCachedMeasurement cachedLayout = YGCachedMeasurement(); YGDirection direction() const { - return facebook::yoga::detail::getEnumData( - flags, directionOffset); + return getEnumData(flags, directionOffset); } void setDirection(YGDirection direction) { - facebook::yoga::detail::setEnumData( - flags, directionOffset, direction); + setEnumData(flags, directionOffset, direction); } - bool hadOverflow() const { - return facebook::yoga::detail::getBooleanData(flags, hadOverflowOffset); - } + bool hadOverflow() const { return getBooleanData(flags, hadOverflowOffset); } void setHadOverflow(bool hadOverflow) { - facebook::yoga::detail::setBooleanData( - flags, hadOverflowOffset, hadOverflow); + setBooleanData(flags, hadOverflowOffset, hadOverflow); } bool operator==(LayoutResults layout) const; diff --git a/packages/react-native/ReactCommon/yoga/yoga/style/Style.h b/packages/react-native/ReactCommon/yoga/yoga/style/Style.h index 49bb8ece672..10854fd6fb8 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/style/Style.h +++ b/packages/react-native/ReactCommon/yoga/yoga/style/Style.h @@ -14,8 +14,8 @@ #include #include -#include +#include #include #include @@ -34,11 +34,9 @@ public: struct BitfieldRef { Style& style; size_t offset; - operator T() const { - return facebook::yoga::detail::getEnumData(style.flags, offset); - } + operator T() const { return getEnumData(style.flags, offset); } BitfieldRef& operator=(T x) { - facebook::yoga::detail::setEnumData(style.flags, offset, x); + setEnumData(style.flags, offset, x); return *this; } }; @@ -85,23 +83,23 @@ public: private: static constexpr size_t directionOffset = 0; static constexpr size_t flexdirectionOffset = - directionOffset + facebook::yoga::detail::bitWidthFn(); - static constexpr size_t justifyContentOffset = flexdirectionOffset + - facebook::yoga::detail::bitWidthFn(); + directionOffset + minimumBitCount(); + static constexpr size_t justifyContentOffset = + flexdirectionOffset + minimumBitCount(); static constexpr size_t alignContentOffset = - justifyContentOffset + facebook::yoga::detail::bitWidthFn(); + justifyContentOffset + minimumBitCount(); static constexpr size_t alignItemsOffset = - alignContentOffset + facebook::yoga::detail::bitWidthFn(); + alignContentOffset + minimumBitCount(); static constexpr size_t alignSelfOffset = - alignItemsOffset + facebook::yoga::detail::bitWidthFn(); + alignItemsOffset + minimumBitCount(); static constexpr size_t positionTypeOffset = - alignSelfOffset + facebook::yoga::detail::bitWidthFn(); + alignSelfOffset + minimumBitCount(); static constexpr size_t flexWrapOffset = - positionTypeOffset + facebook::yoga::detail::bitWidthFn(); + positionTypeOffset + minimumBitCount(); static constexpr size_t overflowOffset = - flexWrapOffset + facebook::yoga::detail::bitWidthFn(); + flexWrapOffset + minimumBitCount(); static constexpr size_t displayOffset = - overflowOffset + facebook::yoga::detail::bitWidthFn(); + overflowOffset + minimumBitCount(); uint32_t flags = 0; @@ -125,65 +123,56 @@ public: using ValueRepr = std::remove_reference::type; YGDirection direction() const { - return facebook::yoga::detail::getEnumData( - flags, directionOffset); + return getEnumData(flags, directionOffset); } BitfieldRef direction() { return {*this, directionOffset}; } YGFlexDirection flexDirection() const { - return facebook::yoga::detail::getEnumData( - flags, flexdirectionOffset); + return getEnumData(flags, flexdirectionOffset); } BitfieldRef flexDirection() { return {*this, flexdirectionOffset}; } YGJustify justifyContent() const { - return facebook::yoga::detail::getEnumData( - flags, justifyContentOffset); + return getEnumData(flags, justifyContentOffset); } BitfieldRef justifyContent() { return {*this, justifyContentOffset}; } YGAlign alignContent() const { - return facebook::yoga::detail::getEnumData( - flags, alignContentOffset); + return getEnumData(flags, alignContentOffset); } BitfieldRef alignContent() { return {*this, alignContentOffset}; } YGAlign alignItems() const { - return facebook::yoga::detail::getEnumData( - flags, alignItemsOffset); + return getEnumData(flags, alignItemsOffset); } BitfieldRef alignItems() { return {*this, alignItemsOffset}; } YGAlign alignSelf() const { - return facebook::yoga::detail::getEnumData(flags, alignSelfOffset); + return getEnumData(flags, alignSelfOffset); } BitfieldRef alignSelf() { return {*this, alignSelfOffset}; } YGPositionType positionType() const { - return facebook::yoga::detail::getEnumData( - flags, positionTypeOffset); + return getEnumData(flags, positionTypeOffset); } BitfieldRef positionType() { return {*this, positionTypeOffset}; } - YGWrap flexWrap() const { - return facebook::yoga::detail::getEnumData(flags, flexWrapOffset); - } + YGWrap flexWrap() const { return getEnumData(flags, flexWrapOffset); } BitfieldRef flexWrap() { return {*this, flexWrapOffset}; } YGOverflow overflow() const { - return facebook::yoga::detail::getEnumData( - flags, overflowOffset); + return getEnumData(flags, overflowOffset); } BitfieldRef overflow() { return {*this, overflowOffset}; } YGDisplay display() const { - return facebook::yoga::detail::getEnumData(flags, displayOffset); + return getEnumData(flags, displayOffset); } BitfieldRef display() { return {*this, displayOffset}; }