diff --git a/include/beman/optional/optional.hpp b/include/beman/optional/optional.hpp index 08c023fc..1fb6fb37 100644 --- a/include/beman/optional/optional.hpp +++ b/include/beman/optional/optional.hpp @@ -122,6 +122,13 @@ struct nullopt_t { * @details constexpr for nullopt_t to be literal. */ explicit constexpr nullopt_t(Tag) noexcept {} + + private: + friend constexpr bool operator==(nullopt_t, nullopt_t) noexcept { return true; } + + friend constexpr std::strong_ordering operator<=>(nullopt_t, nullopt_t) noexcept { + return std::strong_ordering::equivalent; + } }; /// Tag to disengage optional objects. diff --git a/tests/beman/optional/optional_range_support.test.cpp b/tests/beman/optional/optional_range_support.test.cpp index 67be0871..96c687d7 100644 --- a/tests/beman/optional/optional_range_support.test.cpp +++ b/tests/beman/optional/optional_range_support.test.cpp @@ -436,3 +436,20 @@ TEST(RangeSupportTest, PythagoreanTriples) { EXPECT_TRUE(constify(lambda())); EXPECT_TRUE(lambda()); } + +TEST(RangeSupportTest, NullOpt) { + beman::optional::nullopt_t t1{beman::optional::nullopt_t::Tag::tag}; + beman::optional::nullopt_t t2{beman::optional::nullopt_t::Tag::tag}; + EXPECT_EQ(t1, t2); + EXPECT_LE(t1, t2); + EXPECT_LE(t2, t1); + EXPECT_EQ(t1, beman::optional::nullopt); +} + +TEST(RangeSupportTest, FindNullopt) { + std::vector> v; + + auto i = std::ranges::find(v, beman::optional::nullopt); + + EXPECT_EQ(i, std::ranges::end(v)); +}