MCUX CLNS
MCUX Crypto Library Normal Secure
Loading...
Searching...
No Matches
mcuxCsslCPreProcessor.h
Go to the documentation of this file.
1
/*--------------------------------------------------------------------------*/
2
/* Copyright 2019-2020, 2023 NXP */
3
/* */
4
/* SPDX-License-Identifier: BSD-3-Clause */
5
/* */
6
/* Redistribution and use in source and binary forms, with or without */
7
/* modification, are permitted provided that the following conditions are */
8
/* met: */
9
/* */
10
/* 1. Redistributions of source code must retain the above copyright */
11
/* notice, this list of conditions and the following disclaimer. */
12
/* */
13
/* 2. Redistributions in binary form must reproduce the above copyright */
14
/* notice, this list of conditions and the following disclaimer in the */
15
/* documentation and/or other materials provided with the distribution. */
16
/* */
17
/* 3. Neither the name of the copyright holder nor the names of its */
18
/* contributors may be used to endorse or promote products derived from */
19
/* this software without specific prior written permission. */
20
/* */
21
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS */
22
/* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */
23
/* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A */
24
/* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
25
/* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
26
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
27
/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR */
28
/* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
29
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
30
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
31
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
32
/*--------------------------------------------------------------------------*/
33
34
#ifndef MCUX_CSSL_C_PRE_PROCESSOR_H_
35
#define MCUX_CSSL_C_PRE_PROCESSOR_H_
36
42
43
#define MCUX_CSSL_CPP_STR(a) #a
44
45
#define MCUX_CSSL_CPP_ADD(a) + (a)
46
47
#define MCUX_CSSL_CPP_CAT_IMPL(a, b) a##b
48
49
#define MCUX_CSSL_CPP_CAT(a, b) \
50
MCUX_CSSL_CPP_CAT_IMPL(a, b)
51
52
#define MCUX_CSSL_CPP_CAT3(a, b, c) \
53
MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_CAT(a, b), c)
54
55
#define MCUX_CSSL_CPP_CAT4(a, b, c, d) \
56
MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_CAT(a, b), MCUX_CSSL_CPP_CAT(c, d))
57
58
#define MCUX_CSSL_CPP_CAT6(a, b, c, d, e, f) \
59
MCUX_CSSL_CPP_CAT3( \
60
MCUX_CSSL_CPP_CAT(a, b), \
61
MCUX_CSSL_CPP_CAT(c, d), \
62
MCUX_CSSL_CPP_CAT(e, f))
63
64
#if !defined(__IASMARM__)
65
66
#define MCUX_CSSL_CPP_SEQUENCE_64TO0() \
67
64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, \
68
48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, \
69
32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, \
70
16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
71
72
#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_5TO0() \
73
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
74
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
75
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
76
n, n, n, n, n, n, n, n, n, n, n, 5, 4, 3, 2, 1, 0
77
78
#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_4TO0() \
79
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
80
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
81
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
82
n, n, n, n, n, n, n, n, n, n, n, n, 4, 3, 2, 1, 0
83
84
#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_3TO0() \
85
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
86
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
87
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
88
n, n, n, n, n, n, n, n, n, n, n, n, n, 3, 2, 1, 0
89
90
#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_2TO0() \
91
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
92
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
93
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
94
n, n, n, n, n, n, n, n, n, n, n, n, n, n, 2, 1, 0
95
96
#define MCUX_CSSL_CPP_ARG_N( \
97
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
98
_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, \
99
_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, \
100
_49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, \
101
N, ...) \
102
N
103
104
#define MCUX_CSSL_CPP_ARGCOUNT_IMPL(...) \
105
MCUX_CSSL_CPP_ARG_N(__VA_ARGS__)
106
107
#define MCUX_CSSL_CPP_ARGCOUNT(...) \
108
MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_64TO0())
109
110
#define MCUX_CSSL_CPP_ARGCOUNT_2N(...) \
111
MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_2TO0())
112
113
#define MCUX_CSSL_CPP_ARGCOUNT_3N(...) \
114
MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_3TO0())
115
116
#define MCUX_CSSL_CPP_ARGCOUNT_4N(...) \
117
MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_4TO0())
118
119
#define MCUX_CSSL_CPP_ARGCOUNT_5N(...) \
120
MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_5TO0())
121
122
#define MCUX_CSSL_CPP_OVERLOADED_IMPL(name, n) MCUX_CSSL_CPP_CAT_IMPL(name, n)
123
124
#define MCUX_CSSL_CPP_OVERLOADED(name, ...) \
125
MCUX_CSSL_CPP_DEFER2(MCUX_CSSL_CPP_OVERLOADED_IMPL)()(name, MCUX_CSSL_CPP_ARGCOUNT(__VA_ARGS__))
126
127
#define MCUX_CSSL_CPP_OVERLOADED1(name, ...) \
128
MCUX_CSSL_CPP_IF_ELSE(MCUX_CSSL_CPP_HAS_ONE_ARG(__VA_ARGS__))( \
129
/* If only one arg, use the 1 version */
\
130
MCUX_CSSL_CPP_CAT(name,1)(MCUX_CSSL_CPP_FIRST(__VA_ARGS__,
/* ensure extra argument: */
0)) \
131
)( \
132
/* Otherwise the n version */
\
133
MCUX_CSSL_CPP_CAT(name,n)(__VA_ARGS__) \
134
)
135
136
#define MCUX_CSSL_CPP_OVERLOADED2(name, ...) \
137
MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_2N(__VA_ARGS__))(__VA_ARGS__)
138
139
#define MCUX_CSSL_CPP_OVERLOADED3(name, ...) \
140
MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_3N(__VA_ARGS__))(__VA_ARGS__)
141
142
#define MCUX_CSSL_CPP_OVERLOADED4(name, ...) \
143
MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_4N(__VA_ARGS__))(__VA_ARGS__)
144
145
#define MCUX_CSSL_CPP_OVERLOADED5(name, ...) \
146
MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_5N(__VA_ARGS__))(__VA_ARGS__)
147
148
/*****************************************************************************
149
* Helper macros *
150
*****************************************************************************/
151
152
/* Apply a macro to all arguments */
153
#define MCUX_CSSL_CPP_MAP(__macro, ...) \
154
MCUX_CSSL_CPP_EVAL(MCUX_CSSL_CPP_MAP_IMPL(__macro, __VA_ARGS__))
155
156
/* Evaluate a complex macro (which needs multiple expansions to be processed) */
157
#define MCUX_CSSL_CPP_EVAL(...) MCUX_CSSL_CPP_EVAL1024(__VA_ARGS__)
158
#define MCUX_CSSL_CPP_EVAL1024(...) MCUX_CSSL_CPP_EVAL512(MCUX_CSSL_CPP_EVAL512(__VA_ARGS__))
159
#define MCUX_CSSL_CPP_EVAL512(...) MCUX_CSSL_CPP_EVAL256(MCUX_CSSL_CPP_EVAL256(__VA_ARGS__))
160
#define MCUX_CSSL_CPP_EVAL256(...) MCUX_CSSL_CPP_EVAL128(MCUX_CSSL_CPP_EVAL128(__VA_ARGS__))
161
#define MCUX_CSSL_CPP_EVAL128(...) MCUX_CSSL_CPP_EVAL64( MCUX_CSSL_CPP_EVAL64( __VA_ARGS__))
162
#define MCUX_CSSL_CPP_EVAL64(...) MCUX_CSSL_CPP_EVAL32( MCUX_CSSL_CPP_EVAL32( __VA_ARGS__))
163
#define MCUX_CSSL_CPP_EVAL32(...) MCUX_CSSL_CPP_EVAL16( MCUX_CSSL_CPP_EVAL16( __VA_ARGS__))
164
#define MCUX_CSSL_CPP_EVAL16(...) MCUX_CSSL_CPP_EVAL8( MCUX_CSSL_CPP_EVAL8( __VA_ARGS__))
165
#define MCUX_CSSL_CPP_EVAL8(...) MCUX_CSSL_CPP_EVAL4( MCUX_CSSL_CPP_EVAL4( __VA_ARGS__))
166
#define MCUX_CSSL_CPP_EVAL4(...) MCUX_CSSL_CPP_EVAL2( MCUX_CSSL_CPP_EVAL2( __VA_ARGS__))
167
#define MCUX_CSSL_CPP_EVAL2(...) MCUX_CSSL_CPP_EVAL1( MCUX_CSSL_CPP_EVAL1( __VA_ARGS__))
168
#define MCUX_CSSL_CPP_EVAL1(...) __VA_ARGS__
169
170
/* Recursive definition of map macro, assumes at least one argument */
171
#define MCUX_CSSL_CPP_MAP_IMPL(__macro, ...) \
172
/* Apply the macro to the first argument from the list */
\
173
__macro(MCUX_CSSL_CPP_FIRST(__VA_ARGS__,
/* ensure second argument: */
0)) \
174
/* Only proceed if there are additional arguments */
\
175
MCUX_CSSL_CPP_IF(MCUX_CSSL_CPP_HAS_MORE_ARGS(__VA_ARGS__))( \
176
/* Recursive call for remaining arguments */
\
177
MCUX_CSSL_CPP_DEFER2(MCUX_CSSL_CPP_MAP_IMPL_)()(__macro, \
178
MCUX_CSSL_CPP_NEXT(__VA_ARGS__)) \
179
)
180
#define MCUX_CSSL_CPP_MAP_IMPL_() MCUX_CSSL_CPP_MAP_IMPL
181
182
/* Extract first argument (requires at least two arguments to be present) */
183
#define MCUX_CSSL_CPP_FIRST(a, ...) a
184
/* Extract second argument (requires at least three arguments to be present) */
185
#define MCUX_CSSL_CPP_SECOND(a, b, ...) b
186
/* Extract third argument (requires at least four arguments to be present) */
187
#define MCUX_CSSL_CPP_THIRD(a, b, c, ...) c
188
/* Extract fourth argument (requires at least five arguments to be present) */
189
#define MCUX_CSSL_CPP_FOURTH(a, b, c, d, ...) d
190
/* Remove the first argument from the list (requires at least two arguments to be present) */
191
#define MCUX_CSSL_CPP_NEXT(...) MCUX_CSSL_CPP_NEXT_()(__VA_ARGS__)
192
#define MCUX_CSSL_CPP_NEXT_() MCUX_CSSL_CPP_NEXT__
193
#define MCUX_CSSL_CPP_NEXT__(x, ...) __VA_ARGS__
194
195
/* Check whether there is more then one argument */
196
#define MCUX_CSSL_CPP_HAS_MORE_ARGS(...) \
197
MCUX_CSSL_CPP_NOT(MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_SECOND(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER())))
198
199
#define MCUX_CSSL_CPP_HAS_ONE_ARG(...) \
200
MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_SECOND(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))
201
202
#define MCUX_CSSL_CPP_HAS_TWO_ARGS(...) \
203
MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_THIRD(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))
204
205
#define MCUX_CSSL_CPP_HAS_THREE_ARGS(...) \
206
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()))
207
208
209
/* Check whether the argument is MCUX_CSSL_CPP_MARKER(), return 1 if it is */
210
#define MCUX_CSSL_CPP_IS_MARKER(...) \
211
MCUX_CSSL_CPP_SECOND(__VA_ARGS__, 0, 0)
212
#define MCUX_CSSL_CPP_MARKER() \
213
~, 1
214
215
/* Convert any argument into a bool (either 0 or 1), by double negation */
216
#define MCUX_CSSL_CPP_BOOL(x) MCUX_CSSL_CPP_NOT(MCUX_CSSL_CPP_NOT(x))
217
218
/* Boolean negation (map value 0 to the marker, and check if we have the marker) */
219
#define MCUX_CSSL_CPP_NOT(x) MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_NOT_BOOL_, x))
220
#define MCUX_CSSL_CPP_NOT_BOOL_0 MCUX_CSSL_CPP_MARKER()
221
222
/* Convert condition to bool */
223
#define MCUX_CSSL_CPP_IF(condition) MCUX_CSSL_CPP_IF_(MCUX_CSSL_CPP_BOOL(condition))
224
/* Convert bool to decision defines */
225
#define MCUX_CSSL_CPP_IF_(condition) MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_IF_BOOL_, condition)
226
/* If 0, do nothing*/
227
#define MCUX_CSSL_CPP_IF_BOOL_0(...)
228
/* If 1, perform action */
229
#define MCUX_CSSL_CPP_IF_BOOL_1(...) __VA_ARGS__
230
231
/* Convert condition to bool */
232
#define MCUX_CSSL_CPP_IF_ELSE(condition) MCUX_CSSL_CPP_IF_ELSE_IMPL(MCUX_CSSL_CPP_BOOL(condition))
233
/* Convert bool to decision defines */
234
#define MCUX_CSSL_CPP_IF_ELSE_IMPL(condition) MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_IFE_BOOL_, condition)
235
/* If 0, ignore action */
236
#define MCUX_CSSL_CPP_IFE_BOOL_0(...) MCUX_CSSL_CPP_IFE_BOOL_0_ELSE
237
/* Else 0, perform action */
238
#define MCUX_CSSL_CPP_IFE_BOOL_0_ELSE(...) __VA_ARGS__
239
/* If 1, perform action */
240
#define MCUX_CSSL_CPP_IFE_BOOL_1(...) __VA_ARGS__ MCUX_CSSL_CPP_IFE_BOOL_1_ELSE
241
/* Else 1, ignore action */
242
243
#define MCUX_CSSL_CPP_IFE_BOOL_1_ELSE(...)
244
245
#endif
/* !defined(__IASMARM__) */
246
247
/* Defer macro expansion */
248
#define MCUX_CSSL_CPP_EMPTY()
249
#define MCUX_CSSL_CPP_DEFER1(macro) macro MCUX_CSSL_CPP_EMPTY()
250
#define MCUX_CSSL_CPP_DEFER2(macro) macro MCUX_CSSL_CPP_EMPTY MCUX_CSSL_CPP_EMPTY()()
251
252
#endif
/* MCUX_CSSL_C_PRE_PROCESSOR_H_ */
mcuxCsslCPreProcessor.h
Generated by
1.16.1