1 #ifndef LIBJMMCG_CORE_SYSCALL_WRAPPER_HPP
2 #define LIBJMMCG_CORE_SYSCALL_WRAPPER_HPP
33 template<
class ReturnType>
37 struct failure_code<ssize_t> {
38 static inline constexpr ssize_t
value=0;
41 struct failure_code<
int> {
42 static inline constexpr int value=-1;
45 struct failure_code<
void*> {
46 static inline constexpr void *
value=
nullptr;
49 struct failure_code<sighandler_t> {
50 static inline const sighandler_t
value=
reinterpret_cast<sighandler_t>(-1);
53 struct failure_code<
void> {
56 template<
class ReturnType>
57 struct failure_detection;
60 struct failure_detection<ssize_t> {
61 static constexpr bool result(ssize_t ret_code, ssize_t fv)
noexcept(
true) {
66 struct failure_detection<
int> {
67 static constexpr bool result(
int ret_code,
int fv)
noexcept(
true) {
72 struct failure_detection<
void *> {
73 static constexpr bool result(
void *ret_code,
void *fv)
noexcept(
true) {
78 struct failure_detection<sighandler_t> {
79 static constexpr bool result(sighandler_t ret_code, sighandler_t fv)
noexcept(
true) {
85 struct failure_detection<
void> {
86 static constexpr void result()
noexcept(
true) {
90 template<
std::size_t N,
class CaseStatements>
92 using type=
typename std::tuple_element<N, CaseStatements>::type;
94 template<
class ReportError>
95 static auto result(
int v, ReportError &&report_error)
noexcept(
false) {
97 return type::statement();
99 return unroller<N-1, CaseStatements>::result(v,
std::move(report_error));
103 template<
class CaseStatements>
105 using type=
typename std::tuple_element<0, CaseStatements>::type;
107 template<
class ReportError>
108 static auto result(
int v, ReportError &&report_error)
noexcept(
false ) {
109 if (v==type::label) {
110 return type::statement();
113 return decltype(type::statement())();
131 template<
class ...CaseLabels>
133 using case_labels=
std::tuple<CaseLabels...>;
138 template<
class>
class FailureCode,
139 template<
class>
class FailureDetection
141 using fn_ret_code=ReturnType;
142 using failure_code=FailureCode<fn_ret_code>;
143 using failure_detection=FailureDetection<fn_ret_code>;
153 using failure_traits=FailureTraits;
154 using fn_ret_code=
typename failure_traits::fn_ret_code;
155 using failure_detection=
typename failure_traits::failure_detection;
156 using failure_code=
typename failure_traits::failure_code;
159 template<
class HandleError>
160 static auto report(fn_ret_code ret, HandleError &&handle_error)
noexcept(
false);
163 static void 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)
NEVER_INLINE;
173 using typename base_t::fn_ret_code;
174 using typename base_t::failure_detection;
175 using typename base_t::failure_code;
178 static auto 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);
183 class CaseStatements,
189 using typename base_t::fn_ret_code;
190 using typename base_t::failure_detection;
191 using typename base_t::failure_code;
203 using case_statements=
typename CaseStatements::case_labels;
205 static constexpr auto 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);
221 template<
class,
class ...>
class Traits,
222 template<
class,
template<
class>
class,
template<
class>
class>
class FailureTraits,
223 template<
class>
class FailureCode,
224 template<
class>
class FailureDetection,
227 class ...PassedInArgs
230 process(
char const *
const file_name,
unsigned line_num,
char const *
const fn_name,
tchar const *
const rev_info,
tchar const *
const err_msg, FnReturnType (*fn)(FnArgs...), PassedInArgs ...args)
noexcept(
std::
is_same<
FnReturnType,
void>::
value);
239 #define JMMCG_SYSCALL_WRAPPER(ErrMsg, RevInfo, Fn, ...)
247 #define JMMCG_SYSCALL_WRAPPER_FC(FailureCode, ErrMsg, RevInfo, Fn, ...)
253 >(__FILE__, __LINE__, LIBJMMCG_ENQUOTE(Fn), RevInfo, ErrMsg, Fn, __VA_ARGS__)
259 #define JMMCG_SYSCALL_WRAPPER_SWITCH(CaseLabels, ErrMsg, RevInfo, Fn, ...)
267 >(__FILE__, __LINE__, LIBJMMCG_ENQUOTE(Fn), RevInfo, ErrMsg, Fn, __VA_ARGS__)