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 Proprietary. 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 */
10/* license terms, then you may not retain, install, activate or otherwise */
11/* use the 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_64TO0() \
45 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, \
46 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, \
47 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, \
48 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
49
50#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_5TO0() \
51 n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
52 n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
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, 5, 4, 3, 2, 1, 0
55
56#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_4TO0() \
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, n, n, n, \
59 n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
60 n, n, n, n, n, n, n, n, n, n, n, n, 4, 3, 2, 1, 0
61
62#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_3TO0() \
63 n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
64 n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
65 n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
66 n, n, n, n, n, n, n, n, n, n, n, n, n, 3, 2, 1, 0
67
68#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_2TO0() \
69 n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
70 n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
71 n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \
72 n, n, n, n, n, n, n, n, n, n, n, n, n, n, 2, 1, 0
73
74#define MCUX_CSSL_CPP_ARG_N( \
75 _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \
76 _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, \
77 _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, \
78 _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, \
79 N, ...) \
80 N
81
82#define MCUX_CSSL_CPP_ARGCOUNT_IMPL(...) \
83 MCUX_CSSL_CPP_ARG_N(__VA_ARGS__)
84
85#define MCUX_CSSL_CPP_ARGCOUNT(...) \
86 MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_64TO0())
87
88#define MCUX_CSSL_CPP_ARGCOUNT_2N(...) \
89 MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_2TO0())
90
91#define MCUX_CSSL_CPP_ARGCOUNT_3N(...) \
92 MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_3TO0())
93
94#define MCUX_CSSL_CPP_ARGCOUNT_4N(...) \
95 MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_4TO0())
96
97#define MCUX_CSSL_CPP_ARGCOUNT_5N(...) \
98 MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_5TO0())
99
100#define MCUX_CSSL_CPP_OVERLOADED_IMPL(name, n) MCUX_CSSL_CPP_CAT_IMPL(name, n)
101
102#define MCUX_CSSL_CPP_OVERLOADED(name, ...) \
103 MCUX_CSSL_CPP_DEFER2(MCUX_CSSL_CPP_OVERLOADED_IMPL)()(name, MCUX_CSSL_CPP_ARGCOUNT(__VA_ARGS__))
104
105#define MCUX_CSSL_CPP_OVERLOADED1(name, ...) \
106 MCUX_CSSL_CPP_IF_ELSE(MCUX_CSSL_CPP_HAS_ONE_ARG(__VA_ARGS__))( \
107 /* If only one arg, use the 1 version */ \
108 MCUX_CSSL_CPP_CAT(name,1)(MCUX_CSSL_CPP_FIRST(__VA_ARGS__, /* ensure extra argument: */ 0)) \
109 )( \
110 /* Otherwise the n version */ \
111 MCUX_CSSL_CPP_CAT(name,n)(__VA_ARGS__) \
112 )
113
114#define MCUX_CSSL_CPP_OVERLOADED2(name, ...) \
115 MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_2N(__VA_ARGS__))(__VA_ARGS__)
116
117#define MCUX_CSSL_CPP_OVERLOADED3(name, ...) \
118 MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_3N(__VA_ARGS__))(__VA_ARGS__)
119
120#define MCUX_CSSL_CPP_OVERLOADED4(name, ...) \
121 MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_4N(__VA_ARGS__))(__VA_ARGS__)
122
123#define MCUX_CSSL_CPP_OVERLOADED5(name, ...) \
124 MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_5N(__VA_ARGS__))(__VA_ARGS__)
125
126/*****************************************************************************
127 * Helper macros *
128 *****************************************************************************/
129
130/* Apply a macro to all arguments */
131#define MCUX_CSSL_CPP_MAP(__macro, ...) \
132 MCUX_CSSL_CPP_EVAL(MCUX_CSSL_CPP_MAP_IMPL(__macro, __VA_ARGS__))
133
134/* Evaluate a complex macro (which needs multiple expansions to be processed) */
135#define MCUX_CSSL_CPP_EVAL(...) MCUX_CSSL_CPP_EVAL1024(__VA_ARGS__)
136#define MCUX_CSSL_CPP_EVAL1024(...) MCUX_CSSL_CPP_EVAL512(MCUX_CSSL_CPP_EVAL512(__VA_ARGS__))
137#define MCUX_CSSL_CPP_EVAL512(...) MCUX_CSSL_CPP_EVAL256(MCUX_CSSL_CPP_EVAL256(__VA_ARGS__))
138#define MCUX_CSSL_CPP_EVAL256(...) MCUX_CSSL_CPP_EVAL128(MCUX_CSSL_CPP_EVAL128(__VA_ARGS__))
139#define MCUX_CSSL_CPP_EVAL128(...) MCUX_CSSL_CPP_EVAL64( MCUX_CSSL_CPP_EVAL64( __VA_ARGS__))
140#define MCUX_CSSL_CPP_EVAL64(...) MCUX_CSSL_CPP_EVAL32( MCUX_CSSL_CPP_EVAL32( __VA_ARGS__))
141#define MCUX_CSSL_CPP_EVAL32(...) MCUX_CSSL_CPP_EVAL16( MCUX_CSSL_CPP_EVAL16( __VA_ARGS__))
142#define MCUX_CSSL_CPP_EVAL16(...) MCUX_CSSL_CPP_EVAL8( MCUX_CSSL_CPP_EVAL8( __VA_ARGS__))
143#define MCUX_CSSL_CPP_EVAL8(...) MCUX_CSSL_CPP_EVAL4( MCUX_CSSL_CPP_EVAL4( __VA_ARGS__))
144#define MCUX_CSSL_CPP_EVAL4(...) MCUX_CSSL_CPP_EVAL2( MCUX_CSSL_CPP_EVAL2( __VA_ARGS__))
145#define MCUX_CSSL_CPP_EVAL2(...) MCUX_CSSL_CPP_EVAL1( MCUX_CSSL_CPP_EVAL1( __VA_ARGS__))
146#define MCUX_CSSL_CPP_EVAL1(...) __VA_ARGS__
147
148/* Recursive definition of map macro, assumes at least one argument */
149#define MCUX_CSSL_CPP_MAP_IMPL(__macro, ...) \
150 /* Apply the macro to the first argument from the list */\
151 __macro(MCUX_CSSL_CPP_FIRST(__VA_ARGS__, /* ensure second argument: */ 0)) \
152 /* Only proceed if there are additional arguments */\
153 MCUX_CSSL_CPP_IF(MCUX_CSSL_CPP_HAS_MORE_ARGS(__VA_ARGS__))( \
154 /* Recursive call for remaining arguments */\
155 MCUX_CSSL_CPP_DEFER2(MCUX_CSSL_CPP_MAP_IMPL_)()(__macro, \
156 MCUX_CSSL_CPP_NEXT(__VA_ARGS__)) \
157 )
158#define MCUX_CSSL_CPP_MAP_IMPL_() MCUX_CSSL_CPP_MAP_IMPL
159
160/* Extract first argument (requires at least two arguments to be present) */
161#define MCUX_CSSL_CPP_FIRST(a, ...) a
162/* Extract second argument (requires at least three arguments to be present) */
163#define MCUX_CSSL_CPP_SECOND(a, b, ...) b
164/* Extract third argument (requires at least four arguments to be present) */
165#define MCUX_CSSL_CPP_THIRD(a, b, c, ...) c
166/* Extract fourth argument (requires at least five arguments to be present) */
167#define MCUX_CSSL_CPP_FOURTH(a, b, c, d, ...) d
168/* Remove the first argument from the list (requires at least two arguments to be present) */
169#define MCUX_CSSL_CPP_NEXT(...) MCUX_CSSL_CPP_NEXT_()(__VA_ARGS__)
170#define MCUX_CSSL_CPP_NEXT_() MCUX_CSSL_CPP_NEXT__
171#define MCUX_CSSL_CPP_NEXT__(x, ...) __VA_ARGS__
172
173/* Check whether there is more then one argument */
174#define MCUX_CSSL_CPP_HAS_MORE_ARGS(...) \
175 MCUX_CSSL_CPP_NOT(MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_SECOND(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER())))
176
177#define MCUX_CSSL_CPP_HAS_ONE_ARG(...) \
178 MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_SECOND(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))
179
180#define MCUX_CSSL_CPP_HAS_TWO_ARGS(...) \
181 MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_THIRD(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))
182
183#define MCUX_CSSL_CPP_HAS_THREE_ARGS(...) \
184 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()))
185
186
187/* Check whether the argument is MCUX_CSSL_CPP_MARKER(), return 1 if it is */
188#define MCUX_CSSL_CPP_IS_MARKER(...) \
189 MCUX_CSSL_CPP_SECOND(__VA_ARGS__, 0, 0)
190#define MCUX_CSSL_CPP_MARKER() \
191 ~, 1
192
193/* Convert any argument into a bool (either 0 or 1), by double negation */
194#define MCUX_CSSL_CPP_BOOL(x) MCUX_CSSL_CPP_NOT(MCUX_CSSL_CPP_NOT(x))
195
196/* Boolean negation (map value 0 to the marker, and check if we have the marker) */
197#define MCUX_CSSL_CPP_NOT(x) MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_NOT_BOOL_, x))
198#define MCUX_CSSL_CPP_NOT_BOOL_0 MCUX_CSSL_CPP_MARKER()
199
200/* Convert condition to bool */
201#define MCUX_CSSL_CPP_IF(condition) MCUX_CSSL_CPP_IF_(MCUX_CSSL_CPP_BOOL(condition))
202/* Convert bool to decision defines */
203#define MCUX_CSSL_CPP_IF_(condition) MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_IF_BOOL_, condition)
204/* If 0, do nothing*/
205#define MCUX_CSSL_CPP_IF_BOOL_0(...)
206/* If 1, perform action */
207#define MCUX_CSSL_CPP_IF_BOOL_1(...) __VA_ARGS__
208
209/* Convert condition to bool */
210#define MCUX_CSSL_CPP_IF_ELSE(condition) MCUX_CSSL_CPP_IF_ELSE_IMPL(MCUX_CSSL_CPP_BOOL(condition))
211/* Convert bool to decision defines */
212#define MCUX_CSSL_CPP_IF_ELSE_IMPL(condition) MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_IFE_BOOL_, condition)
213/* If 0, ignore action */
214#define MCUX_CSSL_CPP_IFE_BOOL_0(...) MCUX_CSSL_CPP_IFE_BOOL_0_ELSE
215/* Else 0, perform action */
216#define MCUX_CSSL_CPP_IFE_BOOL_0_ELSE(...) __VA_ARGS__
217/* If 1, perform action */
218#define MCUX_CSSL_CPP_IFE_BOOL_1(...) __VA_ARGS__ MCUX_CSSL_CPP_IFE_BOOL_1_ELSE
219/* Else 1, ignore action */
220
221#define MCUX_CSSL_CPP_IFE_BOOL_1_ELSE(...)
222
223/* Defer macro expansion */
224#define MCUX_CSSL_CPP_EMPTY()
225#define MCUX_CSSL_CPP_DEFER1(macro) macro MCUX_CSSL_CPP_EMPTY()
226#define MCUX_CSSL_CPP_DEFER2(macro) macro MCUX_CSSL_CPP_EMPTY MCUX_CSSL_CPP_EMPTY()()
227
228#endif /* MCUX_CSSL_C_PRE_PROCESSOR_H_ */