From f3fda59abd44fc34bbb07a6d6dc18cd23ab02c22 Mon Sep 17 00:00:00 2001 From: Max Wipfli Date: Tue, 1 Jun 2021 10:12:53 +0200 Subject: [PATCH] AK: Enable direct comparsion of Optional and T This patch introduces a new operator== to compare an Optional to its contained type directly. If the Optional does not contain a value, the comparison will always return false. This also adds a test case for the new behavior as well as comparison between Optional objects themselves. --- AK/Optional.h | 6 ++++++ Tests/AK/TestOptional.cpp | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/AK/Optional.h b/AK/Optional.h index 9a1b786da8..6b8a987006 100644 --- a/AK/Optional.h +++ b/AK/Optional.h @@ -100,6 +100,12 @@ public: return has_value() == other.has_value() && (!has_value() || value() == other.value()); } + template + ALWAYS_INLINE bool operator==(O const& other) const + { + return has_value() && value() == other; + } + ALWAYS_INLINE ~Optional() { clear(); diff --git a/Tests/AK/TestOptional.cpp b/Tests/AK/TestOptional.cpp index 583d11f0eb..427046eab8 100644 --- a/Tests/AK/TestOptional.cpp +++ b/Tests/AK/TestOptional.cpp @@ -53,3 +53,46 @@ TEST_CASE(short_notation) EXPECT_EQ(value->length(), 3u); EXPECT_EQ(*value, "foo"); } + +TEST_CASE(comparison_without_values) +{ + Optional opt0; + Optional opt1; + Optional opt2; + EXPECT_EQ(opt0, opt1); + EXPECT_EQ(opt0, opt2); +} + +TEST_CASE(comparison_with_values) +{ + Optional opt0; + Optional opt1 = "foo"; + Optional opt2 = "foo"; + Optional opt3 = "bar"; + EXPECT_NE(opt0, opt1); + EXPECT_EQ(opt1, opt2); + EXPECT_NE(opt1, opt3); +} + +TEST_CASE(comparison_to_underlying_types) +{ + Optional opt0; + EXPECT_NE(opt0, String()); + EXPECT_NE(opt0, "foo"); + + Optional opt1 = "foo"; + EXPECT_EQ(opt1, "foo"); + EXPECT_NE(opt1, "bar"); + EXPECT_EQ(opt1, String("foo")); +} + +TEST_CASE(comparison_with_numeric_types) +{ + Optional opt0; + EXPECT_NE(opt0, 0); + Optional opt1 = 7; + EXPECT_EQ(opt1, 7); + EXPECT_EQ(opt1, 7.0); + EXPECT_EQ(opt1, 7u); + EXPECT_NE(opt1, -2); +}