00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef P99_DEFARG_H_
00015 # define P99_DEFARG_H_
00016
00023 #include "p99_map.h"
00024 #include P99_ADVANCE_ID
00025
00041 #define P00_code_augmenting
00042
00043
00069 #ifdef P00_DOXYGEN
00070 # define P99_CALL_DEFARG(NAME, M, ...) NAME(__VA_ARGS__)
00071 # define P99_CALL_DEFARG_LIST(NAME, M, ...) __VA_ARGS__
00072 #else
00073 P00_DOCUMENT_NUMBER_ARGUMENT(P99_CALL_DEFARG, 1)
00074 # define P99_CALL_DEFARG(NAME, M, ...) NAME(P99_CALL_DEFARG_LIST(NAME, M, __VA_ARGS__))
00075
00076 P00_DOCUMENT_NUMBER_ARGUMENT(P99_CALL_DEFARG_LIST, 1)
00077 # define P99_CALL_DEFARG_LIST(NAME, M, ...) \
00078 P99_IF_EQ(0,M) \
00079 (__VA_ARGS__) \
00080 (P99_IF_EMPTY(__VA_ARGS__) \
00081 (P00_DEFARGS(NAME, M, P99_PASTE2(NAME,_defarg_0)())) \
00082 (P00_DEFARGS(NAME, M, __VA_ARGS__)) \
00083 )
00084 #endif
00085
00086
00185 P00_DOCUMENT_TYPE_ARGUMENT(P99_PROTOTYPE, 0)
00186 P00_DOCUMENT_TYPE_ARGUMENT(P99_PROTOTYPE, 2)
00187
00188 #ifdef P00_DOXYGEN
00189 #define P99_PROTOTYPE(...)
00190 #else
00191 #define P00_PROTOTYPE(RT, NAME, ...) \
00192 RT (NAME)(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__)); \
00193 typedef RT P99_CAT2(NAME, _prototype_ret); \
00194 P99_TYPEDEFS(P99_CAT2(NAME, _prototype_), __VA_ARGS__)
00195
00196 #define P99_PROTOTYPE(...) \
00197 P99_IF_EQ_2(P99_NARG(__VA_ARGS__)) \
00198 (P00_PROTOTYPE(__VA_ARGS__, void)) \
00199 (P00_PROTOTYPE(__VA_ARGS__))
00200 #endif
00201
00202 #if P99_COMPILER & P99_COMPILER_CLANG
00203 #define P00_INSTANTIATE(RT, NAME, ...) \
00204 RT (*const P99_PASTE3(p00_, NAME, _pointer)[])(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__)) = { NAME }; \
00205 p00_instantiate RT (NAME)(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__))
00206 #else
00207 #define P00_INSTANTIATE(RT, NAME, ...) \
00208 p00_instantiate RT (NAME)(P99_IF_EMPTY(__VA_ARGS__)(void)(__VA_ARGS__))
00209 #endif
00210
00211 #ifdef P00_DOXYGEN
00212
00233 #define P99_INSTANTIATE(RT, NAME, ...) RT NAME(__VA_ARGS__)
00234 #else
00235 #define P99_INSTANTIATE(...) \
00236 P99_IF_EQ_2(P99_NARG(__VA_ARGS__)) \
00237 (P00_INSTANTIATE(__VA_ARGS__, void)) \
00238 (P00_INSTANTIATE(__VA_ARGS__))
00239 #endif
00240
00241 #define P00_EXPR_FUNCTION(NAME, X, N) \
00242 P99_IF_EMPTY(X) \
00243 () \
00244 ( \
00245 inline \
00246 P99_PASTE3(NAME, _prototype_, N) P99_PASTE3(NAME, _defarg_, N)(void) { \
00247 P99_PASTE3(NAME, _prototype_, N) p00_ret = (X); \
00248 return p00_ret; \
00249 } \
00250 )
00251
00252 #define P00_DAFE(NAME, X, N) \
00253 P99_IF_EMPTY(X) \
00254 (P99_MACRO_END(NAME, _boring_, N)) \
00255 (P99_INSTANTIATE(P99_PASTE3(NAME, _prototype_, N), P99_PASTE3(NAME, _defarg_, N)))
00256
00257 #define P00_DECLARE_DEFARG(NAME, N, ...) \
00258 P99_FOR(NAME, N, P00_SER, P00_EXPR_FUNCTION, __VA_ARGS__) \
00259 P99_MACRO_END(NAME, _declare_defarg)
00260
00261 #ifdef P00_DOXYGEN
00262
00281 #define P99_DECLARE_DEFARG(NAME, ...)
00282 #else
00283 #define P99_DECLARE_DEFARG(NAME, ...) P00_DECLARE_DEFARG(NAME, P99_NARG(__VA_ARGS__), __VA_ARGS__)
00284 #endif
00285
00286 #define P00_DEFINE_DEFARG(NAME, N, ...) \
00287 P99_FOR(NAME, N, P00_SEP, P00_DAFE, __VA_ARGS__)
00288
00289 #ifdef P00_DOXYGEN
00290
00296 #define P99_DEFINE_DEFARG(NAME, ...)
00297 #else
00298 #define P99_DEFINE_DEFARG(NAME, ...) P00_DEFINE_DEFARG(NAME, P99_NARG(__VA_ARGS__), __VA_ARGS__)
00299 #endif
00300
00301
00302 #define P00_DARG(NAME, X, N) P99_IF_EMPTY(X)(P99_PASTE3(NAME, _defarg_, N)())(X)
00303 #define P00__DEFARGS(NAME, N, ...) P99_FOR(NAME, N, P00_SEQ, P00_DARG, __VA_ARGS__)
00304 #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__))
00305
00306
00310 #define P99_DEFARG_DOCU(NAME) \
00311 \
00312 \
00313
00316 #define P00_VAARG_0(NAME, T) NAME
00317 #define P00_VAARG_1(NAME, T) T
00318
00319 #define P00_VAARG(NAMET, X, I) P99_RVAL(P00_VAARG_1 NAMET, P99_IF_EMPTY(X)(P99_PASTE2(P00_VAARG_0 NAMET, _defarg)())(X))
00320
00321 #define P00_CALL_VA_ARG(NAME, T, ...) P99_FOR((NAME, T), P99_NARG(__VA_ARGS__), P00_SEQ, P00_VAARG, __VA_ARGS__)
00322
00323 #ifdef DOXYGEN
00324
00416 #define P99_CALL_VA_ARG(NAME, M, T, ...) NAME(__VA_ARGS__)
00417 #else
00418 P00_DOCUMENT_NUMBER_ARGUMENT(P99_CALL_VA_ARG, 1)
00419 #define P99_CALL_VA_ARG(NAME, M, T, ...) \
00420 P99_IF_GT(P99_NARG(__VA_ARGS__), M) \
00421 (NAME(P00__DEFARGS(NAME, M, P99_SELS(M, __VA_ARGS__)), P00_CALL_VA_ARG(NAME, T, P99_SKP(M, __VA_ARGS__)))) \
00422 (P99_CALL_DEFARG(NAME, M, __VA_ARGS__))
00423 #endif
00424
00431 #endif