Skip to content

Commit e5ad0b6

Browse files
committed
Support TryDefault for std::optional<T>
When T satisfies Default.
1 parent 5519b39 commit e5ad0b6

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

sus/option/compat_option.h

+8
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ struct sus::ops::TryImpl<std::optional<T>> {
150150
constexpr static std::optional<T> from_output(Output t) {
151151
return std::optional<T>(std::in_place, ::sus::move(t));
152152
}
153+
154+
// Implements sus::ops::TryDefault for `std::optional<T>` if `T` satisfies
155+
// `Default`.
156+
constexpr static std::optional<T> from_default() noexcept
157+
requires(sus::construct::Default<T>)
158+
{
159+
return std::optional<T>(std::in_place, T());
160+
}
153161
};
154162

155163
} // namespace sus

sus/option/compat_option_unittest.cc

+5-2
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,11 @@ TEST(CompatOption, FromOptionalCopyWithConversion) {
269269

270270
TEST(CompatOption, Try) {
271271
static_assert(sus::ops::Try<std::optional<i32>>);
272-
EXPECT_EQ(sus::ops::try_is_success(std::optional<i32>(std::in_place, 1)), true);
273-
EXPECT_EQ(sus::ops::try_is_success(std::optional<i32>()), false);
272+
static_assert(sus::ops::TryDefault<std::optional<i32>>);
273+
static_assert(sus::ops::try_is_success(std::optional<i32>(std::in_place, 1)));
274+
static_assert(!sus::ops::try_is_success(std::optional<i32>()));
275+
static_assert(sus::ops::try_from_default<std::optional<i32>>() ==
276+
std::optional<i32>(0_i32));
274277
}
275278

276279
} // namespace

0 commit comments

Comments
 (0)