22 template<
class HandleError>
25 if (
LIKELY(!failure_detection::result(ret,
reinterpret_cast<fn_ret_code>(failure_code::value)))) {
33 template<
class FailureTraits,
class ...Args>
35 syscall::
traits_base<FailureTraits, Args...>::
report_error(
int err,
char const *file_name,
unsigned line_num,
char const *fn_name,
tchar const *
const rev_info,
tchar const *
const err_msg, fn_ret_code (*fn)(Args...), Args ...args)
noexcept(
false) {
41 fun.add_args(info::function::argument(exception_t::thread_traits::demangle_name(
typeid(args)).begin(), args)...);
42 throw exception_t(err_msg, std::move(fun), info::revision(rev_info, file_name), err);
45 template<
class FailureTraits,
class ...Args>
48 return base_t::report_error(err, file_name, line_num, fn_name, rev_info, err_msg, fn, args...);
51 template<
class CaseStatements,
class FailureTraits,
class ...Args>
53 syscall::
switch_traits<CaseStatements, FailureTraits, Args...>::
select_error(
int err,
char const *file_name,
unsigned line_num,
char const *fn_name,
tchar const *
const rev_info,
tchar const *
const err_msg, fn_ret_code (*fn)(Args...), Args ...args) {
55 num_statements=std::tuple_size<std::decay_t<case_statements>>::value
57 BOOST_MPL_ASSERT_RELATION(num_statements, >, 1);
60 [err, file_name, line_num, fn_name, rev_info, err_msg, fn, args...]() {
61 base_t::report_error(err, file_name, line_num, fn_name, rev_info, err_msg, fn, args...);
67 template<
class,
class ...>
class Traits,
68 template<
class,
template<
class>
class,
template<
class>
class>
class FailureTraits,
69 template<
class>
class FailureCode,
70 template<
class>
class FailureDetection,
77 using traits_t=Traits<
85 if constexpr (
std::is_same<FnReturnType,
void>::value) {
86 fn(
static_cast<FnArgs>(args)...);
88 auto ret=fn(
static_cast<FnArgs>(args)...);
89 return traits_t::report(
91 std::bind(traits_t::select_error, errno, file_name, line_num, fn_name, rev_info, err_msg, fn, args...)