Eliminate YGFloatOptional::getValue()

Summary:
@public

`YGFloatOptional::getValue()` has the unfortunate property of calling `std::exit` if the wrapped value is undefined.
That forces `x.isUndefined() ? fallback : x.getValue()` as access pattern.

Here, we replace that by introducing `YGFloatOptional::orElse(float)` which encapsulates that pattern. Other additions are `orElseGet([] { … })` and some extra operators.

Reviewed By: SidharthGuglani

Differential Revision: D13209152

fbshipit-source-id: 4e5deceaaaaf8eaed44846a8c152cc8b235e815c
This commit is contained in:
David Aurelio
2018-12-06 07:35:10 -08:00
committed by Facebook Github Bot
parent ed3b54b603
commit 50ec35575f
8 changed files with 141 additions and 134 deletions

View File

@@ -6,7 +6,8 @@
*/
#include <yoga/YGFloatOptional.h>
#include <gtest/gtest.h>
#include <yoga/YGValue.h>
#include <yoga/YGFloatOptional.h>
#include <yoga/Yoga.h>
constexpr auto empty = YGFloatOptional{};
constexpr auto zero = YGFloatOptional{0.0f};
@@ -15,9 +16,10 @@ constexpr auto positive = YGFloatOptional{1234.5f};
constexpr auto negative = YGFloatOptional{-9876.5f};
TEST(YGFloatOptional, value) {
ASSERT_EQ(zero.getValue(), 0.0f);
ASSERT_EQ(positive.getValue(), 1234.5f);
ASSERT_EQ(negative.getValue(), -9876.5f);
ASSERT_EQ(zero.unwrap(), 0.0f);
ASSERT_EQ(positive.unwrap(), 1234.5f);
ASSERT_EQ(negative.unwrap(), -9876.5f);
ASSERT_TRUE(YGFloatIsUndefined(empty.unwrap()));
ASSERT_TRUE(empty.isUndefined());
ASSERT_FALSE(zero.isUndefined());
@@ -41,7 +43,7 @@ TEST(YGFloatOptional, equality) {
ASSERT_FALSE(one == positive);
ASSERT_TRUE(negative == negative);
ASSERT_TRUE(negative == negative.getValue());
ASSERT_TRUE(negative == negative.unwrap());
ASSERT_FALSE(negative == zero);
}
@@ -62,7 +64,7 @@ TEST(YGFloatOptional, inequality) {
ASSERT_TRUE(one != positive);
ASSERT_FALSE(negative != negative);
ASSERT_FALSE(negative != negative.getValue());
ASSERT_FALSE(negative != negative.unwrap());
ASSERT_TRUE(negative != zero);
}
@@ -72,6 +74,10 @@ TEST(YGFloatOptional, greater) {
ASSERT_FALSE(empty > one);
ASSERT_FALSE(empty > positive);
ASSERT_FALSE(empty > negative);
ASSERT_FALSE(zero > empty);
ASSERT_FALSE(one > empty);
ASSERT_FALSE(positive > empty);
ASSERT_FALSE(negative > empty);
ASSERT_TRUE(zero > negative);
ASSERT_FALSE(zero > zero);
@@ -93,6 +99,10 @@ TEST(YGFloatOptional, lower) {
ASSERT_FALSE(empty < one);
ASSERT_FALSE(empty < positive);
ASSERT_FALSE(empty < negative);
ASSERT_FALSE(zero < empty);
ASSERT_FALSE(one < empty);
ASSERT_FALSE(positive < empty);
ASSERT_FALSE(negative < empty);
ASSERT_TRUE(negative < zero);
ASSERT_FALSE(zero < zero);
@@ -156,8 +166,40 @@ TEST(YGFloatOptional, addition) {
ASSERT_EQ(zero + one, one);
ASSERT_EQ(
negative + positive,
YGFloatOptional{negative.getValue() + positive.getValue()});
YGFloatOptional{negative.unwrap() + positive.unwrap()});
ASSERT_EQ(empty + zero, empty);
ASSERT_EQ(empty + empty, empty);
ASSERT_EQ(negative + empty, empty);
}
TEST(YGFloatOptional, subtraction) {
ASSERT_EQ(zero - one, YGFloatOptional{-1.0f});
ASSERT_EQ(
negative - positive,
YGFloatOptional{negative.unwrap() - positive.unwrap()});
ASSERT_EQ(empty - zero, empty);
ASSERT_EQ(empty - empty, empty);
ASSERT_EQ(negative - empty, empty);
}
TEST(YGFloatOptional, unary_minus) {
ASSERT_EQ(-zero, zero);
ASSERT_EQ(-negative, YGFloatOptional{-negative.unwrap()});
ASSERT_EQ(-positive, YGFloatOptional{-positive.unwrap()});
ASSERT_EQ(-empty, empty);
}
TEST(YGFloatOptional, orElse) {
ASSERT_EQ(empty.orElse(1.23f), 1.23f);
ASSERT_TRUE(YGFloatIsUndefined(empty.orElse(YGUndefined)));
ASSERT_EQ(one.orElse(1.23f), 1.0f);
}
TEST(YGFloatOptional, orElseGet) {
auto x = empty.orElseGet([] { return 1.23f; });
ASSERT_EQ(x, 1.23f);
ASSERT_TRUE(YGFloatIsUndefined(empty.orElseGet([] { return YGUndefined; })));
auto y = one.orElseGet([] { return 1.23f; });
ASSERT_EQ(y, 1.0f);
}