Adding error_or() to etl::expected

This commit is contained in:
Roland Reichwein 2026-04-26 20:44:41 +02:00
parent 8e153eece6
commit d28322daac
2 changed files with 164 additions and 0 deletions

View File

@ -604,6 +604,38 @@ namespace etl
return etl::move(etl::get<Error_Type>(storage));
}
//*******************************************
/// Get the error or a default value.
//*******************************************
template <typename G>
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if_t<etl::is_convertible<G, error_type>::value, error_type> error_or(G&& default_error) const&
{
if (has_value())
{
return static_cast<error_type>(etl::forward<G>(default_error));
}
else
{
return error();
}
}
//*******************************************
/// Get the error or a default value.
//*******************************************
template <typename G>
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if_t<etl::is_convertible<G, error_type>::value, error_type> error_or(G&& default_error) &&
{
if (has_value())
{
return static_cast<error_type>(etl::forward<G>(default_error));
}
else
{
return etl::move(error());
}
}
//*******************************************
/// Swap with another etl::expected.
//*******************************************
@ -661,6 +693,22 @@ namespace etl
{
return etl::get<Error_Type>(storage);
}
//*******************************************
/// Get the error or a default value.
//*******************************************
template <typename G>
error_type error_or(const G& default_error) const
{
if (has_value())
{
return static_cast<error_type>(default_error);
}
else
{
return error();
}
}
#endif
//*******************************************
@ -1099,6 +1147,38 @@ namespace etl
{
return etl::move(etl::get<Error_Type>(storage));
}
//*******************************************
/// Get the error or a default value.
//*******************************************
template <typename G>
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if_t<etl::is_convertible<G, error_type>::value, error_type> error_or(G&& default_error) const&
{
if (has_value())
{
return static_cast<error_type>(etl::forward<G>(default_error));
}
else
{
return error();
}
}
//*******************************************
/// Get the error or a default value.
//*******************************************
template <typename G>
ETL_NODISCARD ETL_CONSTEXPR14 etl::enable_if_t<etl::is_convertible<G, error_type>::value, error_type> error_or(G&& default_error) &&
{
if (has_value())
{
return static_cast<error_type>(etl::forward<G>(default_error));
}
else
{
return etl::move(error());
}
}
#else
//*******************************************
/// Returns the error
@ -1108,6 +1188,22 @@ namespace etl
{
return etl::get<Error_Type>(storage);
}
//*******************************************
/// Get the error or a default value.
//*******************************************
template <typename G>
error_type error_or(const G& default_error) const
{
if (has_value())
{
return static_cast<error_type>(default_error);
}
else
{
return error();
}
}
#endif
//*******************************************

View File

@ -1548,5 +1548,73 @@ namespace
CHECK_EQUAL(0, count);
}
//*************************************************************************
TEST(test_error_or_with_value)
{
etl::expected<int, Error> exp(42);
Error result = exp.error_or(Error("default"));
CHECK_EQUAL("default", result.e);
}
//*************************************************************************
TEST(test_error_or_with_error)
{
etl::expected<int, Error> exp(etl::unexpected<Error>(Error("real_error")));
Error result = exp.error_or(Error("default"));
CHECK_EQUAL("real_error", result.e);
}
//*************************************************************************
TEST(test_error_or_const_with_value)
{
const etl::expected<int, Error> exp(42);
Error result = exp.error_or(Error("default"));
CHECK_EQUAL("default", result.e);
}
//*************************************************************************
TEST(test_error_or_const_with_error)
{
const etl::expected<int, Error> exp(etl::unexpected<Error>(Error("real_error")));
Error result = exp.error_or(Error("default"));
CHECK_EQUAL("real_error", result.e);
}
//*************************************************************************
TEST(test_error_or_rvalue_with_value)
{
Error result = etl::expected<int, Error>(42).error_or(Error("default"));
CHECK_EQUAL("default", result.e);
}
//*************************************************************************
TEST(test_error_or_rvalue_with_error)
{
Error result = etl::expected<int, Error>(etl::unexpected<Error>(Error("real_error"))).error_or(Error("default"));
CHECK_EQUAL("real_error", result.e);
}
//*************************************************************************
TEST(test_error_or_void_value_with_value)
{
etl::expected<void, Error> exp;
Error result = exp.error_or(Error("default"));
CHECK_EQUAL("default", result.e);
}
//*************************************************************************
TEST(test_error_or_void_value_with_error)
{
etl::expected<void, Error> exp(etl::unexpected<Error>(Error("real_error")));
Error result = exp.error_or(Error("default"));
CHECK_EQUAL("real_error", result.e);
}
}
} // namespace