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); +}