MCUX CLNS
MCUX Crypto Library Normal Secure
mcuxCsslCPreProcessor.h
Go to the documentation of this file.
1 /*--------------------------------------------------------------------------*/
2 /* Copyright 2019-2020 NXP */
3 /* */
4 /* NXP Confidential. This software is owned or controlled by NXP and may */
5 /* only be used strictly in accordance with the applicable license terms. */
6 /* By expressly accepting such terms or by downloading, installing, */
7 /* activating and/or otherwise using the software, you are agreeing that */
8 /* you have read, and that you agree to comply with and are bound by, such */
9 /* license terms. If you do not agree to be bound by the applicable license */
10 /* terms, then you may not retain, install, activate or otherwise use the */
11 /* software. */
12 /*--------------------------------------------------------------------------*/
13 
14 #ifndef MCUX_CSSL_C_PRE_PROCESSOR_H_
15 #define MCUX_CSSL_C_PRE_PROCESSOR_H_
16 
23 #define MCUX_CSSL_CPP_STR(a) #a
24 
25 #define MCUX_CSSL_CPP_ADD(a) + (a)
26 
27 #define MCUX_CSSL_CPP_CAT_IMPL(a, b) a##b
28 
29 #define MCUX_CSSL_CPP_CAT(a, b) \
30  MCUX_CSSL_CPP_CAT_IMPL(a, b)
31 
32 #define MCUX_CSSL_CPP_CAT3(a, b, c) \
33  MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_CAT(a, b), c)
34 
35 #define MCUX_CSSL_CPP_CAT4(a, b, c, d) \
36  MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_CAT(a, b), MCUX_CSSL_CPP_CAT(c, d))
37 
38 #define MCUX_CSSL_CPP_CAT6(a, b, c, d, e, f) \
39  MCUX_CSSL_CPP_CAT3( \
40  MCUX_CSSL_CPP_CAT(a, b), \
41  MCUX_CSSL_CPP_CAT(c, d), \
42  MCUX_CSSL_CPP_CAT(e, f))
43 
44 #define MCUX_CSSL_CPP_SEQUENCE_32TO0() \
45  32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, \
46  16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
47 
48 #define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_3TO0() \
49  n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
50  n, n, n, n, n, n, n, n, n, n, n, n, n, 3, 2, 1, 0
51 
52 #define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_2TO0() \
53  n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
54  n, n, n, n, n, n, n, n, n, n, n, n, n, n, 2, 1, 0
55 
56 #define MCUX_CSSL_CPP_ARG_N( \
57  _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, \
58  _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, \
59  N, ...) \
60  N
61 
62 #define MCUX_CSSL_CPP_ARGCOUNT_IMPL(...) \
63  MCUX_CSSL_CPP_ARG_N(__VA_ARGS__)
64 
65 #define MCUX_CSSL_CPP_ARGCOUNT(...) \
66  MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_32TO0())
67 
68 #define MCUX_CSSL_CPP_ARGCOUNT_2N(...) \
69  MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_2TO0())
70 
71 #define MCUX_CSSL_CPP_ARGCOUNT_3N(...) \
72  MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_3TO0())
73 
74 #define MCUX_CSSL_CPP_OVERLOADED_IMPL(name, n) MCUX_CSSL_CPP_CAT_IMPL(name, n)
75 
76 #define MCUX_CSSL_CPP_OVERLOADED(name, ...) \
77  MCUX_CSSL_CPP_DEFER2(MCUX_CSSL_CPP_OVERLOADED_IMPL)()(name, MCUX_CSSL_CPP_ARGCOUNT(__VA_ARGS__))
78 
79 #define MCUX_CSSL_CPP_OVERLOADED1(name, ...) \
80  MCUX_CSSL_CPP_IF_ELSE(MCUX_CSSL_CPP_HAS_ONE_ARG(__VA_ARGS__))( \
81  /* If only one arg, use the 1 version */ \
82  MCUX_CSSL_CPP_CAT(name,1)(MCUX_CSSL_CPP_FIRST(__VA_ARGS__, /* ensure extra argument: */ 0)) \
83  )( \
84  /* Otherwise the n version */ \
85  MCUX_CSSL_CPP_CAT(name,n)(__VA_ARGS__) \
86  )
87 
88 #define MCUX_CSSL_CPP_OVERLOADED2(name, ...) \
89  MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_2N(__VA_ARGS__))(__VA_ARGS__)
90 
91 #define MCUX_CSSL_CPP_OVERLOADED3(name, ...) \
92  MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_3N(__VA_ARGS__))(__VA_ARGS__)
93 
94 
95 
96 /*****************************************************************************
97  * Helper macros *
98  *****************************************************************************/
99 
100 /* Apply a macro to all arguments */
101 #define MCUX_CSSL_CPP_MAP(__macro, ...) \
102  MCUX_CSSL_CPP_EVAL(MCUX_CSSL_CPP_MAP_IMPL(__macro, __VA_ARGS__))
103 
104 /* Evaluate a complex macro (which needs multiple expansions to be processed) */
105 #define MCUX_CSSL_CPP_EVAL(...) MCUX_CSSL_CPP_EVAL1024(__VA_ARGS__)
106 #define MCUX_CSSL_CPP_EVAL1024(...) MCUX_CSSL_CPP_EVAL512(MCUX_CSSL_CPP_EVAL512(__VA_ARGS__))
107 #define MCUX_CSSL_CPP_EVAL512(...) MCUX_CSSL_CPP_EVAL256(MCUX_CSSL_CPP_EVAL256(__VA_ARGS__))
108 #define MCUX_CSSL_CPP_EVAL256(...) MCUX_CSSL_CPP_EVAL128(MCUX_CSSL_CPP_EVAL128(__VA_ARGS__))
109 #define MCUX_CSSL_CPP_EVAL128(...) MCUX_CSSL_CPP_EVAL64( MCUX_CSSL_CPP_EVAL64( __VA_ARGS__))
110 #define MCUX_CSSL_CPP_EVAL64(...) MCUX_CSSL_CPP_EVAL32( MCUX_CSSL_CPP_EVAL32( __VA_ARGS__))
111 #define MCUX_CSSL_CPP_EVAL32(...) MCUX_CSSL_CPP_EVAL16( MCUX_CSSL_CPP_EVAL16( __VA_ARGS__))
112 #define MCUX_CSSL_CPP_EVAL16(...) MCUX_CSSL_CPP_EVAL8( MCUX_CSSL_CPP_EVAL8( __VA_ARGS__))
113 #define MCUX_CSSL_CPP_EVAL8(...) MCUX_CSSL_CPP_EVAL4( MCUX_CSSL_CPP_EVAL4( __VA_ARGS__))
114 #define MCUX_CSSL_CPP_EVAL4(...) MCUX_CSSL_CPP_EVAL2( MCUX_CSSL_CPP_EVAL2( __VA_ARGS__))
115 #define MCUX_CSSL_CPP_EVAL2(...) MCUX_CSSL_CPP_EVAL1( MCUX_CSSL_CPP_EVAL1( __VA_ARGS__))
116 #define MCUX_CSSL_CPP_EVAL1(...) __VA_ARGS__
117 
118 /* Recursive definition of map macro, assumes at least one argument */
119 #define MCUX_CSSL_CPP_MAP_IMPL(__macro, ...) \
120  /* Apply the macro to the first argument from the list */\
121  __macro(MCUX_CSSL_CPP_FIRST(__VA_ARGS__, /* ensure second argument: */ 0)) \
122  /* Only proceed if there are additional arguments */\
123  MCUX_CSSL_CPP_IF(MCUX_CSSL_CPP_HAS_MORE_ARGS(__VA_ARGS__))( \
124  /* Recursive call for remaining arguments */\
125  MCUX_CSSL_CPP_DEFER2(MCUX_CSSL_CPP_MAP_IMPL_)()(__macro, \
126  MCUX_CSSL_CPP_NEXT(__VA_ARGS__)) \
127  )
128 #define MCUX_CSSL_CPP_MAP_IMPL_() MCUX_CSSL_CPP_MAP_IMPL
129 
130 /* Extract first argument (requires at least two arguments to be present) */
131 #define MCUX_CSSL_CPP_FIRST(a, ...) a
132 /* Extract second argument (requires at least three arguments to be present) */
133 #define MCUX_CSSL_CPP_SECOND(a, b, ...) b
134 /* Extract second argument (requires at least four arguments to be present) */
135 #define MCUX_CSSL_CPP_THIRD(a, b, c, ...) c
136 /* Extract second argument (requires at least five arguments to be present) */
137 #define MCUX_CSSL_CPP_FOURTH(a, b, c, d, ...) d
138 /* Remove the first argument from the list (requires at least two arguments to be present) */
139 #define MCUX_CSSL_CPP_NEXT(...) MCUX_CSSL_CPP_NEXT_()(__VA_ARGS__)
140 #define MCUX_CSSL_CPP_NEXT_() MCUX_CSSL_CPP_NEXT__
141 #define MCUX_CSSL_CPP_NEXT__(x, ...) __VA_ARGS__
142 
143 /* Check whether there is more then one argument */
144 #define MCUX_CSSL_CPP_HAS_MORE_ARGS(...) \
145  MCUX_CSSL_CPP_NOT(MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_SECOND(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER())))
146 
147 #define MCUX_CSSL_CPP_HAS_ONE_ARG(...) \
148  MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_SECOND(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))
149 
150 #define MCUX_CSSL_CPP_HAS_TWO_ARGS(...) \
151  MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_THIRD(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))
152 
153 #define MCUX_CSSL_CPP_HAS_THREE_ARGS(...) \
154  MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_FOURTH(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))
155 
156 
157 /* Check whether the argument is MCUX_CSSL_CPP_MARKER(), return 1 if it is */
158 #define MCUX_CSSL_CPP_IS_MARKER(...) \
159  MCUX_CSSL_CPP_SECOND(__VA_ARGS__, 0, 0)
160 #define MCUX_CSSL_CPP_MARKER() \
161  ~, 1
162 
163 /* Convert any argument into a bool (either 0 or 1), by double negation */
164 #define MCUX_CSSL_CPP_BOOL(x) MCUX_CSSL_CPP_NOT(MCUX_CSSL_CPP_NOT(x))
165 
166 /* Boolean negation (map value 0 to the marker, and check if we have the marker) */
167 #define MCUX_CSSL_CPP_NOT(x) MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_NOT_BOOL_, x))
168 #define MCUX_CSSL_CPP_NOT_BOOL_0 MCUX_CSSL_CPP_MARKER()
169 
170 /* Convert condition to bool */
171 #define MCUX_CSSL_CPP_IF(condition) MCUX_CSSL_CPP_IF_(MCUX_CSSL_CPP_BOOL(condition))
172 /* Convert bool to decision defines */
173 #define MCUX_CSSL_CPP_IF_(condition) MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_IF_BOOL_, condition)
174 /* If 0, do nothing*/
175 #define MCUX_CSSL_CPP_IF_BOOL_0(...)
176 /* If 1, perform action */
177 #define MCUX_CSSL_CPP_IF_BOOL_1(...) __VA_ARGS__
178 
179 /* Convert condition to bool */
180 #define MCUX_CSSL_CPP_IF_ELSE(condition) MCUX_CSSL_CPP_IF_ELSE_IMPL(MCUX_CSSL_CPP_BOOL(condition))
181 /* Convert bool to decision defines */
182 #define MCUX_CSSL_CPP_IF_ELSE_IMPL(condition) MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_IFE_BOOL_, condition)
183 /* If 0, ignore action */
184 #define MCUX_CSSL_CPP_IFE_BOOL_0(...) MCUX_CSSL_CPP_IFE_BOOL_0_ELSE
185 /* Else 0, perform action */
186 #define MCUX_CSSL_CPP_IFE_BOOL_0_ELSE(...) __VA_ARGS__
187 /* If 1, perform action */
188 #define MCUX_CSSL_CPP_IFE_BOOL_1(...) __VA_ARGS__ MCUX_CSSL_CPP_IFE_BOOL_1_ELSE
189 /* Else 1, ignore action */
190 
191 #define MCUX_CSSL_CPP_IFE_BOOL_1_ELSE(...)
192 
193 /* Defer macro expansion */
194 #define MCUX_CSSL_CPP_EMPTY()
195 #define MCUX_CSSL_CPP_DEFER1(macro) macro MCUX_CSSL_CPP_EMPTY()
196 #define MCUX_CSSL_CPP_DEFER2(macro) macro MCUX_CSSL_CPP_EMPTY MCUX_CSSL_CPP_EMPTY()()
197 
198 #endif /* MCUX_CSSL_C_PRE_PROCESSOR_H_ */