Skip to content
Merged
7 changes: 7 additions & 0 deletions include/beman/optional/optional.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
17 changes: 17 additions & 0 deletions tests/beman/optional/optional_range_support.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<beman::optional::optional<int>> v;

auto i = std::ranges::find(v, beman::optional::nullopt);

EXPECT_EQ(i, std::ranges::end(v));
}
Loading