/**
* Copyright (C) Mellanox Technologies Ltd. 2001-2012. ALL RIGHTS RESERVED.
*
* See file LICENSE for terms.
*/
#ifndef UCS_PREPROCESSOR_H
#define UCS_PREPROCESSOR_H
/* Convert token to string */
#define UCS_PP_QUOTE(x) # x
/* Paste two expanded tokens */
#define __UCS_TOKENPASTE_HELPER(x, y) x ## y
#define UCS_PP_TOKENPASTE(x, y) __UCS_TOKENPASTE_HELPER(x, y)
/* Unique value generator */
#ifdef __COUNTER__
# define UCS_PP_UNIQUE_ID __COUNTER__
#else
# define UCS_PP_UNIQUE_ID __LINE__
#endif
/* Creating unique identifiers, used for macros */
#define UCS_PP_APPEND_UNIQUE_ID(x) UCS_PP_TOKENPASTE(x, UCS_PP_UNIQUE_ID)
/* Convert to string */
#define _UCS_PP_MAKE_STRING(x) #x
#define UCS_PP_MAKE_STRING(x) _UCS_PP_MAKE_STRING(x)
/*
* Count number of macro arguments
* e.g UCS_PP_NUM_ARGS(a,b) will expand to: 2
*/
#define UCS_PP_MAX_ARGS 20
#define _UCS_PP_NUM_ARGS(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,N,...) \
N
#define UCS_PP_NUM_ARGS(...) \
_UCS_PP_NUM_ARGS(, ## __VA_ARGS__,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
/* Expand macro for each argument in the list
* e.g
* UCS_PP_FOREACH(macro, arg, a, b, c) will expand to: macro(arg, a) macro(arg, b) macro(arg, c)
* UCS_PP_FOREACH_SEP(macro, arg, a, b, c) will expand to: macro(arg, a), macro(arg, b), macro(arg, c)
* UCS_PP_ZIP((a, b, c), (1, 2, 3)) will expand to: (a, 1), (b, 2), (c, 3)
*/
#define UCS_PP_FOREACH(_macro, _arg, ...) \
UCS_PP_TOKENPASTE(_UCS_PP_FOREACH_, UCS_PP_NUM_ARGS(__VA_ARGS__))(_macro, _arg, __VA_ARGS__)
#define UCS_PP_FOREACH_SEP(_macro, _arg, ...) \
UCS_PP_TOKENPASTE(_UCS_PP_FOREACH_SEP_, UCS_PP_NUM_ARGS(__VA_ARGS__))(_macro, _arg, __VA_ARGS__)
#define UCS_PP_ZIP(_l1, _l2) \
UCS_PP_TOKENPASTE(_UCS_PP_ZIP_, UCS_PP_NUM_ARGS _l1)(_l1, _l2)
#define _UCS_PP_FOREACH_0(_macro , _arg, ...)
#define _UCS_PP_FOREACH_1(_macro , _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_0 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_2(_macro , _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_1 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_3(_macro , _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_2 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_4(_macro , _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_3 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_5(_macro , _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_4 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_6(_macro , _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_5 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_7(_macro , _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_6 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_8(_macro , _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_7 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_9(_macro , _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_8 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_10(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_9 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_11(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_10(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_12(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_11(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_13(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_12(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_14(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_13(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_15(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_14(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_16(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_15(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_17(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_16(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_18(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_17(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_19(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_18(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_20(_macro, _arg, _arg1, ...) _macro(_arg, _arg1) _UCS_PP_FOREACH_19(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_0(_macro , _arg, _arg1, ...)
#define _UCS_PP_FOREACH_SEP_1(_macro , _arg, _arg1, ...) _macro(_arg, _arg1)
#define _UCS_PP_FOREACH_SEP_2(_macro , _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_1 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_3(_macro , _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_2 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_4(_macro , _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_3 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_5(_macro , _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_4 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_6(_macro , _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_5 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_7(_macro , _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_6 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_8(_macro , _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_7 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_9(_macro , _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_8 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_10(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_9 (_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_11(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_10(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_12(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_11(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_13(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_12(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_14(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_13(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_15(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_14(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_16(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_15(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_17(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_16(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_18(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_17(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_19(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_18(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_FOREACH_SEP_20(_macro, _arg, _arg1, ...) _macro(_arg, _arg1), _UCS_PP_FOREACH_SEP_19(_macro, _arg, __VA_ARGS__)
#define _UCS_PP_ZIP_0(_l1, _l2)
#define _UCS_PP_ZIP_1(_l1, _l2) _UCS_PP_ZIP_0(_l1, _l2) (UCS_PP_TUPLE_0 _l1, UCS_PP_TUPLE_0 _l2)
#define _UCS_PP_ZIP_2(_l1, _l2) _UCS_PP_ZIP_1(_l1, _l2), (UCS_PP_TUPLE_1 _l1, UCS_PP_TUPLE_1 _l2)
#define _UCS_PP_ZIP_3(_l1, _l2) _UCS_PP_ZIP_2(_l1, _l2), (UCS_PP_TUPLE_2 _l1, UCS_PP_TUPLE_2 _l2)
#define _UCS_PP_ZIP_4(_l1, _l2) _UCS_PP_ZIP_3(_l1, _l2), (UCS_PP_TUPLE_3 _l1, UCS_PP_TUPLE_3 _l2)
#define _UCS_PP_ZIP_5(_l1, _l2) _UCS_PP_ZIP_4(_l1, _l2), (UCS_PP_TUPLE_4 _l1, UCS_PP_TUPLE_4 _l2)
#define _UCS_PP_ZIP_6(_l1, _l2) _UCS_PP_ZIP_5(_l1, _l2), (UCS_PP_TUPLE_5 _l1, UCS_PP_TUPLE_5 _l2)
#define _UCS_PP_ZIP_7(_l1, _l2) _UCS_PP_ZIP_6(_l1, _l2), (UCS_PP_TUPLE_6 _l1, UCS_PP_TUPLE_6 _l2)
#define _UCS_PP_ZIP_8(_l1, _l2) _UCS_PP_ZIP_7(_l1, _l2), (UCS_PP_TUPLE_7 _l1, UCS_PP_TUPLE_7 _l2)
#define _UCS_PP_ZIP_9(_l1, _l2) _UCS_PP_ZIP_8(_l1, _l2), (UCS_PP_TUPLE_8 _l1, UCS_PP_TUPLE_8 _l2)
#define _UCS_PP_ZIP_10(_l1, _l2) _UCS_PP_ZIP_9(_l1, _l2), (UCS_PP_TUPLE_9 _l1, UCS_PP_TUPLE_9 _l2)
/* Extract elements from tuples
*/
#define UCS_PP_TUPLE_0(_0, ...) _0
#define UCS_PP_TUPLE_1(_0, _1, ...) _1
#define UCS_PP_TUPLE_2(_0, _1, _2, ...) _2
#define UCS_PP_TUPLE_3(_0, _1, _2, _3, ...) _3
#define UCS_PP_TUPLE_4(_0, _1, _2, _3, _4, ...) _4
#define UCS_PP_TUPLE_5(_0, _1, _2, _3, _4, _5, ...) _5
#define UCS_PP_TUPLE_6(_0, _1, _2, _3, _4, _5, _6, ...) _6
#define UCS_PP_TUPLE_7(_0, _1, _2, _3, _4, _5, _6, _7, ...) _7
#define UCS_PP_TUPLE_8(_0, _1, _2, _3, _4, _5, _6, _7, _8, ...) _8
#define UCS_PP_TUPLE_9(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, ...) _9
#define UCS_PP_TUPLE_10(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, ...) _10
#define UCS_PP_TUPLE_BREAK(...) __VA_ARGS__
/* Sequence of numbers
*/
#define _UCS_PP_SEQ_0
#define _UCS_PP_SEQ_1 _UCS_PP_SEQ_0 0
#define _UCS_PP_SEQ_2 _UCS_PP_SEQ_1 , 1
#define _UCS_PP_SEQ_3 _UCS_PP_SEQ_2 , 2
#define _UCS_PP_SEQ_4 _UCS_PP_SEQ_3 , 3
#define _UCS_PP_SEQ_5 _UCS_PP_SEQ_4 , 4
#define _UCS_PP_SEQ_6 _UCS_PP_SEQ_5 , 5
#define _UCS_PP_SEQ_7 _UCS_PP_SEQ_6 , 6
#define _UCS_PP_SEQ_8 _UCS_PP_SEQ_7 , 7
#define _UCS_PP_SEQ_9 _UCS_PP_SEQ_8 , 8
#define _UCS_PP_SEQ_10 _UCS_PP_SEQ_9 , 9
#define _UCS_PP_SEQ_11 _UCS_PP_SEQ_10, 10
#define _UCS_PP_SEQ_12 _UCS_PP_SEQ_11, 11
#define _UCS_PP_SEQ_13 _UCS_PP_SEQ_12, 12
#define _UCS_PP_SEQ_14 _UCS_PP_SEQ_13, 13
#define _UCS_PP_SEQ_15 _UCS_PP_SEQ_14, 14
#define _UCS_PP_SEQ_16 _UCS_PP_SEQ_15, 15
#define _UCS_PP_SEQ_17 _UCS_PP_SEQ_16, 16
#define _UCS_PP_SEQ_18 _UCS_PP_SEQ_17, 17
#define _UCS_PP_SEQ_19 _UCS_PP_SEQ_18, 18
#define _UCS_PP_SEQ_20 _UCS_PP_SEQ_19, 19
#define _UCS_PP_SEQ(_n) _UCS_PP_SEQ_##_n
#define UCS_PP_SEQ(_n) _UCS_PP_SEQ(_n)
#endif