Remove enum count macros
Summary: @public Removes all `YG...Count` macros for enums and replaces them with `facebook::yoga::enums::count<YG...>()`. This removes the need to manually maintain enum counts. Same as D13597449, working around a defect in clang < 3.9 Reviewed By: amir-shalem Differential Revision: D13634622 fbshipit-source-id: 344dc70e167b0caf746fe396cedd200f54e52219
This commit is contained in:
committed by
Facebook Github Bot
parent
866bf101b2
commit
4840495d3f
@@ -10,7 +10,8 @@
|
|||||||
#include "Yoga.h"
|
#include "Yoga.h"
|
||||||
|
|
||||||
struct YGConfig {
|
struct YGConfig {
|
||||||
std::array<bool, YGExperimentalFeatureCount> experimentalFeatures = {};
|
std::array<bool, facebook::yoga::enums::count<YGExperimentalFeature>()>
|
||||||
|
experimentalFeatures = {};
|
||||||
bool useWebDefaults = false;
|
bool useWebDefaults = false;
|
||||||
bool useLegacyStretchBehaviour = false;
|
bool useLegacyStretchBehaviour = false;
|
||||||
bool shouldDiffLayoutWithoutLegacyStretchBehaviour = false;
|
bool shouldDiffLayoutWithoutLegacyStretchBehaviour = false;
|
||||||
|
@@ -8,14 +8,52 @@
|
|||||||
|
|
||||||
#include "YGMacros.h"
|
#include "YGMacros.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
namespace enums {
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
constexpr int count(); // can't use `= delete` due to a defect in clang < 3.9
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
template <int... xs>
|
||||||
|
constexpr int n() {
|
||||||
|
return sizeof...(xs);
|
||||||
|
}
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
} // namespace enums
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
||||||
|
#endif
|
||||||
|
|
||||||
#define YG_ENUM_DECL(NAME, ...) \
|
#define YG_ENUM_DECL(NAME, ...) \
|
||||||
typedef YG_ENUM_BEGIN(NAME){__VA_ARGS__} YG_ENUM_END(NAME); \
|
typedef YG_ENUM_BEGIN(NAME){__VA_ARGS__} YG_ENUM_END(NAME); \
|
||||||
WIN_EXPORT const char* NAME##ToString(NAME);
|
WIN_EXPORT const char* NAME##ToString(NAME);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define YG_ENUM_SEQ_DECL(NAME, ...) \
|
||||||
|
YG_ENUM_DECL(NAME, __VA_ARGS__) \
|
||||||
|
YG_EXTERN_C_END \
|
||||||
|
namespace facebook { \
|
||||||
|
namespace yoga { \
|
||||||
|
namespace enums { \
|
||||||
|
template <> \
|
||||||
|
constexpr int count<NAME>() { \
|
||||||
|
return detail::n<__VA_ARGS__>(); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
YG_EXTERN_C_BEGIN
|
||||||
|
#else
|
||||||
|
#define YG_ENUM_SEQ_DECL YG_ENUM_DECL
|
||||||
|
#endif
|
||||||
|
|
||||||
YG_EXTERN_C_BEGIN
|
YG_EXTERN_C_BEGIN
|
||||||
|
|
||||||
#define YGAlignCount 8
|
YG_ENUM_SEQ_DECL(
|
||||||
YG_ENUM_DECL(
|
|
||||||
YGAlign,
|
YGAlign,
|
||||||
YGAlignAuto,
|
YGAlignAuto,
|
||||||
YGAlignFlexStart,
|
YGAlignFlexStart,
|
||||||
@@ -26,17 +64,17 @@ YG_ENUM_DECL(
|
|||||||
YGAlignSpaceBetween,
|
YGAlignSpaceBetween,
|
||||||
YGAlignSpaceAround);
|
YGAlignSpaceAround);
|
||||||
|
|
||||||
#define YGDimensionCount 2
|
YG_ENUM_SEQ_DECL(YGDimension, YGDimensionWidth, YGDimensionHeight)
|
||||||
YG_ENUM_DECL(YGDimension, YGDimensionWidth, YGDimensionHeight)
|
|
||||||
|
|
||||||
#define YGDirectionCount 3
|
YG_ENUM_SEQ_DECL(
|
||||||
YG_ENUM_DECL(YGDirection, YGDirectionInherit, YGDirectionLTR, YGDirectionRTL)
|
YGDirection,
|
||||||
|
YGDirectionInherit,
|
||||||
|
YGDirectionLTR,
|
||||||
|
YGDirectionRTL)
|
||||||
|
|
||||||
#define YGDisplayCount 2
|
YG_ENUM_SEQ_DECL(YGDisplay, YGDisplayFlex, YGDisplayNone)
|
||||||
YG_ENUM_DECL(YGDisplay, YGDisplayFlex, YGDisplayNone)
|
|
||||||
|
|
||||||
#define YGEdgeCount 9
|
YG_ENUM_SEQ_DECL(
|
||||||
YG_ENUM_DECL(
|
|
||||||
YGEdge,
|
YGEdge,
|
||||||
YGEdgeLeft,
|
YGEdgeLeft,
|
||||||
YGEdgeTop,
|
YGEdgeTop,
|
||||||
@@ -48,19 +86,16 @@ YG_ENUM_DECL(
|
|||||||
YGEdgeVertical,
|
YGEdgeVertical,
|
||||||
YGEdgeAll)
|
YGEdgeAll)
|
||||||
|
|
||||||
#define YGExperimentalFeatureCount 1
|
YG_ENUM_SEQ_DECL(YGExperimentalFeature, YGExperimentalFeatureWebFlexBasis)
|
||||||
YG_ENUM_DECL(YGExperimentalFeature, YGExperimentalFeatureWebFlexBasis)
|
|
||||||
|
|
||||||
#define YGFlexDirectionCount 4
|
YG_ENUM_SEQ_DECL(
|
||||||
YG_ENUM_DECL(
|
|
||||||
YGFlexDirection,
|
YGFlexDirection,
|
||||||
YGFlexDirectionColumn,
|
YGFlexDirectionColumn,
|
||||||
YGFlexDirectionColumnReverse,
|
YGFlexDirectionColumnReverse,
|
||||||
YGFlexDirectionRow,
|
YGFlexDirectionRow,
|
||||||
YGFlexDirectionRowReverse)
|
YGFlexDirectionRowReverse)
|
||||||
|
|
||||||
#define YGJustifyCount 6
|
YG_ENUM_SEQ_DECL(
|
||||||
YG_ENUM_DECL(
|
|
||||||
YGJustify,
|
YGJustify,
|
||||||
YGJustifyFlexStart,
|
YGJustifyFlexStart,
|
||||||
YGJustifyCenter,
|
YGJustifyCenter,
|
||||||
@@ -69,8 +104,7 @@ YG_ENUM_DECL(
|
|||||||
YGJustifySpaceAround,
|
YGJustifySpaceAround,
|
||||||
YGJustifySpaceEvenly)
|
YGJustifySpaceEvenly)
|
||||||
|
|
||||||
#define YGLogLevelCount 6
|
YG_ENUM_SEQ_DECL(
|
||||||
YG_ENUM_DECL(
|
|
||||||
YGLogLevel,
|
YGLogLevel,
|
||||||
YGLogLevelError,
|
YGLogLevelError,
|
||||||
YGLogLevelWarn,
|
YGLogLevelWarn,
|
||||||
@@ -79,35 +113,38 @@ YG_ENUM_DECL(
|
|||||||
YGLogLevelVerbose,
|
YGLogLevelVerbose,
|
||||||
YGLogLevelFatal)
|
YGLogLevelFatal)
|
||||||
|
|
||||||
#define YGMeasureModeCount 3
|
YG_ENUM_SEQ_DECL(
|
||||||
YG_ENUM_DECL(
|
|
||||||
YGMeasureMode,
|
YGMeasureMode,
|
||||||
YGMeasureModeUndefined,
|
YGMeasureModeUndefined,
|
||||||
YGMeasureModeExactly,
|
YGMeasureModeExactly,
|
||||||
YGMeasureModeAtMost)
|
YGMeasureModeAtMost)
|
||||||
|
|
||||||
#define YGNodeTypeCount 2
|
YG_ENUM_SEQ_DECL(YGNodeType, YGNodeTypeDefault, YGNodeTypeText)
|
||||||
YG_ENUM_DECL(YGNodeType, YGNodeTypeDefault, YGNodeTypeText)
|
|
||||||
|
|
||||||
#define YGOverflowCount 3
|
YG_ENUM_SEQ_DECL(
|
||||||
YG_ENUM_DECL(YGOverflow, YGOverflowVisible, YGOverflowHidden, YGOverflowScroll)
|
YGOverflow,
|
||||||
|
YGOverflowVisible,
|
||||||
|
YGOverflowHidden,
|
||||||
|
YGOverflowScroll)
|
||||||
|
|
||||||
#define YGPositionTypeCount 2
|
YG_ENUM_SEQ_DECL(YGPositionType, YGPositionTypeRelative, YGPositionTypeAbsolute)
|
||||||
YG_ENUM_DECL(YGPositionType, YGPositionTypeRelative, YGPositionTypeAbsolute)
|
|
||||||
|
|
||||||
#define YGPrintOptionsCount 3
|
|
||||||
YG_ENUM_DECL(
|
YG_ENUM_DECL(
|
||||||
YGPrintOptions,
|
YGPrintOptions,
|
||||||
YGPrintOptionsLayout = 1,
|
YGPrintOptionsLayout = 1,
|
||||||
YGPrintOptionsStyle = 2,
|
YGPrintOptionsStyle = 2,
|
||||||
YGPrintOptionsChildren = 4)
|
YGPrintOptionsChildren = 4)
|
||||||
|
|
||||||
#define YGUnitCount 4
|
YG_ENUM_SEQ_DECL(
|
||||||
YG_ENUM_DECL(YGUnit, YGUnitUndefined, YGUnitPoint, YGUnitPercent, YGUnitAuto)
|
YGUnit,
|
||||||
|
YGUnitUndefined,
|
||||||
|
YGUnitPoint,
|
||||||
|
YGUnitPercent,
|
||||||
|
YGUnitAuto)
|
||||||
|
|
||||||
#define YGWrapCount 3
|
YG_ENUM_SEQ_DECL(YGWrap, YGWrapNoWrap, YGWrapWrap, YGWrapWrapReverse)
|
||||||
YG_ENUM_DECL(YGWrap, YGWrapNoWrap, YGWrapWrap, YGWrapWrapReverse)
|
|
||||||
|
|
||||||
YG_EXTERN_C_END
|
YG_EXTERN_C_END
|
||||||
|
|
||||||
#undef YG_ENUM_DECL
|
#undef YG_ENUM_DECL
|
||||||
|
#undef YG_ENUM_SEQ_DECL
|
||||||
|
@@ -313,7 +313,8 @@ YGValue YGNode::resolveFlexBasisPtr() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void YGNode::resolveDimension() {
|
void YGNode::resolveDimension() {
|
||||||
for (uint32_t dim = YGDimensionWidth; dim < YGDimensionCount; dim++) {
|
using namespace yoga;
|
||||||
|
for (int dim = YGDimensionWidth; dim < enums::count<YGDimension>(); dim++) {
|
||||||
if (!getStyle().maxDimensions[dim].isUndefined() &&
|
if (!getStyle().maxDimensions[dim].isUndefined() &&
|
||||||
YGValueEqual(
|
YGValueEqual(
|
||||||
getStyle().maxDimensions[dim], style_.minDimensions[dim])) {
|
getStyle().maxDimensions[dim], style_.minDimensions[dim])) {
|
||||||
|
@@ -20,8 +20,7 @@ static void indent(string& base, uint32_t level) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool areFourValuesEqual(
|
static bool areFourValuesEqual(const YGStyle::Edges& four) {
|
||||||
const facebook::yoga::detail::Values<YGEdgeCount>& four) {
|
|
||||||
return YGValueEqual(four[0], four[1]) && YGValueEqual(four[0], four[2]) &&
|
return YGValueEqual(four[0], four[1]) && YGValueEqual(four[0], four[2]) &&
|
||||||
YGValueEqual(four[0], four[3]);
|
YGValueEqual(four[0], four[3]);
|
||||||
}
|
}
|
||||||
@@ -86,7 +85,7 @@ static void appendNumberIfNotZero(
|
|||||||
static void appendEdges(
|
static void appendEdges(
|
||||||
string& base,
|
string& base,
|
||||||
const string& key,
|
const string& key,
|
||||||
const facebook::yoga::detail::Values<YGEdgeCount>& edges) {
|
const YGStyle::Edges& edges) {
|
||||||
if (areFourValuesEqual(edges)) {
|
if (areFourValuesEqual(edges)) {
|
||||||
appendNumberIfNotZero(base, key, edges[YGEdgeLeft]);
|
appendNumberIfNotZero(base, key, edges[YGEdgeLeft]);
|
||||||
} else {
|
} else {
|
||||||
@@ -100,7 +99,7 @@ static void appendEdges(
|
|||||||
static void appendEdgeIfNotUndefined(
|
static void appendEdgeIfNotUndefined(
|
||||||
string& base,
|
string& base,
|
||||||
const string& str,
|
const string& str,
|
||||||
const facebook::yoga::detail::Values<YGEdgeCount>& edges,
|
const YGStyle::Edges& edges,
|
||||||
const YGEdge edge) {
|
const YGEdge edge) {
|
||||||
appendNumberIfNotUndefined(
|
appendNumberIfNotUndefined(
|
||||||
base,
|
base,
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
#include <array>
|
#include <array>
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#include "CompactValue.h"
|
#include "CompactValue.h"
|
||||||
|
#include "YGEnums.h"
|
||||||
#include "YGFloatOptional.h"
|
#include "YGFloatOptional.h"
|
||||||
#include "Yoga-internal.h"
|
#include "Yoga-internal.h"
|
||||||
#include "Yoga.h"
|
#include "Yoga.h"
|
||||||
@@ -29,7 +30,8 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
using Dimensions = facebook::yoga::detail::Values<2>;
|
using Dimensions = facebook::yoga::detail::Values<2>;
|
||||||
using Edges = facebook::yoga::detail::Values<YGEdgeCount>;
|
using Edges =
|
||||||
|
facebook::yoga::detail::Values<facebook::yoga::enums::count<YGEdge>()>;
|
||||||
|
|
||||||
/* Some platforms don't support enum bitfields,
|
/* Some platforms don't support enum bitfields,
|
||||||
so please use BITFIELD_ENUM_SIZED(BITS_COUNT) */
|
so please use BITFIELD_ENUM_SIZED(BITS_COUNT) */
|
||||||
|
@@ -149,6 +149,7 @@ static const float kWebDefaultFlexShrink = 1.0f;
|
|||||||
extern bool YGFloatsEqual(const float a, const float b);
|
extern bool YGFloatsEqual(const float a, const float b);
|
||||||
extern bool YGValueEqual(const YGValue a, const YGValue b);
|
extern bool YGValueEqual(const YGValue a, const YGValue b);
|
||||||
extern facebook::yoga::detail::CompactValue YGComputedEdgeValue(
|
extern facebook::yoga::detail::CompactValue YGComputedEdgeValue(
|
||||||
const facebook::yoga::detail::Values<YGEdgeCount>& edges,
|
const facebook::yoga::detail::Values<
|
||||||
|
facebook::yoga::enums::count<YGEdge>()>& edges,
|
||||||
YGEdge edge,
|
YGEdge edge,
|
||||||
facebook::yoga::detail::CompactValue defaultValue);
|
facebook::yoga::detail::CompactValue defaultValue);
|
||||||
|
@@ -105,7 +105,7 @@ bool YGFloatIsUndefined(const float value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
detail::CompactValue YGComputedEdgeValue(
|
detail::CompactValue YGComputedEdgeValue(
|
||||||
const facebook::yoga::detail::Values<YGEdgeCount>& edges,
|
const YGStyle::Edges& edges,
|
||||||
YGEdge edge,
|
YGEdge edge,
|
||||||
detail::CompactValue defaultValue) {
|
detail::CompactValue defaultValue) {
|
||||||
if (!edges[edge].isUndefined()) {
|
if (!edges[edge].isUndefined()) {
|
||||||
@@ -3546,14 +3546,12 @@ static const char* YGSpacer(const unsigned long level) {
|
|||||||
static const char* YGMeasureModeName(
|
static const char* YGMeasureModeName(
|
||||||
const YGMeasureMode mode,
|
const YGMeasureMode mode,
|
||||||
const bool performLayout) {
|
const bool performLayout) {
|
||||||
const char* kMeasureModeNames[YGMeasureModeCount] = {
|
constexpr auto N = enums::count<YGMeasureMode>();
|
||||||
"UNDEFINED", "EXACTLY", "AT_MOST"};
|
const char* kMeasureModeNames[N] = {"UNDEFINED", "EXACTLY", "AT_MOST"};
|
||||||
const char* kLayoutModeNames[YGMeasureModeCount] = {"LAY_UNDEFINED",
|
const char* kLayoutModeNames[N] = {
|
||||||
"LAY_EXACTLY",
|
"LAY_UNDEFINED", "LAY_EXACTLY", "LAY_AT_MOST"};
|
||||||
"LAY_AT_"
|
|
||||||
"MOST"};
|
|
||||||
|
|
||||||
if (mode >= YGMeasureModeCount) {
|
if (mode >= N) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user