/* * Copyright (c) Facebook, Inc. and its 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 "BitUtils.h" #include "YGFloatOptional.h" #include "Yoga-internal.h" using namespace facebook::yoga; struct YGLayout { std::array position = {}; std::array dimensions = {{YGUndefined, YGUndefined}}; std::array margin = {}; std::array border = {}; std::array padding = {}; private: static constexpr size_t directionOffset = 0; static constexpr size_t didUseLegacyFlagOffset = directionOffset + facebook::yoga::detail::bitWidthFn(); static constexpr size_t doesLegacyStretchFlagAffectsLayoutOffset = didUseLegacyFlagOffset + 1; static constexpr size_t hadOverflowOffset = doesLegacyStretchFlagAffectsLayoutOffset + 1; uint8_t flags = 0; public: uint32_t computedFlexBasisGeneration = 0; YGFloatOptional computedFlexBasis = {}; // Instead of recomputing the entire layout every single time, we cache some // information to break early when nothing changed uint32_t generationCount = 0; YGDirection lastOwnerDirection = YGDirectionInherit; uint32_t nextCachedMeasurementsIndex = 0; std::array cachedMeasurements = {}; std::array measuredDimensions = {{YGUndefined, YGUndefined}}; YGCachedMeasurement cachedLayout = YGCachedMeasurement(); YGDirection direction() const { return facebook::yoga::detail::getEnumData( flags, directionOffset); } void setDirection(YGDirection direction) { facebook::yoga::detail::setEnumData( flags, directionOffset, direction); } bool didUseLegacyFlag() const { return facebook::yoga::detail::getBooleanData( flags, didUseLegacyFlagOffset); } void setDidUseLegacyFlag(bool val) { facebook::yoga::detail::setBooleanData(flags, didUseLegacyFlagOffset, val); } bool doesLegacyStretchFlagAffectsLayout() const { return facebook::yoga::detail::getBooleanData( flags, doesLegacyStretchFlagAffectsLayoutOffset); } void setDoesLegacyStretchFlagAffectsLayout(bool val) { facebook::yoga::detail::setBooleanData( flags, doesLegacyStretchFlagAffectsLayoutOffset, val); } bool hadOverflow() const { return facebook::yoga::detail::getBooleanData(flags, hadOverflowOffset); } void setHadOverflow(bool hadOverflow) { facebook::yoga::detail::setBooleanData( flags, hadOverflowOffset, hadOverflow); } bool operator==(YGLayout layout) const; bool operator!=(YGLayout layout) const { return !(*this == layout); } };