diff --git a/tests/YGFloatOptionalTest.cpp b/tests/YGFloatOptionalTest.cpp index f2995747..3c73b0ba 100644 --- a/tests/YGFloatOptionalTest.cpp +++ b/tests/YGFloatOptionalTest.cpp @@ -10,11 +10,11 @@ #include #include -static const auto empty = YGFloatOptional{}; -static const auto zero = YGFloatOptional{0.0f}; -static const auto one = YGFloatOptional{1.0f}; -static const auto positive = YGFloatOptional{1234.5f}; -static const auto negative = YGFloatOptional{-9876.5f}; +constexpr auto empty = YGFloatOptional{}; +constexpr auto zero = YGFloatOptional{0.0f}; +constexpr auto one = YGFloatOptional{1.0f}; +constexpr auto positive = YGFloatOptional{1234.5f}; +constexpr auto negative = YGFloatOptional{-9876.5f}; TEST(YGFloatOptional, value) { ASSERT_EQ(zero.getValue(), 0.0f); diff --git a/yoga/YGFloatOptional.cpp b/yoga/YGFloatOptional.cpp index da7b8ce8..0bf89f29 100644 --- a/yoga/YGFloatOptional.cpp +++ b/yoga/YGFloatOptional.cpp @@ -7,23 +7,13 @@ #include "YGFloatOptional.h" #include #include -#include "Yoga.h" #include "Yoga-internal.h" +#include "Yoga.h" using namespace facebook; -YGFloatOptional::YGFloatOptional(float value) { - if (yoga::isUndefined(value)) { - isUndefined_ = true; - value_ = 0; - } else { - value_ = value; - isUndefined_ = false; - } -} - float YGFloatOptional::getValue() const { - if (isUndefined_) { + if (isUndefined()) { // Abort, accessing a value of an undefined float optional std::cerr << "Tried to get value of an undefined YGFloatOptional\n"; std::exit(EXIT_FAILURE); @@ -31,53 +21,38 @@ float YGFloatOptional::getValue() const { return value_; } -bool YGFloatOptional::operator==(const YGFloatOptional& op) const { - if (isUndefined_ == op.isUndefined()) { - return isUndefined_ || value_ == op.getValue(); - } - return false; +bool YGFloatOptional::operator==(YGFloatOptional op) const { + return value_ == op.value_ || (isUndefined() && op.isUndefined()); } -bool YGFloatOptional::operator!=(const YGFloatOptional& op) const { +bool YGFloatOptional::operator!=(YGFloatOptional op) const { return !(*this == op); } bool YGFloatOptional::operator==(float val) const { - if (yoga::isUndefined(val) == isUndefined_) { - return isUndefined_ || val == value_; - } - return false; + return value_ == val || (isUndefined() && yoga::isUndefined(val)); } bool YGFloatOptional::operator!=(float val) const { return !(*this == val); } -YGFloatOptional YGFloatOptional::operator+(const YGFloatOptional& op) const { - if (!isUndefined_ && !op.isUndefined_) { - return YGFloatOptional(value_ + op.value_); - } - return YGFloatOptional(); +YGFloatOptional YGFloatOptional::operator+(YGFloatOptional op) const { + return YGFloatOptional{value_ + op.value_}; } -bool YGFloatOptional::operator>(const YGFloatOptional& op) const { - if (isUndefined_ || op.isUndefined_) { - return false; - } +bool YGFloatOptional::operator>(YGFloatOptional op) const { return value_ > op.value_; } -bool YGFloatOptional::operator<(const YGFloatOptional& op) const { - if (isUndefined_ || op.isUndefined_) { - return false; - } +bool YGFloatOptional::operator<(YGFloatOptional op) const { return value_ < op.value_; } -bool YGFloatOptional::operator>=(const YGFloatOptional& op) const { - return *this == op || *this > op; +bool YGFloatOptional::operator>=(YGFloatOptional op) const { + return *this > op || *this == op; } -bool YGFloatOptional::operator<=(const YGFloatOptional& op) const { - return *this == op || *this < op; +bool YGFloatOptional::operator<=(YGFloatOptional op) const { + return *this < op || *this == op; } diff --git a/yoga/YGFloatOptional.h b/yoga/YGFloatOptional.h index 6f4af241..7b573d38 100644 --- a/yoga/YGFloatOptional.h +++ b/yoga/YGFloatOptional.h @@ -6,37 +6,33 @@ */ #pragma once +#include +#include + struct YGFloatOptional { private: - float value_ = 0; - bool isUndefined_ = true; + float value_ = std::numeric_limits::quiet_NaN(); public: - explicit YGFloatOptional(float value); - YGFloatOptional() = default; + explicit constexpr YGFloatOptional(float value) : value_(value) {} + constexpr YGFloatOptional() = default; // Program will terminate if the value of an undefined is accessed. Please // make sure to check if the optional is defined before calling this function. // To check if float optional is defined, use `isUndefined()`. float getValue() const; - // Sets the value of float optional, and thus isUndefined is assigned false. - void setValue(float val) { - value_ = val; - isUndefined_ = false; - } - bool isUndefined() const { - return isUndefined_; + return std::isnan(value_); } - YGFloatOptional operator+(const YGFloatOptional& op) const; - bool operator>(const YGFloatOptional& op) const; - bool operator<(const YGFloatOptional& op) const; - bool operator>=(const YGFloatOptional& op) const; - bool operator<=(const YGFloatOptional& op) const; - bool operator==(const YGFloatOptional& op) const; - bool operator!=(const YGFloatOptional& op) const; + YGFloatOptional operator+(YGFloatOptional op) const; + bool operator>(YGFloatOptional op) const; + bool operator<(YGFloatOptional op) const; + bool operator>=(YGFloatOptional op) const; + bool operator<=(YGFloatOptional op) const; + bool operator==(YGFloatOptional op) const; + bool operator!=(YGFloatOptional op) const; bool operator==(float val) const; bool operator!=(float val) const; diff --git a/yoga/YGNode.cpp b/yoga/YGNode.cpp index 1694692c..04c3c7f6 100644 --- a/yoga/YGNode.cpp +++ b/yoga/YGNode.cpp @@ -211,7 +211,7 @@ YGFloatOptional YGNode::relativePosition( YGFloatOptional trailingPosition = getTrailingPosition(axis, axisSize); if (!trailingPosition.isUndefined()) { - trailingPosition.setValue(-1 * trailingPosition.getValue()); + trailingPosition = YGFloatOptional{-1 * trailingPosition.getValue()}; } return trailingPosition; }