forked from TartanLlama/expected
Fix #33
This commit is contained in:
@@ -73,3 +73,10 @@ TEST_CASE("Issue 31", "[issues.31]") {
|
|||||||
tl::expected< void, std::string > result2 = result;
|
tl::expected< void, std::string > result2 = result;
|
||||||
result2 = result;
|
result2 = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Issue 33", "[issues.33]") {
|
||||||
|
tl::expected<void, int> res {tl::unexpect, 0};
|
||||||
|
REQUIRE(!res);
|
||||||
|
res = res.map_error([](auto i) { return 42; });
|
||||||
|
REQUIRE(res.error() == 42);
|
||||||
|
}
|
||||||
|
@@ -2053,6 +2053,7 @@ auto expected_map_impl(Exp &&exp, F &&f) -> expected<void, err_t<Exp>> {
|
|||||||
#if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \
|
#if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \
|
||||||
!defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55)
|
!defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55)
|
||||||
template <class Exp, class F,
|
template <class Exp, class F,
|
||||||
|
detail::enable_if_t<!std::is_void<exp_t<Exp>>::value> * = nullptr,
|
||||||
class Ret = decltype(detail::invoke(std::declval<F>(),
|
class Ret = decltype(detail::invoke(std::declval<F>(),
|
||||||
std::declval<Exp>().error())),
|
std::declval<Exp>().error())),
|
||||||
detail::enable_if_t<!std::is_void<Ret>::value> * = nullptr>
|
detail::enable_if_t<!std::is_void<Ret>::value> * = nullptr>
|
||||||
@@ -2064,6 +2065,7 @@ constexpr auto map_error_impl(Exp &&exp, F &&f) {
|
|||||||
std::forward<Exp>(exp).error()));
|
std::forward<Exp>(exp).error()));
|
||||||
}
|
}
|
||||||
template <class Exp, class F,
|
template <class Exp, class F,
|
||||||
|
detail::enable_if_t<!std::is_void<exp_t<Exp>>::value> * = nullptr,
|
||||||
class Ret = decltype(detail::invoke(std::declval<F>(),
|
class Ret = decltype(detail::invoke(std::declval<F>(),
|
||||||
std::declval<Exp>().error())),
|
std::declval<Exp>().error())),
|
||||||
detail::enable_if_t<std::is_void<Ret>::value> * = nullptr>
|
detail::enable_if_t<std::is_void<Ret>::value> * = nullptr>
|
||||||
@@ -2076,8 +2078,35 @@ auto map_error_impl(Exp &&exp, F &&f) {
|
|||||||
detail::invoke(std::forward<F>(f), std::forward<Exp>(exp).error());
|
detail::invoke(std::forward<F>(f), std::forward<Exp>(exp).error());
|
||||||
return result(unexpect, monostate{});
|
return result(unexpect, monostate{});
|
||||||
}
|
}
|
||||||
|
template <class Exp, class F,
|
||||||
|
detail::enable_if_t<std::is_void<exp_t<Exp>>::value> * = nullptr,
|
||||||
|
class Ret = decltype(detail::invoke(std::declval<F>(),
|
||||||
|
std::declval<Exp>().error())),
|
||||||
|
detail::enable_if_t<!std::is_void<Ret>::value> * = nullptr>
|
||||||
|
constexpr auto map_error_impl(Exp &&exp, F &&f) {
|
||||||
|
using result = expected<exp_t<Exp>, detail::decay_t<Ret>>;
|
||||||
|
return exp.has_value()
|
||||||
|
? result()
|
||||||
|
: result(unexpect, detail::invoke(std::forward<F>(f),
|
||||||
|
std::forward<Exp>(exp).error()));
|
||||||
|
}
|
||||||
|
template <class Exp, class F,
|
||||||
|
detail::enable_if_t<std::is_void<exp_t<Exp>>::value> * = nullptr,
|
||||||
|
class Ret = decltype(detail::invoke(std::declval<F>(),
|
||||||
|
std::declval<Exp>().error())),
|
||||||
|
detail::enable_if_t<std::is_void<Ret>::value> * = nullptr>
|
||||||
|
auto map_error_impl(Exp &&exp, F &&f) {
|
||||||
|
using result = expected<exp_t<Exp>, monostate>;
|
||||||
|
if (exp.has_value()) {
|
||||||
|
return result();
|
||||||
|
}
|
||||||
|
|
||||||
|
detail::invoke(std::forward<F>(f), std::forward<Exp>(exp).error());
|
||||||
|
return result(unexpect, monostate{});
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
template <class Exp, class F,
|
template <class Exp, class F,
|
||||||
|
detail::enable_if_t<!std::is_void<exp_t<Exp>>::value> * = nullptr,
|
||||||
class Ret = decltype(detail::invoke(std::declval<F>(),
|
class Ret = decltype(detail::invoke(std::declval<F>(),
|
||||||
std::declval<Exp>().error())),
|
std::declval<Exp>().error())),
|
||||||
detail::enable_if_t<!std::is_void<Ret>::value> * = nullptr>
|
detail::enable_if_t<!std::is_void<Ret>::value> * = nullptr>
|
||||||
@@ -2092,6 +2121,7 @@ constexpr auto map_error_impl(Exp &&exp, F &&f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class Exp, class F,
|
template <class Exp, class F,
|
||||||
|
detail::enable_if_t<!std::is_void<exp_t<Exp>>::value> * = nullptr,
|
||||||
class Ret = decltype(detail::invoke(std::declval<F>(),
|
class Ret = decltype(detail::invoke(std::declval<F>(),
|
||||||
std::declval<Exp>().error())),
|
std::declval<Exp>().error())),
|
||||||
detail::enable_if_t<std::is_void<Ret>::value> * = nullptr>
|
detail::enable_if_t<std::is_void<Ret>::value> * = nullptr>
|
||||||
@@ -2104,6 +2134,36 @@ auto map_error_impl(Exp &&exp, F &&f) -> expected<exp_t<Exp>, monostate> {
|
|||||||
detail::invoke(std::forward<F>(f), std::forward<Exp>(exp).error());
|
detail::invoke(std::forward<F>(f), std::forward<Exp>(exp).error());
|
||||||
return result(unexpect, monostate{});
|
return result(unexpect, monostate{});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class Exp, class F,
|
||||||
|
detail::enable_if_t<std::is_void<exp_t<Exp>>::value> * = nullptr,
|
||||||
|
class Ret = decltype(detail::invoke(std::declval<F>(),
|
||||||
|
std::declval<Exp>().error())),
|
||||||
|
detail::enable_if_t<!std::is_void<Ret>::value> * = nullptr>
|
||||||
|
constexpr auto map_error_impl(Exp &&exp, F &&f)
|
||||||
|
-> expected<exp_t<Exp>, detail::decay_t<Ret>> {
|
||||||
|
using result = expected<exp_t<Exp>, detail::decay_t<Ret>>;
|
||||||
|
|
||||||
|
return exp.has_value()
|
||||||
|
? result()
|
||||||
|
: result(unexpect, detail::invoke(std::forward<F>(f),
|
||||||
|
std::forward<Exp>(exp).error()));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Exp, class F,
|
||||||
|
detail::enable_if_t<std::is_void<exp_t<Exp>>::value> * = nullptr,
|
||||||
|
class Ret = decltype(detail::invoke(std::declval<F>(),
|
||||||
|
std::declval<Exp>().error())),
|
||||||
|
detail::enable_if_t<std::is_void<Ret>::value> * = nullptr>
|
||||||
|
auto map_error_impl(Exp &&exp, F &&f) -> expected<exp_t<Exp>, monostate> {
|
||||||
|
using result = expected<exp_t<Exp>, monostate>;
|
||||||
|
if (exp.has_value()) {
|
||||||
|
return result();
|
||||||
|
}
|
||||||
|
|
||||||
|
detail::invoke(std::forward<F>(f), std::forward<Exp>(exp).error());
|
||||||
|
return result(unexpect, monostate{});
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TL_EXPECTED_CXX14
|
#ifdef TL_EXPECTED_CXX14
|
||||||
|
Reference in New Issue
Block a user