P99
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
p99_defarg.h
Go to the documentation of this file.
00001 /* This may look like nonsense, but it really is -*- mode: C -*-             */
00002 /*                                                                           */
00003 /* Except of parts copied from previous work and as explicitly stated below, */
00004 /* the author and copyright holder for this work is                          */
00005 /* (C) copyright  2010-2012 Jens Gustedt, INRIA, France                      */
00006 /*                                                                           */
00007 /* This file is free software; it is part of the P99 project.                */
00008 /* You can redistribute it and/or modify it under the terms of the QPL as    */
00009 /* given in the file LICENSE. It is distributed without any warranty;        */
00010 /* without even the implied warranty of merchantability or fitness for a     */
00011 /* particular purpose.                                                       */
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      /* !P99_DEFARG_H_ */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines