/* * 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 "Bitfield.h" #include "YGFloatOptional.h" #include "Yoga-internal.h" struct YGLayout { std::array position = {}; std::array dimensions = {{YGUndefined, YGUndefined}}; std::array margin = {}; std::array border = {}; std::array padding = {}; private: static constexpr size_t directionIdx = 0; static constexpr size_t didUseLegacyFlagIdx = 1; static constexpr size_t doesLegacyStretchFlagAffectsLayoutIdx = 2; static constexpr size_t hadOverflowIdx = 3; facebook::yoga::Bitfield flags_ = {YGDirectionInherit, false, false, false}; 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 = (YGDirection) -1; uint32_t nextCachedMeasurementsIndex = 0; std::array cachedMeasurements = {}; std::array measuredDimensions = {{YGUndefined, YGUndefined}}; YGCachedMeasurement cachedLayout = YGCachedMeasurement(); YGDirection direction() const { return flags_.at(); } decltype(flags_)::Ref direction() { return flags_.at(); } bool didUseLegacyFlag() const { return flags_.at(); } decltype(flags_)::Ref didUseLegacyFlag() { return flags_.at(); } bool doesLegacyStretchFlagAffectsLayout() const { return flags_.at(); } decltype(flags_)::Ref doesLegacyStretchFlagAffectsLayout() { return flags_.at(); } bool hadOverflow() const { return flags_.at(); } decltype(flags_)::Ref hadOverflow() { return flags_.at(); } bool operator==(YGLayout layout) const; bool operator!=(YGLayout layout) const { return !(*this == layout); } };