mirror of
https://github.com/Naios/continuable.git
synced 2026-02-09 03:06:41 +08:00
Split the logic for exception forwarding
This commit is contained in:
parent
82dd47b463
commit
ca1c0bf1da
@ -409,44 +409,59 @@ struct result_handler_base<handle_results::yes, Base,
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
inline auto make_exception_invoker(
|
inline auto make_exception_invoker(
|
||||||
std::integral_constant<handle_errors, handle_errors::plain>) noexcept {
|
std::integral_constant<handle_errors, handle_errors::plain>) noexcept {
|
||||||
return [](auto&& callback, exception_t&& error) {
|
return;
|
||||||
// Errors are not partial invoked
|
|
||||||
// NOLINTNEXTLINE(hicpp-move-const-arg, performance-move-const-arg)
|
|
||||||
std::forward<decltype(callback)>(callback)(std::move(error));
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
inline auto make_exception_invoker(
|
inline auto make_exception_invoker(
|
||||||
std::integral_constant<handle_errors, handle_errors::forward>) noexcept {
|
std::integral_constant<handle_errors, handle_errors::forward>) noexcept {
|
||||||
return [](auto&& callback, exception_t&& error) {
|
return;
|
||||||
// Errors are not partial invoked
|
|
||||||
std::forward<decltype(callback)>(callback)(
|
|
||||||
exception_arg_t{},
|
|
||||||
// NOLINTNEXTLINE(hicpp-move-const-arg, performance-move-const-arg)
|
|
||||||
std::move(error));
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
template <handle_errors HandleErrors /* = plain or forward*/, typename Base>
|
template <handle_errors HandleErrors, typename Base>
|
||||||
struct error_handler_base {
|
struct error_handler_base;
|
||||||
void operator()(exception_arg_t, exception_t error) && {
|
|
||||||
// Just invoke the error handler, cancel the calling hierarchy after
|
|
||||||
auto invoker = make_exception_invoker(
|
|
||||||
std::integral_constant<handle_errors, HandleErrors>{});
|
|
||||||
|
|
||||||
// Invoke the error handler
|
|
||||||
packed_dispatch(
|
|
||||||
std::move(static_cast<Base*>(this)->executor_), std::move(invoker),
|
|
||||||
std::move(static_cast<Base*>(this)->callback_), std::move(error));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
template <typename Base>
|
template <typename Base>
|
||||||
struct error_handler_base<handle_errors::no, Base> {
|
struct error_handler_base<handle_errors::no, Base> {
|
||||||
/// The operator which is called when an error occurred
|
/// The operator which is called when an error occurred
|
||||||
void operator()(exception_arg_t tag, exception_t error) && {
|
void operator()(exception_arg_t tag, exception_t exception) && {
|
||||||
// Forward the error to the next callback
|
// Forward the error to the next callback
|
||||||
std::move(static_cast<Base*>(this)->next_callback_)(tag, std::move(error));
|
std::move(static_cast<Base*>(this)->next_callback_)(tag,
|
||||||
|
std::move(exception));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
template <typename Base>
|
||||||
|
struct error_handler_base<handle_errors::plain, Base> {
|
||||||
|
/// The operator which is called when an error occurred
|
||||||
|
void operator()(exception_arg_t, exception_t exception) && {
|
||||||
|
// Invoke the error handler
|
||||||
|
packed_dispatch(
|
||||||
|
std::move(static_cast<Base*>(this)->executor_),
|
||||||
|
[](auto&& callback, exception_t exception) {
|
||||||
|
// Errors are not partial invoked
|
||||||
|
// NOLINTNEXTLINE(hicpp-move-const-arg, performance-move-const-arg)
|
||||||
|
std::forward<decltype(callback)>(callback)(std::move(exception));
|
||||||
|
},
|
||||||
|
std::move(static_cast<Base*>(this)->callback_), std::move(exception));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
template <typename Base>
|
||||||
|
struct error_handler_base<handle_errors::forward, Base> {
|
||||||
|
/// The operator which is called when an error occurred
|
||||||
|
void operator()(exception_arg_t, exception_t exception) && {
|
||||||
|
// Invoke the error handler
|
||||||
|
packed_dispatch(
|
||||||
|
std::move(static_cast<Base*>(this)->executor_),
|
||||||
|
[](auto&& callback, exception_t exception) {
|
||||||
|
// Errors are not partial invoked
|
||||||
|
std::forward<decltype(callback)>(callback)(
|
||||||
|
exception_arg_t{},
|
||||||
|
// NOLINTNEXTLINE(hicpp-move-const-arg,
|
||||||
|
// performance-move-const-arg)
|
||||||
|
std::move(exception));
|
||||||
|
},
|
||||||
|
std::move(static_cast<Base*>(this)->callback_), std::move(exception));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace proto
|
} // namespace proto
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user