00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef P99_DEFARG_H_
00014 # define P99_DEFARG_H_
00015
00022 #include "p99_map.h"
00023 #include P99_ADVANCE_ID
00024
00040 #define P00_code_augmenting
00041
00042
00068 #ifdef P00_DOXYGEN
00069 # define P99_CALL_DEFARG(NAME, M, ...) NAME(__VA_ARGS__)
00070 # define P99_CALL_DEFARG_LIST(NAME, M, ...) __VA_ARGS__
00071 #else
00072 P00_DOCUMENT_NUMBER_ARGUMENT(P99_CALL_DEFARG, 1)
00073 # define P99_CALL_DEFARG(NAME, M, ...) NAME(P99_CALL_DEFARG_LIST(NAME, M, __VA_ARGS__))
00074
00075 P00_DOCUMENT_NUMBER_ARGUMENT(P99_CALL_DEFARG_LIST, 1)
00076 # define P99_CALL_DEFARG_LIST(NAME, M, ...) \
00077 P99_IF_EQ(0,M) \
00078 (__VA_ARGS__) \
00079 (P99_IF_EMPTY(__VA_ARGS__) \
00080 (P00_DEFARGS(NAME, M, P99_PASTE2(NAME,_defarg_0)())) \
00081 (P00_DEFARGS(NAME, M, __VA_ARGS__)) \
00082 )
00083 #endif
00084
00085
00180 P00_DOCUMENT_TYPE_ARGUMENT(P99_PROTOTYPE, 0)
00181 P00_DOCUMENT_TYPE_ARGUMENT(P99_PROTOTYPE, 2)
00182
00183 #ifdef P00_DOXYGEN
00184 #define P99_PROTOTYPE(RT, NAME, ...) \
00185 \
00186 RT NAME(__VA_ARGS__)
00187 #else
00188 #define P00_PROTOTYPE(RT, NAME, ...) \
00189 RT NAME(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__)); \
00190 typedef RT P99_CAT2(NAME, _prototype_ret); \
00191 P99_TYPEDEFS(P99_CAT2(NAME, _prototype_), __VA_ARGS__)
00192
00193 #define P99_PROTOTYPE(...) \
00194 P99_IF_EQ_2(P99_NARG(__VA_ARGS__)) \
00195 (P00_PROTOTYPE(__VA_ARGS__, void)) \
00196 (P00_PROTOTYPE(__VA_ARGS__))
00197 #endif
00198
00199 #if P99_COMPILER & P99_COMPILER_CLANG
00200 #define P00_INSTANTIATE(RT, NAME, ...) \
00201 RT (*const P99_PASTE3(p00_, NAME, _pointer)[])(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__)) = { NAME }; \
00202 p00_instantiate RT NAME(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__))
00203 #else
00204 #define P00_INSTANTIATE(RT, NAME, ...) \
00205 p00_instantiate RT NAME(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__))
00206 #endif
00207
00208 #ifdef P00_DOXYGEN
00209
00225 #define P99_INSTANTIATE(RT, NAME, ...) RT NAME(__VA_ARGS__)
00226 #else
00227 #define P99_INSTANTIATE(...) \
00228 P99_IF_EQ_2(P99_NARG(__VA_ARGS__)) \
00229 (P00_INSTANTIATE(__VA_ARGS__, void)) \
00230 (P00_INSTANTIATE(__VA_ARGS__))
00231 #endif
00232
00233 #define P00_EXPR_FUNCTION(NAME, X, N) \
00234 P99_IF_EMPTY(X) \
00235 () \
00236 ( \
00237 inline \
00238 P99_PASTE3(NAME, _prototype_, N) P99_PASTE3(NAME, _defarg_, N)(void) { \
00239 P99_PASTE3(NAME, _prototype_, N) p00_ret = (X); \
00240 return p00_ret; \
00241 } \
00242 )
00243
00244 #define P00_DAFE(NAME, X, N) \
00245 P99_IF_EMPTY(X) \
00246 (P99_MACRO_END(NAME, _boring_, N)) \
00247 (P99_INSTANTIATE(P99_PASTE3(NAME, _prototype_, N), P99_PASTE3(NAME, _defarg_, N)))
00248
00249 #define P00_DECLARE_DEFARG(NAME, N, ...) \
00250 P99_FOR(NAME, N, P00_SER, P00_EXPR_FUNCTION, __VA_ARGS__) \
00251 P99_MACRO_END(NAME, _declare_defarg)
00252
00253 #ifdef P00_DOXYGEN
00254
00273 #define P99_DECLARE_DEFARG(NAME, ...)
00274 #else
00275 #define P99_DECLARE_DEFARG(NAME, ...) P00_DECLARE_DEFARG(NAME, P99_NARG(__VA_ARGS__), __VA_ARGS__)
00276 #endif
00277
00278 #define P00_DEFINE_DEFARG(NAME, N, ...) \
00279 P99_FOR(NAME, N, P00_SEP, P00_DAFE, __VA_ARGS__)
00280
00281 #ifdef P00_DOXYGEN
00282
00288 #define P99_DEFINE_DEFARG(NAME, ...)
00289 #else
00290 #define P99_DEFINE_DEFARG(NAME, ...) P00_DEFINE_DEFARG(NAME, P99_NARG(__VA_ARGS__), __VA_ARGS__)
00291 #endif
00292
00293
00294 #define P00_DARG(NAME, X, N) P99_IF_EMPTY(X)(P99_PASTE3(NAME, _defarg_, N)())(X)
00295 #define P00__DEFARGS(NAME, N, ...) P99_FOR(NAME, N, P00_SEQ, P00_DARG, __VA_ARGS__)
00296 #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__))
00297
00298
00302 #define P99_DEFARG_DOCU(NAME) \
00303 \
00304 \
00305
00308 #define P00_VAARG_0(NAME, T) NAME
00309 #define P00_VAARG_1(NAME, T) T
00310
00311 #define P00_VAARG(NAMET, X, I) P99_RVAL(P00_VAARG_1 NAMET, P99_IF_EMPTY(X)(P99_PASTE2(P00_VAARG_0 NAMET, _defarg)())(X))
00312
00313 #define P00_CALL_VA_ARG(NAME, T, ...) P99_FOR((NAME, T), P99_NARG(__VA_ARGS__), P00_SEQ, P00_VAARG, __VA_ARGS__)
00314
00315 #ifdef DOXYGEN
00316
00408 #define P99_CALL_VA_ARG(NAME, M, T, ...) NAME(__VA_ARGS__)
00409 #else
00410 P00_DOCUMENT_NUMBER_ARGUMENT(P99_CALL_VA_ARG, 1)
00411 #define P99_CALL_VA_ARG(NAME, M, T, ...) \
00412 P99_IF_GT(P99_NARG(__VA_ARGS__), M) \
00413 (NAME(P00__DEFARGS(NAME, M, P99_SELS(M, __VA_ARGS__)), P00_CALL_VA_ARG(NAME, T, P99_SKP(M, __VA_ARGS__)))) \
00414 (P99_CALL_DEFARG(NAME, M, __VA_ARGS__))
00415 #endif
00416
00423 #endif