1/*
2 * Copyright (C) 2016 The Qt Company Ltd.
3 * Copyright (c) Meta Platforms, Inc. and affiliates.
4 *
5 * SPDX-License-Identifier: MIT
6 */
7
8#pragma once
9
10#include <cmath>
11#include <limits>
12#include "Yoga-internal.h"
13
14struct YGFloatOptional {
15private:
16 float value_ = std::numeric_limits<float>::quiet_NaN();
17
18public:
19 explicit constexpr YGFloatOptional(float value) : value_(value) {}
20 constexpr YGFloatOptional() = default;
21
22 // returns the wrapped value, or a value x with YGIsUndefined(x) == true
23 constexpr float unwrap() const { return value_; }
24
25 bool isUndefined() const { return std::isnan(x: value_); }
26};
27
28// operators take YGFloatOptional by value, as it is a 32bit value
29
30inline bool operator==(YGFloatOptional lhs, YGFloatOptional rhs) {
31 return lhs.unwrap() == rhs.unwrap() ||
32 (lhs.isUndefined() && rhs.isUndefined());
33}
34inline bool operator!=(YGFloatOptional lhs, YGFloatOptional rhs) {
35 return !(lhs == rhs);
36}
37
38inline bool operator==(YGFloatOptional lhs, float rhs) {
39 return lhs == YGFloatOptional{rhs};
40}
41inline bool operator!=(YGFloatOptional lhs, float rhs) {
42 return !(lhs == rhs);
43}
44
45inline bool operator==(float lhs, YGFloatOptional rhs) {
46 return rhs == lhs;
47}
48inline bool operator!=(float lhs, YGFloatOptional rhs) {
49 return !(lhs == rhs);
50}
51
52inline YGFloatOptional operator+(YGFloatOptional lhs, YGFloatOptional rhs) {
53 return YGFloatOptional{lhs.unwrap() + rhs.unwrap()};
54}
55
56inline bool operator>(YGFloatOptional lhs, YGFloatOptional rhs) {
57 return lhs.unwrap() > rhs.unwrap();
58}
59
60inline bool operator<(YGFloatOptional lhs, YGFloatOptional rhs) {
61 return lhs.unwrap() < rhs.unwrap();
62}
63
64inline bool operator>=(YGFloatOptional lhs, YGFloatOptional rhs) {
65 return lhs > rhs || lhs == rhs;
66}
67
68inline bool operator<=(YGFloatOptional lhs, YGFloatOptional rhs) {
69 return lhs < rhs || lhs == rhs;
70}
71

source code of qtdeclarative/src/3rdparty/yoga/YGFloatOptional.h