Loading...
Searching...
No Matches
Go to the documentation of this file.
6#ifndef MIMICPP_MACROS_FACADE_HPP
7#define MIMICPP_MACROS_FACADE_HPP
39#define MIMICPP_DETAIL_MAKE_SIGNATURE(sequence, bound_data, ret, call_convention, param_type_list, specs, ...) \
40 ::mimicpp::facade::detail::apply_normalized_specs_t< \
41 MIMICPP_DETAIL_STRIP_PARENS(ret) call_convention param_type_list, \
42 ::mimicpp::util::StaticString{#specs}>
48#define MIMICPP_DETAIL_MAKE_SIGNATURE_LIST(...) \
49 MIMICPP_DETAIL_FOR_EACH_EXT( \
50 MIMICPP_DETAIL_MAKE_SIGNATURE, \
52 MIMICPP_DETAIL_COMMA_DELIMITER, \
53 MIMICPP_DETAIL_STRIP_PARENS, \
73#define MIMICPP_DETAIL_MAKE_PARAM(sequence, bound_data, type) MIMICPP_DETAIL_STRIP_PARENS(type) arg_##sequence
79#define MIMICPP_DETAIL_MAKE_PARAM_LIST(...) \
80 MIMICPP_DETAIL_FOR_EACH_EXT( \
81 MIMICPP_DETAIL_MAKE_PARAM, \
83 MIMICPP_DETAIL_COMMA_DELIMITER, \
84 MIMICPP_DETAIL_IDENTITY, \
120#define MIMICPP_DETAIL_FORWARD_ARG_AS_TUPLE(sequence, bound_data, param_type) \
121 [&]<typename... Type>([[maybe_unused]] ::mimicpp::util::type_list<Type...> const) noexcept { \
122 return ::std::forward_as_tuple(::std::forward<Type>(arg_##sequence)...); \
123 }(::mimicpp::util::type_list<MIMICPP_DETAIL_STRIP_PARENS(param_type)>{})
129#define MIMICPP_DETAIL_FORWARD_ARGS_AS_TUPLE(...) \
130 MIMICPP_DETAIL_FOR_EACH_EXT( \
131 MIMICPP_DETAIL_FORWARD_ARG_AS_TUPLE, \
133 MIMICPP_DETAIL_COMMA_DELIMITER, \
134 MIMICPP_DETAIL_IDENTITY, \
158#define MIMICPP_DETAIL_MAKE_OVERLOAD_INFOS_ALL(ret, param_type_list, specs, call_convention, ...) \
161 MIMICPP_DETAIL_STRIP_PARENS(call_convention), \
163 MIMICPP_DETAIL_STRIP_PARENS(specs), \
164 (MIMICPP_DETAIL_MAKE_PARAM_LIST(MIMICPP_DETAIL_STRIP_PARENS(param_type_list))), \
165 (MIMICPP_DETAIL_FORWARD_ARGS_AS_TUPLE(MIMICPP_DETAIL_STRIP_PARENS(param_type_list))))
174#define MIMICPP_DETAIL_MAKE_OVERLOAD_INFOS_SPECS(ret, param_type_list, specs, ...) \
175 MIMICPP_DETAIL_MAKE_OVERLOAD_INFOS_ALL(ret, param_type_list, specs, )
183#define MIMICPP_DETAIL_MAKE_OVERLOAD_INFOS_BASIC(ret, param_type_list, ...) \
184 MIMICPP_DETAIL_MAKE_OVERLOAD_INFOS_ALL(ret, param_type_list, , )
191#define MIMICPP_DETAIL_SELECT_MAKE_OVERLOAD_INFOS(_1, _2, N, ...) N
211#define MIMICPP_DETAIL_GENERATE_FACADE_TARGET(traits, target_name, fn_name, linkage, signatures) \
212 linkage typename traits::template target_type<MIMICPP_DETAIL_STRIP_PARENS(signatures)> target_name \
214 [&]<typename T = traits>() { \
215 if constexpr (::mimicpp::facade::detail::is_member_v<T>) \
217 return T::make_settings(this, #fn_name); \
221 return T::make_settings(#fn_name); \
241#define MIMICPP_DETAIL_GENERATE_FACADE_FUNCTION(ignore, traits, target_name, fn_name, linkage, ret, call_convention, param_type_list, specs, param_list, forward_list, ...) \
242 linkage MIMICPP_DETAIL_STRIP_PARENS(ret) \
243 call_convention fn_name param_list specs \
245 using Signature = ::mimicpp::facade::detail::apply_normalized_specs_t< \
246 MIMICPP_DETAIL_STRIP_PARENS(ret) param_type_list, \
247 ::mimicpp::util::StaticString{#specs}>; \
248 auto args = ::std::tuple_cat(MIMICPP_DETAIL_STRIP_PARENS(forward_list)); \
250 return [&]<typename T = traits>() -> decltype(auto) { \
251 if constexpr (::mimicpp::facade::detail::is_member_v<T>) \
253 return T::template invoke<Signature>(target_name, this, ::std::move(args)); \
257 return T::template invoke<Signature>(target_name, ::std::move(args)); \
271#define MIMICPP_DETAIL_GENERATE_FACADE_OVERLOADS(op, traits, target_name, fn_name, linkage, ...) \
272 MIMICPP_DETAIL_FOR_EACH_EXT( \
275 MIMICPP_DETAIL_NO_DELIMITER, \
276 MIMICPP_DETAIL_STRIP_PARENS, \
277 (traits, target_name, fn_name, linkage), \
288#define MIMICPP_DETAIL_GENERATE_FACADE(fn_op, traits, target_name, fn_name, linkage, ...) \
289 MIMICPP_DETAIL_GENERATE_FACADE_OVERLOADS(fn_op, traits, target_name, fn_name, linkage, __VA_ARGS__) \
290 MIMICPP_DETAIL_GENERATE_FACADE_TARGET( \
295 (MIMICPP_DETAIL_MAKE_SIGNATURE_LIST(__VA_ARGS__)))
306#define MIMICPP_ADD_OVERLOAD(ret, param_type_list, ...) \
307 MIMICPP_DETAIL_SELECT_MAKE_OVERLOAD_INFOS( \
309 MIMICPP_DETAIL_MAKE_OVERLOAD_INFOS_ALL, \
310 MIMICPP_DETAIL_MAKE_OVERLOAD_INFOS_SPECS, \
311 MIMICPP_DETAIL_MAKE_OVERLOAD_INFOS_BASIC)(ret, param_type_list, __VA_ARGS__, )
313#ifndef MIMICPP_CONFIG_ONLY_PREFIXED_MACROS
319 #define ADD_OVERLOAD MIMICPP_ADD_OVERLOAD
335#define MIMICPP_MAKE_OVERLOADED_FACADE_EXT(traits, target_name, fn_name, linkage, ...) \
336 MIMICPP_DETAIL_GENERATE_FACADE( \
337 MIMICPP_DETAIL_GENERATE_FACADE_FUNCTION, \
344#ifndef MIMICPP_CONFIG_ONLY_PREFIXED_MACROS
350 #define MAKE_OVERLOADED_FACADE_EXT MIMICPP_MAKE_OVERLOADED_FACADE_EXT
368#define MIMICPP_MAKE_FACADE_EXT(traits, target_name, fn_name, linkage, ret, param_type_list, ...) \
369 MIMICPP_MAKE_OVERLOADED_FACADE_EXT( \
374 MIMICPP_ADD_OVERLOAD(ret, param_type_list __VA_OPT__(, ) __VA_ARGS__))
376#ifndef MIMICPP_CONFIG_ONLY_PREFIXED_MACROS
382 #define MAKE_FACADE_EXT MIMICPP_MAKE_FACADE_EXT
399#define MIMICPP_MAKE_OVERLOADED_MEMBER_MOCK(fn_name, ...) \
400 MIMICPP_MAKE_OVERLOADED_FACADE_EXT( \
401 ::mimicpp::facade::mock_as_member, \
407#ifndef MIMICPP_CONFIG_ONLY_PREFIXED_MACROS
413 #define MAKE_OVERLOADED_MEMBER_MOCK MIMICPP_MAKE_OVERLOADED_MEMBER_MOCK
433#define MIMICPP_MAKE_MEMBER_MOCK(fn_name, ret, param_type_list, ...) \
434 MIMICPP_MAKE_OVERLOADED_MEMBER_MOCK( \
436 MIMICPP_ADD_OVERLOAD(ret, param_type_list __VA_OPT__(, ) __VA_ARGS__))
438#ifndef MIMICPP_CONFIG_ONLY_PREFIXED_MACROS
444 #define MAKE_MEMBER_MOCK MIMICPP_MAKE_MEMBER_MOCK
466#define MIMICPP_MAKE_OVERLOADED_MEMBER_MOCK_WITH_THIS(fn_name, ...) \
467 MIMICPP_MAKE_OVERLOADED_FACADE_EXT( \
468 ::mimicpp::facade::mock_as_member_with_this<self_type>, \
474#ifndef MIMICPP_CONFIG_ONLY_PREFIXED_MACROS
480 #define MAKE_OVERLOADED_MEMBER_MOCK_WITH_THIS MIMICPP_MAKE_OVERLOADED_MEMBER_MOCK_WITH_THIS
505#define MIMICPP_MAKE_MEMBER_MOCK_WITH_THIS(fn_name, ret, param_type_list, ...) \
506 MIMICPP_MAKE_OVERLOADED_MEMBER_MOCK_WITH_THIS( \
508 MIMICPP_ADD_OVERLOAD(ret, param_type_list __VA_OPT__(, ) __VA_ARGS__))
510#ifndef MIMICPP_CONFIG_ONLY_PREFIXED_MACROS
516 #define MAKE_MEMBER_MOCK_WITH_THIS MIMICPP_MAKE_MEMBER_MOCK_WITH_THIS