/* * Copyright (c) Meta Platforms, Inc. and 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 #include #include #include #include namespace facebook::react { /** * Representation of CSS data type * https://www.w3.org/TR/css-values-4/#ratios */ struct CSSRatio { float numerator{}; float denominator{}; constexpr bool operator==(const CSSRatio& rhs) const = default; constexpr bool isDegenerate() const { // If either number in the is 0 or infinite, it represents a // degenerate ratio (and, generally, won’t do anything). // https://www.w3.org/TR/css-values-4/#ratios return numerator == 0.0f || numerator == std::numeric_limits::infinity() || denominator == 0.0f || denominator == std::numeric_limits::infinity(); } }; template <> struct CSSDataTypeParser { static constexpr auto consume(CSSSyntaxParser& parser) -> std::optional { // = [ / ]? // https://www.w3.org/TR/css-values-4/#ratio auto numerator = parseNextCSSValue(parser); if (!std::holds_alternative(numerator)) { return {}; } auto numeratorValue = std::get(numerator).value; if (numeratorValue >= 0) { auto denominator = peekNextCSSValue(parser, CSSDelimiter::Solidus); if (std::holds_alternative(denominator) && std::get(denominator).value >= 0) { parseNextCSSValue(parser, CSSDelimiter::Solidus); return CSSRatio{numeratorValue, std::get(denominator).value}; } return CSSRatio{numeratorValue, 1.0f}; } return {}; } }; static_assert(CSSDataType); } // namespace facebook::react