From f6415889ca72fc7df00e3fa3cdc0fdb9f28a4d39 Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Tue, 18 Dec 2018 08:11:25 -0800 Subject: [PATCH] Use bitfields for `YGLayout` and `YGNode` Summary: @public Further heap size reductions by using bitfields in `YGLayout` and `YGNode`. Reviewed By: SidharthGuglani Differential Revision: D13466325 fbshipit-source-id: ddcef0a1b3822e7449fe485d99c920d54139c893 --- yoga/YGLayout.h | 14 +++++++++----- yoga/YGNode.h | 14 +++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/yoga/YGLayout.h b/yoga/YGLayout.h index 2a0215d3..94a92adf 100644 --- a/yoga/YGLayout.h +++ b/yoga/YGLayout.h @@ -17,11 +17,13 @@ struct YGLayout { std::array margin = {}; std::array border = {}; std::array padding = {}; - YGDirection direction = YGDirectionInherit; + YGDirection direction : 2; + bool didUseLegacyFlag : 1; + bool doesLegacyStretchFlagAffectsLayout : 1; + bool hadOverflow : 1; uint32_t computedFlexBasisGeneration = 0; YGFloatOptional computedFlexBasis = {}; - bool hadOverflow = false; // Instead of recomputing the entire layout every single time, we // cache some information to break early when nothing changed @@ -34,10 +36,12 @@ struct YGLayout { std::array measuredDimensions = kYGDefaultDimensionValues; YGCachedMeasurement cachedLayout = YGCachedMeasurement(); - bool didUseLegacyFlag = false; - bool doesLegacyStretchFlagAffectsLayout = false; - YGLayout() = default; + YGLayout() + : direction(YGDirectionInherit), + didUseLegacyFlag(false), + doesLegacyStretchFlagAffectsLayout(false), + hadOverflow(false) {} bool operator==(YGLayout layout) const; bool operator!=(YGLayout layout) const { diff --git a/yoga/YGNode.h b/yoga/YGNode.h index 57312812..2c00ec75 100644 --- a/yoga/YGNode.h +++ b/yoga/YGNode.h @@ -15,9 +15,10 @@ struct YGNode { private: void* context_ = nullptr; YGPrintFunc print_ = nullptr; - bool hasNewLayout_ = true; - bool isReferenceBaseline_ = false; - YGNodeType nodeType_ = YGNodeTypeDefault; + bool hasNewLayout_ : 1; + bool isReferenceBaseline_ : 1; + bool isDirty_ : 1; + YGNodeType nodeType_ : 1; YGMeasureFunc measure_ = nullptr; YGBaselineFunc baseline_ = nullptr; YGDirtiedFunc dirtied_ = nullptr; @@ -27,7 +28,6 @@ struct YGNode { YGNodeRef owner_ = nullptr; YGVector children_ = {}; YGConfigRef config_ = nullptr; - bool isDirty_ = false; std::array resolvedDimensions_ = { {YGValueUndefined, YGValueUndefined}}; @@ -36,7 +36,11 @@ struct YGNode { const float axisSize) const; public: - YGNode() = default; + YGNode() + : hasNewLayout_(true), + isReferenceBaseline_(false), + isDirty_(false), + nodeType_(YGNodeTypeDefault) {} ~YGNode() = default; // cleanup of owner/children relationships in YGNodeFree explicit YGNode(const YGConfigRef newConfig) : config_(newConfig){}; YGNode(const YGNode& node) = default;