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 for parts copied from previous work and as explicitly stated below, */
00004 /* the authors and copyright holders for this work are as follows:            */
00005 /* (C) copyright  2010-2012 Jens Gustedt, INRIA, France                       */
00006 /* (C) copyright  2012 William Morris                                         */
00007 /*                                                                            */
00008 /* This file is free software; it is part of the P99 project.                 */
00009 /* You can redistribute it and/or modify it under the terms of the QPL as     */
00010 /* given in the file LICENSE. It is distributed without any warranty;         */
00011 /* without even the implied warranty of merchantability or fitness for a      */
00012 /* particular purpose.                                                        */
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      /* !P99_DEFARG_H_ */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines