Go to the documentation of this file.
23 # define P99_DEFARG_H_
32 #include P99_ADVANCE_ID
49 #define P00_code_augmenting
78 # define P99_CALL_DEFARG(NAME, M, ...) NAME(__VA_ARGS__)
79 # define P99_CALL_DEFARG_LIST(NAME, M, ...) __VA_ARGS__
82 # define P99_CALL_DEFARG(NAME, M, ...) NAME(P99_CALL_DEFARG_LIST(NAME, M, __VA_ARGS__))
85 # define P99_CALL_DEFARG_LIST(NAME, M, ...) \
88 (P99_IF_EMPTY(__VA_ARGS__) \
89 (P00_DEFARGS(NAME, M, P99_PASTE2(NAME,_defarg_0)())) \
90 (P00_DEFARGS(NAME, M, __VA_ARGS__)) \
197 #define P99_PROTOTYPE(...)
199 #define P00_PROTOTYPE(RT, NAME, ...) \
200 RT (NAME)(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__)); \
201 typedef RT P99_CAT2(NAME, _prototype_ret); \
202 P99_TYPEDEFS(P99_CAT2(NAME, _prototype_), __VA_ARGS__)
204 #define P99_PROTOTYPE(...) \
205 P99_IF_EQ_2(P99_NARG(__VA_ARGS__)) \
206 (P00_PROTOTYPE(__VA_ARGS__, void)) \
207 (P00_PROTOTYPE(__VA_ARGS__))
210 #if P99_COMPILER & P99_COMPILER_CLANG
211 #define P00_INSTANTIATE(RT, NAME, ...) \
212 RT (*const P99_PASTE3(p00_, NAME, _pointer)[])(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__)) = { NAME }; \
213 p00_instantiate RT (NAME)(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__))
215 #define P00_INSTANTIATE(RT, NAME, ...) \
216 p00_instantiate RT (NAME)(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__))
241 #define P99_INSTANTIATE(RT, NAME, ...) RT NAME(__VA_ARGS__)
243 #define P99_INSTANTIATE(...) \
244 P99_IF_EQ_2(P99_NARG(__VA_ARGS__)) \
245 (P00_INSTANTIATE(__VA_ARGS__, void)) \
246 (P00_INSTANTIATE(__VA_ARGS__))
249 #define P00_EXPR_FUNCTION(NAME, X, N) \
254 P99_PASTE3(NAME, _prototype_, N) P99_PASTE3(NAME, _defarg_, N)(void) { \
255 P99_PASTE3(NAME, _prototype_, N) p00_ret = (X); \
260 #define P00_DAFE(NAME, X, N) \
262 (P99_MACRO_END(NAME, _boring_, N)) \
263 (P99_INSTANTIATE(P99_PASTE3(NAME, _prototype_, N), P99_PASTE3(NAME, _defarg_, N)))
265 #define P00_DECLARE_DEFARG(NAME, N, ...) \
266 P99_FOR(NAME, N, P00_SER, P00_EXPR_FUNCTION, __VA_ARGS__) \
267 P99_MACRO_END(NAME, _declare_defarg)
289 #define P99_DECLARE_DEFARG(NAME, ...)
291 #define P99_DECLARE_DEFARG(NAME, ...) P00_DECLARE_DEFARG(NAME, P99_NARG(__VA_ARGS__), __VA_ARGS__)
294 #define P00_DEFINE_DEFARG(NAME, N, ...) \
295 P99_FOR(NAME, N, P00_SEP, P00_DAFE, __VA_ARGS__)
304 #define P99_DEFINE_DEFARG(NAME, ...)
306 #define P99_DEFINE_DEFARG(NAME, ...) P00_DEFINE_DEFARG(NAME, P99_NARG(__VA_ARGS__), __VA_ARGS__)
310 #define P00_DARG(NAME, X, N) P99_IF_EMPTY(X)(P99_PASTE3(NAME, _defarg_, N)())(X)
311 #define P00__DEFARGS(NAME, N, ...) P99_FOR(NAME, N, P00_SEQ, P00_DARG, __VA_ARGS__)
312 #define P00_DEFARGS(NAME, N, ...) P00__DEFARGS(NAME, N, P99_IF_LT(P99_NARG(__VA_ARGS__),N) (__VA_ARGS__, P99_DUPL(P99_MINUS(N,P99_NARG(__VA_ARGS__)),)) (__VA_ARGS__))
318 #define P99_DEFARG_DOCU(NAME) \
324 #define P00_VAARG_0(NAME, T) NAME
325 #define P00_VAARG_1(NAME, T) T
327 #define P00_VAARG(NAMET, X, I) P99_RVAL(P00_VAARG_1 NAMET, P99_IF_EMPTY(X)(P99_PASTE2(P00_VAARG_0 NAMET, _defarg)())(X))
329 #define P00_CALL_VA_ARG(NAME, T, ...) P99_FOR((NAME, T), P99_NARG(__VA_ARGS__), P00_SEQ, P00_VAARG, __VA_ARGS__)
424 #define P99_CALL_VA_ARG(NAME, M, T, ...) NAME(__VA_ARGS__)
427 #define P99_CALL_VA_ARG(NAME, M, T, ...) \
428 P99_IF_GT(P99_NARG(__VA_ARGS__), M) \
429 (NAME(P00__DEFARGS(NAME, M, P99_SELS(M, __VA_ARGS__)), P00_CALL_VA_ARG(NAME, T, P99_SKP(M, __VA_ARGS__)))) \
430 (P99_CALL_DEFARG(NAME, M, __VA_ARGS__))
macros to produce lists of statements or declarations.
#define P99_PROTOTYPE(...)
Define the prototype of function NAME.
#define P99_CALL_VA_ARG(NAME, M, T,...)
Assure type safety for variadic functions.
#define P99_CALL_DEFARG_LIST(NAME, M,...)
Expand an argument list with default arguments.
#define P99_CALL_DEFARG(NAME, M,...)
Define a replacement macro for functions that can provide default arguments to the underlying real fu...