Remove Bitfield from YGStyle

Summary:
##Changelog:

[Internal][Yoga] Remove Bitfield from YGStyle

Reviewed By: astreet

Differential Revision: D18519614

fbshipit-source-id: 70f18bc679b62712d40d76bd793cf85906b067a1
This commit is contained in:
Sidharth Guglani
2019-11-22 04:28:49 -08:00
committed by Facebook Github Bot
parent 9650c1903d
commit 9d2ca758fa

View File

@@ -10,12 +10,12 @@
#include <array> #include <array>
#include <cstdint> #include <cstdint>
#include <type_traits> #include <type_traits>
#include "Bitfield.h"
#include "CompactValue.h" #include "CompactValue.h"
#include "YGEnums.h" #include "YGEnums.h"
#include "YGFloatOptional.h" #include "YGFloatOptional.h"
#include "Yoga-internal.h" #include "Yoga-internal.h"
#include "Yoga.h" #include "Yoga.h"
#include "BitUtils.h"
class YOGA_EXPORT YGStyle { class YOGA_EXPORT YGStyle {
template <typename Enum> template <typename Enum>
@@ -27,6 +27,19 @@ public:
using Dimensions = Values<YGDimension>; using Dimensions = Values<YGDimension>;
using Edges = Values<YGEdge>; using Edges = Values<YGEdge>;
template <typename T>
struct BitfieldRef {
YGStyle& style;
size_t offset;
operator T() const {
return facebook::yoga::detail::getEnumData<T>(style.flags, offset);
}
BitfieldRef<T>& operator=(T x) {
facebook::yoga::detail::setEnumData<T>(style.flags, offset, x);
return *this;
}
};
template <typename T, T YGStyle::*Prop> template <typename T, T YGStyle::*Prop>
struct Ref { struct Ref {
YGStyle& style; YGStyle& style;
@@ -60,43 +73,35 @@ public:
CompactValue operator[](Idx idx) const { return (style.*Prop)[idx]; } CompactValue operator[](Idx idx) const { return (style.*Prop)[idx]; }
}; };
YGStyle() = default; YGStyle() {
alignContent() = YGAlignFlexStart;
alignItems() = YGAlignStretch;
}
~YGStyle() = default; ~YGStyle() = default;
private: private:
static constexpr size_t directionIdx = 0; static constexpr size_t directionOffset = 0;
static constexpr size_t flexDirectionIdx = 1; static constexpr size_t flexdirectionOffset =
static constexpr size_t justifyContentIdx = 2; directionOffset + facebook::yoga::detail::bitWidthFn<YGDirection>();
static constexpr size_t alignContentIdx = 3; static constexpr size_t justifyContentOffset = flexdirectionOffset +
static constexpr size_t alignItemsIdx = 4; facebook::yoga::detail::bitWidthFn<YGFlexDirection>();
static constexpr size_t alignSelfIdx = 5; static constexpr size_t alignContentOffset =
static constexpr size_t positionTypeIdx = 6; justifyContentOffset + facebook::yoga::detail::bitWidthFn<YGJustify>();
static constexpr size_t flexWrapIdx = 7; static constexpr size_t alignItemsOffset =
static constexpr size_t overflowIdx = 8; alignContentOffset + facebook::yoga::detail::bitWidthFn<YGAlign>();
static constexpr size_t displayIdx = 9; static constexpr size_t alignSelfOffset =
using Flags = facebook::yoga::Bitfield< alignItemsOffset + facebook::yoga::detail::bitWidthFn<YGAlign>();
uint32_t, static constexpr size_t positionTypeOffset =
YGDirection, alignSelfOffset + facebook::yoga::detail::bitWidthFn<YGAlign>();
YGFlexDirection, static constexpr size_t flexWrapOffset =
YGJustify, positionTypeOffset + facebook::yoga::detail::bitWidthFn<YGPositionType>();
YGAlign, static constexpr size_t overflowOffset =
YGAlign, flexWrapOffset + facebook::yoga::detail::bitWidthFn<YGWrap>();
YGAlign, static constexpr size_t displayOffset =
YGPositionType, overflowOffset + facebook::yoga::detail::bitWidthFn<YGOverflow>();
YGWrap,
YGOverflow, uint32_t flags = 0;
YGDisplay>;
Flags flags_ = {YGDirectionInherit,
YGFlexDirectionColumn,
YGJustifyFlexStart,
YGAlignFlexStart,
YGAlignStretch,
YGAlignAuto,
YGPositionTypeRelative,
YGWrapNoWrap,
YGOverflowVisible,
YGDisplayFlex};
YGFloatOptional flex_ = {}; YGFloatOptional flex_ = {};
YGFloatOptional flexGrow_ = {}; YGFloatOptional flexGrow_ = {};
YGFloatOptional flexShrink_ = {}; YGFloatOptional flexShrink_ = {};
@@ -115,45 +120,68 @@ public:
// for library users needing a type // for library users needing a type
using ValueRepr = std::remove_reference<decltype(margin_[0])>::type; using ValueRepr = std::remove_reference<decltype(margin_[0])>::type;
YGDirection direction() const { return flags_.at<directionIdx>(); } YGDirection direction() const {
Flags::Ref<directionIdx> direction() { return flags_.at<directionIdx>(); } return facebook::yoga::detail::getEnumData<YGDirection>(
flags, directionOffset);
}
BitfieldRef<YGDirection> direction() { return {*this, directionOffset}; }
YGFlexDirection flexDirection() const { YGFlexDirection flexDirection() const {
return flags_.at<flexDirectionIdx>(); return facebook::yoga::detail::getEnumData<YGFlexDirection>(
flags, flexdirectionOffset);
} }
Flags::Ref<flexDirectionIdx> flexDirection() { BitfieldRef<YGFlexDirection> flexDirection() {
return flags_.at<flexDirectionIdx>(); return {*this, flexdirectionOffset};
} }
YGJustify justifyContent() const { return flags_.at<justifyContentIdx>(); } YGJustify justifyContent() const {
Flags::Ref<justifyContentIdx> justifyContent() { return facebook::yoga::detail::getEnumData<YGJustify>(
return flags_.at<justifyContentIdx>(); flags, justifyContentOffset);
}
BitfieldRef<YGJustify> justifyContent() {
return {*this, justifyContentOffset};
} }
YGAlign alignContent() const { return flags_.at<alignContentIdx>(); } YGAlign alignContent() const {
Flags::Ref<alignContentIdx> alignContent() { return facebook::yoga::detail::getEnumData<YGAlign>(
return flags_.at<alignContentIdx>(); flags, alignContentOffset);
}
BitfieldRef<YGAlign> alignContent() { return {*this, alignContentOffset}; }
YGAlign alignItems() const {
return facebook::yoga::detail::getEnumData<YGAlign>(
flags, alignItemsOffset);
}
BitfieldRef<YGAlign> alignItems() { return {*this, alignItemsOffset}; }
YGAlign alignSelf() const {
return facebook::yoga::detail::getEnumData<YGAlign>(flags, alignSelfOffset);
}
BitfieldRef<YGAlign> alignSelf() { return {*this, alignSelfOffset}; }
YGPositionType positionType() const {
return facebook::yoga::detail::getEnumData<YGPositionType>(
flags, positionTypeOffset);
}
BitfieldRef<YGPositionType> positionType() {
return {*this, positionTypeOffset};
} }
YGAlign alignItems() const { return flags_.at<alignItemsIdx>(); } YGWrap flexWrap() const {
Flags::Ref<alignItemsIdx> alignItems() { return flags_.at<alignItemsIdx>(); } return facebook::yoga::detail::getEnumData<YGWrap>(flags, flexWrapOffset);
YGAlign alignSelf() const { return flags_.at<alignSelfIdx>(); }
Flags::Ref<alignSelfIdx> alignSelf() { return flags_.at<alignSelfIdx>(); }
YGPositionType positionType() const { return flags_.at<positionTypeIdx>(); }
Flags::Ref<positionTypeIdx> positionType() {
return flags_.at<positionTypeIdx>();
} }
BitfieldRef<YGWrap> flexWrap() { return {*this, flexWrapOffset}; }
YGWrap flexWrap() const { return flags_.at<flexWrapIdx>(); } YGOverflow overflow() const {
Flags::Ref<flexWrapIdx> flexWrap() { return flags_.at<flexWrapIdx>(); } return facebook::yoga::detail::getEnumData<YGOverflow>(
flags, overflowOffset);
}
BitfieldRef<YGOverflow> overflow() { return {*this, overflowOffset}; }
YGOverflow overflow() const { return flags_.at<overflowIdx>(); } YGDisplay display() const {
Flags::Ref<overflowIdx> overflow() { return flags_.at<overflowIdx>(); } return facebook::yoga::detail::getEnumData<YGDisplay>(flags, displayOffset);
}
YGDisplay display() const { return flags_.at<displayIdx>(); } BitfieldRef<YGDisplay> display() { return {*this, displayOffset}; }
Flags::Ref<displayIdx> display() { return flags_.at<displayIdx>(); }
YGFloatOptional flex() const { return flex_; } YGFloatOptional flex() const { return flex_; }
Ref<YGFloatOptional, &YGStyle::flex_> flex() { return {*this}; } Ref<YGFloatOptional, &YGStyle::flex_> flex() { return {*this}; }