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
/* 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_5TO0() \
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, 5, 4, 3, 2, 1, 0
51
52
#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_4TO0() \
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, 4, 3, 2, 1, 0
55
56
#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_3TO0() \
57
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
58
n, n, n, n, n, n, n, n, n, n, n, n, n, 3, 2, 1, 0
59
60
#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_2TO0() \
61
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
62
n, n, n, n, n, n, n, n, n, n, n, n, n, n, 2, 1, 0
63
64
#define MCUX_CSSL_CPP_ARG_N( \
65
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, \
66
_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, \
67
N, ...) \
68
N
69
70
#define MCUX_CSSL_CPP_ARGCOUNT_IMPL(...) \
71
MCUX_CSSL_CPP_ARG_N(__VA_ARGS__)
72
73
#define MCUX_CSSL_CPP_ARGCOUNT(...) \
74
MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_32TO0())
75
76
#define MCUX_CSSL_CPP_ARGCOUNT_2N(...) \
77
MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_2TO0())
78
79
#define MCUX_CSSL_CPP_ARGCOUNT_3N(...) \
80
MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_3TO0())
81
82
#define MCUX_CSSL_CPP_ARGCOUNT_4N(...) \
83
MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_4TO0())
84
85
#define MCUX_CSSL_CPP_ARGCOUNT_5N(...) \
86
MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_5TO0())
87
88
#define MCUX_CSSL_CPP_OVERLOADED_IMPL(name, n) MCUX_CSSL_CPP_CAT_IMPL(name, n)
89
90
#define MCUX_CSSL_CPP_OVERLOADED(name, ...) \
91
MCUX_CSSL_CPP_DEFER2(MCUX_CSSL_CPP_OVERLOADED_IMPL)()(name, MCUX_CSSL_CPP_ARGCOUNT(__VA_ARGS__))
92
93
#define MCUX_CSSL_CPP_OVERLOADED1(name, ...) \
94
MCUX_CSSL_CPP_IF_ELSE(MCUX_CSSL_CPP_HAS_ONE_ARG(__VA_ARGS__))( \
95
/* If only one arg, use the 1 version */
\
96
MCUX_CSSL_CPP_CAT(name,1)(MCUX_CSSL_CPP_FIRST(__VA_ARGS__,
/* ensure extra argument: */
0)) \
97
)( \
98
/* Otherwise the n version */
\
99
MCUX_CSSL_CPP_CAT(name,n)(__VA_ARGS__) \
100
)
101
102
#define MCUX_CSSL_CPP_OVERLOADED2(name, ...) \
103
MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_2N(__VA_ARGS__))(__VA_ARGS__)
104
105
#define MCUX_CSSL_CPP_OVERLOADED3(name, ...) \
106
MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_3N(__VA_ARGS__))(__VA_ARGS__)
107
108
#define MCUX_CSSL_CPP_OVERLOADED4(name, ...) \
109
MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_4N(__VA_ARGS__))(__VA_ARGS__)
110
111
#define MCUX_CSSL_CPP_OVERLOADED5(name, ...) \
112
MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_5N(__VA_ARGS__))(__VA_ARGS__)
113
114
/*****************************************************************************
115
* Helper macros *
116
*****************************************************************************/
117
118
/* Apply a macro to all arguments */
119
#define MCUX_CSSL_CPP_MAP(__macro, ...) \
120
MCUX_CSSL_CPP_EVAL(MCUX_CSSL_CPP_MAP_IMPL(__macro, __VA_ARGS__))
121
122
/* Evaluate a complex macro (which needs multiple expansions to be processed) */
123
#define MCUX_CSSL_CPP_EVAL(...) MCUX_CSSL_CPP_EVAL1024(__VA_ARGS__)
124
#define MCUX_CSSL_CPP_EVAL1024(...) MCUX_CSSL_CPP_EVAL512(MCUX_CSSL_CPP_EVAL512(__VA_ARGS__))
125
#define MCUX_CSSL_CPP_EVAL512(...) MCUX_CSSL_CPP_EVAL256(MCUX_CSSL_CPP_EVAL256(__VA_ARGS__))
126
#define MCUX_CSSL_CPP_EVAL256(...) MCUX_CSSL_CPP_EVAL128(MCUX_CSSL_CPP_EVAL128(__VA_ARGS__))
127
#define MCUX_CSSL_CPP_EVAL128(...) MCUX_CSSL_CPP_EVAL64( MCUX_CSSL_CPP_EVAL64( __VA_ARGS__))
128
#define MCUX_CSSL_CPP_EVAL64(...) MCUX_CSSL_CPP_EVAL32( MCUX_CSSL_CPP_EVAL32( __VA_ARGS__))
129
#define MCUX_CSSL_CPP_EVAL32(...) MCUX_CSSL_CPP_EVAL16( MCUX_CSSL_CPP_EVAL16( __VA_ARGS__))
130
#define MCUX_CSSL_CPP_EVAL16(...) MCUX_CSSL_CPP_EVAL8( MCUX_CSSL_CPP_EVAL8( __VA_ARGS__))
131
#define MCUX_CSSL_CPP_EVAL8(...) MCUX_CSSL_CPP_EVAL4( MCUX_CSSL_CPP_EVAL4( __VA_ARGS__))
132
#define MCUX_CSSL_CPP_EVAL4(...) MCUX_CSSL_CPP_EVAL2( MCUX_CSSL_CPP_EVAL2( __VA_ARGS__))
133
#define MCUX_CSSL_CPP_EVAL2(...) MCUX_CSSL_CPP_EVAL1( MCUX_CSSL_CPP_EVAL1( __VA_ARGS__))
134
#define MCUX_CSSL_CPP_EVAL1(...) __VA_ARGS__
135
136
/* Recursive definition of map macro, assumes at least one argument */
137
#define MCUX_CSSL_CPP_MAP_IMPL(__macro, ...) \
138
/* Apply the macro to the first argument from the list */
\
139
__macro(MCUX_CSSL_CPP_FIRST(__VA_ARGS__,
/* ensure second argument: */
0)) \
140
/* Only proceed if there are additional arguments */
\
141
MCUX_CSSL_CPP_IF(MCUX_CSSL_CPP_HAS_MORE_ARGS(__VA_ARGS__))( \
142
/* Recursive call for remaining arguments */
\
143
MCUX_CSSL_CPP_DEFER2(MCUX_CSSL_CPP_MAP_IMPL_)()(__macro, \
144
MCUX_CSSL_CPP_NEXT(__VA_ARGS__)) \
145
)
146
#define MCUX_CSSL_CPP_MAP_IMPL_() MCUX_CSSL_CPP_MAP_IMPL
147
148
/* Extract first argument (requires at least two arguments to be present) */
149
#define MCUX_CSSL_CPP_FIRST(a, ...) a
150
/* Extract second argument (requires at least three arguments to be present) */
151
#define MCUX_CSSL_CPP_SECOND(a, b, ...) b
152
/* Extract third argument (requires at least four arguments to be present) */
153
#define MCUX_CSSL_CPP_THIRD(a, b, c, ...) c
154
/* Extract fourth argument (requires at least five arguments to be present) */
155
#define MCUX_CSSL_CPP_FOURTH(a, b, c, d, ...) d
156
/* Remove the first argument from the list (requires at least two arguments to be present) */
157
#define MCUX_CSSL_CPP_NEXT(...) MCUX_CSSL_CPP_NEXT_()(__VA_ARGS__)
158
#define MCUX_CSSL_CPP_NEXT_() MCUX_CSSL_CPP_NEXT__
159
#define MCUX_CSSL_CPP_NEXT__(x, ...) __VA_ARGS__
160
161
/* Check whether there is more then one argument */
162
#define MCUX_CSSL_CPP_HAS_MORE_ARGS(...) \
163
MCUX_CSSL_CPP_NOT(MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_SECOND(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER())))
164
165
#define MCUX_CSSL_CPP_HAS_ONE_ARG(...) \
166
MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_SECOND(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))
167
168
#define MCUX_CSSL_CPP_HAS_TWO_ARGS(...) \
169
MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_THIRD(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))
170
171
#define MCUX_CSSL_CPP_HAS_THREE_ARGS(...) \
172
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()))
173
174
175
/* Check whether the argument is MCUX_CSSL_CPP_MARKER(), return 1 if it is */
176
#define MCUX_CSSL_CPP_IS_MARKER(...) \
177
MCUX_CSSL_CPP_SECOND(__VA_ARGS__, 0, 0)
178
#define MCUX_CSSL_CPP_MARKER() \
179
~, 1
180
181
/* Convert any argument into a bool (either 0 or 1), by double negation */
182
#define MCUX_CSSL_CPP_BOOL(x) MCUX_CSSL_CPP_NOT(MCUX_CSSL_CPP_NOT(x))
183
184
/* Boolean negation (map value 0 to the marker, and check if we have the marker) */
185
#define MCUX_CSSL_CPP_NOT(x) MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_NOT_BOOL_, x))
186
#define MCUX_CSSL_CPP_NOT_BOOL_0 MCUX_CSSL_CPP_MARKER()
187
188
/* Convert condition to bool */
189
#define MCUX_CSSL_CPP_IF(condition) MCUX_CSSL_CPP_IF_(MCUX_CSSL_CPP_BOOL(condition))
190
/* Convert bool to decision defines */
191
#define MCUX_CSSL_CPP_IF_(condition) MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_IF_BOOL_, condition)
192
/* If 0, do nothing*/
193
#define MCUX_CSSL_CPP_IF_BOOL_0(...)
194
/* If 1, perform action */
195
#define MCUX_CSSL_CPP_IF_BOOL_1(...) __VA_ARGS__
196
197
/* Convert condition to bool */
198
#define MCUX_CSSL_CPP_IF_ELSE(condition) MCUX_CSSL_CPP_IF_ELSE_IMPL(MCUX_CSSL_CPP_BOOL(condition))
199
/* Convert bool to decision defines */
200
#define MCUX_CSSL_CPP_IF_ELSE_IMPL(condition) MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_IFE_BOOL_, condition)
201
/* If 0, ignore action */
202
#define MCUX_CSSL_CPP_IFE_BOOL_0(...) MCUX_CSSL_CPP_IFE_BOOL_0_ELSE
203
/* Else 0, perform action */
204
#define MCUX_CSSL_CPP_IFE_BOOL_0_ELSE(...) __VA_ARGS__
205
/* If 1, perform action */
206
#define MCUX_CSSL_CPP_IFE_BOOL_1(...) __VA_ARGS__ MCUX_CSSL_CPP_IFE_BOOL_1_ELSE
207
/* Else 1, ignore action */
208
209
#define MCUX_CSSL_CPP_IFE_BOOL_1_ELSE(...)
210
211
/* Defer macro expansion */
212
#define MCUX_CSSL_CPP_EMPTY()
213
#define MCUX_CSSL_CPP_DEFER1(macro) macro MCUX_CSSL_CPP_EMPTY()
214
#define MCUX_CSSL_CPP_DEFER2(macro) macro MCUX_CSSL_CPP_EMPTY MCUX_CSSL_CPP_EMPTY()()
215
216
#endif
/* MCUX_CSSL_C_PRE_PROCESSOR_H_ */
mcuxCsslCPreProcessor.h
Generated by
1.9.7