Aldebaran documentation
|
C++ Libraries
|
index
libqi-api
release-2.5.3-2016-11-18
Main Page
Related Pages
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Pages
qi
preproc.hpp
Go to the documentation of this file.
1
#pragma once
2
/*
3
* Copyright (C) 2009-2012, Aldebaran Robotics.
4
* Imported from urbi-sdk's libport.
5
*
6
*/
7
8
#ifndef _QI_PREPROC_HPP_
9
#define _QI_PREPROC_HPP_
10
11
#ifdef __cplusplus
12
# include <stdexcept>
13
#endif
14
#include <boost/preprocessor/seq/for_each.hpp>
15
#include <boost/preprocessor/seq/remove.hpp>
16
#include <boost/preprocessor/seq/transform.hpp>
17
#include <boost/preprocessor/seq/enum.hpp>
18
#include <boost/preprocessor/stringize.hpp>
19
20
# define QI_MAP_HELPER(R, Macro, Elt) (Macro(Elt))
21
# define QI_MAP(Macro, Seq) \
23
BOOST_PP_SEQ_FOR_EACH(QI_MAP_HELPER, Macro, Seq)
24
25
# define QI_APPLY_HELPER(R, Macro, Elt) Macro(Elt)
26
# define QI_APPLY(Macro, Seq) \
28
BOOST_PP_SEQ_FOR_EACH(QI_APPLY_HELPER, Macro, Seq)
29
30
31
# define QI_SEPARATE_HELPER(Elt) , Elt
32
# define QI_SEPARATE(Seq) \
34
BOOST_PP_SEQ_HEAD(Seq) \
35
QI_APPLY(QI_SEPARATE_HELPER, BOOST_PP_SEQ_TAIL(Seq))
36
38
# define QI_ENUM(Seq, Sep) \
39
BOOST_PP_SEQ_HEAD(Seq) \
40
BOOST_PP_SEQ_FOR_EACH(QI_ENUM_HELPER, Sep, BOOST_PP_SEQ_TAIL(Seq))
41
# define QI_ENUM_HELPER(Data, Sep, Elt) Sep Elt
42
45
# define QI_ENUM_PRETTY(Seq, Sep, LSep) \
46
BOOST_PP_CAT( \
47
QI_ENUM_PRETTY_, \
48
BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(Seq)), SEVERAL, ONE)) \
49
(Seq, Sep, LSep)
50
# define QI_ENUM_PRETTY_ONE(Seq, Sep, LSep) \
51
BOOST_PP_SEQ_HEAD(Seq)
52
# define QI_ENUM_PRETTY_SEVERAL(Seq, Sep, LSep) \
53
QI_ENUM(QI_RTAIL(Seq), Sep) LSep QI_RHEAD(Seq)
54
56
# define QI_RHEAD(Seq) BOOST_PP_SEQ_ELEM(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(Seq)), Seq)
57
# define QI_RTAIL(Seq) BOOST_PP_SEQ_REMOVE(Seq, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(Seq)))
59
61
# ifdef _MSC_VER
62
63
# define QI_CAT(A, B) QI_CAT_0(A, B)
64
/*
65
#!/usr/bin/python
66
67
for i in range(0, 32):
68
print '# define QI_CAT_%s(A, B) QI_CAT_%s(A, B)' % (i, i + 1)
69
*/
70
# define QI_CAT_0(A, B) QI_CAT_1(A, B)
71
# define QI_CAT_1(A, B) QI_CAT_2(A, B)
72
# define QI_CAT_2(A, B) QI_CAT_3(A, B)
73
# define QI_CAT_3(A, B) QI_CAT_4(A, B)
74
# define QI_CAT_4(A, B) QI_CAT_5(A, B)
75
# define QI_CAT_5(A, B) QI_CAT_6(A, B)
76
# define QI_CAT_6(A, B) QI_CAT_7(A, B)
77
# define QI_CAT_7(A, B) QI_CAT_8(A, B)
78
# define QI_CAT_8(A, B) QI_CAT_9(A, B)
79
# define QI_CAT_9(A, B) QI_CAT_10(A, B)
80
# define QI_CAT_10(A, B) QI_CAT_11(A, B)
81
# define QI_CAT_11(A, B) QI_CAT_12(A, B)
82
# define QI_CAT_12(A, B) QI_CAT_13(A, B)
83
# define QI_CAT_13(A, B) QI_CAT_14(A, B)
84
# define QI_CAT_14(A, B) QI_CAT_15(A, B)
85
# define QI_CAT_15(A, B) QI_CAT_16(A, B)
86
# define QI_CAT_16(A, B) QI_CAT_17(A, B)
87
# define QI_CAT_17(A, B) QI_CAT_18(A, B)
88
# define QI_CAT_18(A, B) QI_CAT_19(A, B)
89
# define QI_CAT_19(A, B) QI_CAT_20(A, B)
90
# define QI_CAT_20(A, B) QI_CAT_21(A, B)
91
# define QI_CAT_21(A, B) QI_CAT_22(A, B)
92
# define QI_CAT_22(A, B) QI_CAT_23(A, B)
93
# define QI_CAT_23(A, B) QI_CAT_24(A, B)
94
# define QI_CAT_24(A, B) QI_CAT_25(A, B)
95
# define QI_CAT_25(A, B) QI_CAT_26(A, B)
96
# define QI_CAT_26(A, B) QI_CAT_27(A, B)
97
# define QI_CAT_27(A, B) QI_CAT_28(A, B)
98
# define QI_CAT_28(A, B) QI_CAT_29(A, B)
99
# define QI_CAT_29(A, B) QI_CAT_30(A, B)
100
# define QI_CAT_30(A, B) QI_CAT_31(A, B)
101
# define QI_CAT_31(A, B) A ## B
102
# else
103
# define QI_CAT(A, B) QI_CAT_(A, B)
104
# define QI_CAT_(A, B) A ## B
105
# endif
106
108
# define __HERE \
109
__FILE__ ":" BOOST_PP_STRINGIZE(__LINE__)
110
111
# define QI_ID(...) __VA_ARGS__
112
113
# define QI_DELAY(X) X
114
115
# define QI_COMMA ,
116
117
# define QI_WRAP(...) (__VA_ARGS__)
118
119
# define QI_UNWRAP(...) QI_ID __VA_ARGS__
120
121
122
/*
123
#!/usr/bin/python
124
125
def gen(n):
126
print '#define QI_LIST_BUILD_%(max)s(%(formals)s IGNORED) %(list)s' % {
127
'formals' : ''.join(map(lambda i: 'A%s,' % i, range(n))),
128
'list' : ''.join(map(lambda i: '(A%s)' % i, range(n))),
129
'max' : n,
130
}
131
132
for i in range(10):
133
gen(i)
134
*/
135
136
#define QI_LIST_BUILD_0( IGNORED)
137
#define QI_LIST_BUILD_1(A0, IGNORED) \
138
(A0)
139
#define QI_LIST_BUILD_2(A0,A1, IGNORED) \
140
(A0)(A1)
141
#define QI_LIST_BUILD_3(A0,A1,A2, IGNORED) \
142
(A0)(A1)(A2)
143
#define QI_LIST_BUILD_4(A0,A1,A2,A3, IGNORED) \
144
(A0)(A1)(A2)(A3)
145
#define QI_LIST_BUILD_5(A0,A1,A2,A3,A4, IGNORED) \
146
(A0)(A1)(A2)(A3)(A4)
147
#define QI_LIST_BUILD_6(A0,A1,A2,A3,A4,A5, IGNORED) \
148
(A0)(A1)(A2)(A3)(A4)(A5)
149
#define QI_LIST_BUILD_7(A0,A1,A2,A3,A4,A5,A6, IGNORED) \
150
(A0)(A1)(A2)(A3)(A4)(A5)(A6)
151
#define QI_LIST_BUILD_8(A0,A1,A2,A3,A4,A5,A6,A7, IGNORED) \
152
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)
153
#define QI_LIST_BUILD_9(A0,A1,A2,A3,A4,A5,A6,A7,A8, IGNORED) \
154
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)
155
#define QI_LIST_BUILD_10(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9, IGNORED) \
156
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)
157
#define QI_LIST_BUILD_11(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10, IGNORED) \
158
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)
159
#define QI_LIST_BUILD_12(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11, IGNORED) \
160
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)
161
#define QI_LIST_BUILD_13(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12, IGNORED) \
162
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)
163
#define QI_LIST_BUILD_14(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13, IGNORED) \
164
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)
165
#define QI_LIST_BUILD_15(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14, IGNORED) \
166
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)
167
#define QI_LIST_BUILD_16(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15, IGNORED) \
168
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)
169
#define QI_LIST_BUILD_17(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16, IGNORED) \
170
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)
171
#define QI_LIST_BUILD_18(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17, IGNORED) \
172
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)
173
#define QI_LIST_BUILD_19(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18, IGNORED) \
174
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)
175
#define QI_LIST_BUILD_20(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19, IGNORED) \
176
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)
177
#define QI_LIST_BUILD_21(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20, IGNORED) \
178
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)
179
#define QI_LIST_BUILD_22(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21, IGNORED) \
180
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)(A21)
181
#define QI_LIST_BUILD_23(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22, IGNORED) \
182
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)(A21)(A22)
183
#define QI_LIST_BUILD_24(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23, IGNORED) \
184
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)(A21)(A22)(A23)
185
#define QI_LIST_BUILD_25(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24, IGNORED) \
186
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)(A21)(A22)(A23)(A24)
187
#define QI_LIST_BUILD_26(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25, IGNORED) \
188
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)(A21)(A22)(A23)(A24)(A25)
189
#define QI_LIST_BUILD_27(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26, IGNORED) \
190
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)(A21)(A22)(A23)(A24)(A25)(A26)
191
#define QI_LIST_BUILD_28(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27, IGNORED) \
192
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)(A21)(A22)(A23)(A24)(A25)(A26)(A27)
193
#define QI_LIST_BUILD_29(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27,A28, IGNORED) \
194
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)(A21)(A22)(A23)(A24)(A25)(A26)(A27)(A28)
195
#define QI_LIST_BUILD_30(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27,A28,A29, IGNORED) \
196
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)(A21)(A22)(A23)(A24)(A25)(A26)(A27)(A28)(A29)
197
#define QI_LIST_BUILD_31(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27,A28,A29,A30, IGNORED) \
198
(A0)(A1)(A2)(A3)(A4)(A5)(A6)(A7)(A8)(A9)(A10)(A11)(A12)(A13)(A14)(A15)(A16)(A17)(A18)(A19)(A20)(A21)(A22)(A23)(A24)(A25)(A26)(A27)(A28)(A29)(A30)
199
200
# ifdef _MSC_VER
201
# define QI_LIST_VASIZE_HELPER1(...) \
202
QI_DELAY(QI_LIST_VASIZE_HELPER)##2(__VA_ARGS__, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
203
# else
204
# define QI_LIST_VASIZE_HELPER1(...) \
205
QI_LIST_VASIZE_HELPER2(__VA_ARGS__, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
206
# endif
207
# define QI_LIST_VASIZE_HELPER2(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28, A29, A30, A31, A32, ...) \
208
A32
209
210
# define QI_LIST_VASIZE(List) \
211
QI_LIST_VASIZE_HELPER1 List
212
213
#define QI_LIST_HELPER(M, A) M A
214
215
#define QI_LIST(...) \
216
QI_LIST_HELPER( \
217
QI_CAT(QI_LIST_BUILD_, QI_LIST_VASIZE((__VA_ARGS__))), \
218
(__VA_ARGS__))
219
220
# define QI_LIST_SIZE(List) BOOST_PP_SEQ_SIZE(List)
221
222
# define QI_LIST_EMPTY_0 QI_TRUE
223
# define QI_LIST_EMPTY_1 QI_FALSE
224
# define QI_LIST_EMPTY_2 QI_FALSE
225
# define QI_LIST_EMPTY_3 QI_FALSE
226
# define QI_LIST_EMPTY_4 QI_FALSE
227
# define QI_LIST_EMPTY_5 QI_FALSE
228
# define QI_LIST_EMPTY_6 QI_FALSE
229
# define QI_LIST_EMPTY_7 QI_FALSE
230
# define QI_LIST_EMPTY_8 QI_FALSE
231
# define QI_LIST_EMPTY_9 QI_FALSE
232
# define QI_LIST_EMPTY_10 QI_FALSE
233
# define QI_LIST_EMPTY_11 QI_FALSE
234
# define QI_LIST_EMPTY_12 QI_FALSE
235
# define QI_LIST_EMPTY_13 QI_FALSE
236
# define QI_LIST_EMPTY_14 QI_FALSE
237
# define QI_LIST_EMPTY_15 QI_FALSE
238
# define QI_LIST_EMPTY_16 QI_FALSE
239
# define QI_LIST_EMPTY_17 QI_FALSE
240
# define QI_LIST_EMPTY_18 QI_FALSE
241
# define QI_LIST_EMPTY_19 QI_FALSE
242
# define QI_LIST_EMPTY_20 QI_FALSE
243
# define QI_LIST_EMPTY_21 QI_FALSE
244
# define QI_LIST_EMPTY_22 QI_FALSE
245
# define QI_LIST_EMPTY_23 QI_FALSE
246
# define QI_LIST_EMPTY_24 QI_FALSE
247
# define QI_LIST_EMPTY_25 QI_FALSE
248
# define QI_LIST_EMPTY_26 QI_FALSE
249
# define QI_LIST_EMPTY_27 QI_FALSE
250
# define QI_LIST_EMPTY_28 QI_FALSE
251
# define QI_LIST_EMPTY_29 QI_FALSE
252
# define QI_LIST_EMPTY_30 QI_FALSE
253
# define QI_LIST_EMPTY_31 QI_FALSE
254
# define QI_LIST_EMPTY(List) QI_CAT(QI_LIST_EMPTY_, QI_LIST_SIZE(List))
255
256
# define QI_LIST_HEAD(List) BOOST_PP_SEQ_HEAD(List)
257
258
# define QI_LIST_TAIL(List) BOOST_PP_SEQ_TAIL(List)
259
260
# define QI_LIST_MAP_HELPER(Unused, Macro, Elt) \
261
Macro(Elt)
262
# define QI_LIST_MAP(Macro, List) \
263
BOOST_PP_SEQ_TRANSFORM(QI_LIST_MAP_HELPER, Macro, List)
264
265
# define QI_LIST_MAP_AUX_HELPER(Unused, Aux, Elt) \
266
BOOST_PP_TUPLE_ELEM(2, 0, Aux)(Elt, BOOST_PP_TUPLE_ELEM(2, 1, Aux))
267
# define QI_LIST_MAP_AUX(Macro, List, Aux) \
268
BOOST_PP_SEQ_TRANSFORM(QI_LIST_MAP_AUX_HELPER, (Macro, Aux), List)
269
270
# define QI_LIST_APPLY_HELPER(Unused, Macro, Elt) \
271
Macro(Elt)
272
# define QI_LIST_APPLY(Macro, List) \
273
BOOST_PP_SEQ_FOR_EACH(QI_LIST_APPLY_HELPER, Macro, List)
274
275
# define QI_LIST_APPLY_ARGS_HELPER(Unused, Macro, Elt) \
276
Macro Elt
277
# define QI_LIST_APPLY_ARGS(Macro, List) \
278
BOOST_PP_SEQ_FOR_EACH(QI_LIST_APPLY_ARGS_HELPER, Macro, List)
279
280
# define QI_LIST_APPLY_AUX_HELPER(Unused, Aux, Elt) \
281
BOOST_PP_TUPLE_ELEM(2, 0, Aux)(Elt, BOOST_PP_TUPLE_ELEM(2, 1, Aux))
282
# define QI_LIST_APPLY_AUX(Macro, List, Aux) \
283
BOOST_PP_SEQ_FOR_EACH(QI_LIST_APPLY_AUX_HELPER, (Macro, Aux), List)
284
285
/*
286
#!/usr/bin/python
287
288
def gen(n):
289
args = {'n': n, 'n_1': n - 1,}
290
print '# define QI_LIST_NTH_%(n)s(List) BOOST_PP_CAT(QI_LIST_NTH_%(n)s_, QI_LIST_EMPTY(List))(List)' % args
291
print '# define QI_LIST_NTH_%(n)s_QI_TRUE(List)' % args
292
if n != 0:
293
print '# define QI_LIST_NTH_%(n)s_QI_FALSE(List) QI_LIST_NTH_%(n_1)s(QI_LIST_TAIL(List))' %args
294
295
for i in range(0, 10):
296
gen(i)
297
*/
298
299
# define QI_LIST_NTH_0(List) BOOST_PP_CAT(QI_LIST_NTH_0_, QI_LIST_EMPTY(List))(List)
300
# define QI_LIST_NTH_0_QI_TRUE(List)
301
# define QI_LIST_NTH_1(List) BOOST_PP_CAT(QI_LIST_NTH_1_, QI_LIST_EMPTY(List))(List)
302
# define QI_LIST_NTH_1_QI_TRUE(List)
303
# define QI_LIST_NTH_1_QI_FALSE(List) QI_LIST_NTH_0(QI_LIST_TAIL(List))
304
# define QI_LIST_NTH_2(List) BOOST_PP_CAT(QI_LIST_NTH_2_, QI_LIST_EMPTY(List))(List)
305
# define QI_LIST_NTH_2_QI_TRUE(List)
306
# define QI_LIST_NTH_2_QI_FALSE(List) QI_LIST_NTH_1(QI_LIST_TAIL(List))
307
# define QI_LIST_NTH_3(List) BOOST_PP_CAT(QI_LIST_NTH_3_, QI_LIST_EMPTY(List))(List)
308
# define QI_LIST_NTH_3_QI_TRUE(List)
309
# define QI_LIST_NTH_3_QI_FALSE(List) QI_LIST_NTH_2(QI_LIST_TAIL(List))
310
# define QI_LIST_NTH_4(List) BOOST_PP_CAT(QI_LIST_NTH_4_, QI_LIST_EMPTY(List))(List)
311
# define QI_LIST_NTH_4_QI_TRUE(List)
312
# define QI_LIST_NTH_4_QI_FALSE(List) QI_LIST_NTH_3(QI_LIST_TAIL(List))
313
# define QI_LIST_NTH_5(List) BOOST_PP_CAT(QI_LIST_NTH_5_, QI_LIST_EMPTY(List))(List)
314
# define QI_LIST_NTH_5_QI_TRUE(List)
315
# define QI_LIST_NTH_5_QI_FALSE(List) QI_LIST_NTH_4(QI_LIST_TAIL(List))
316
# define QI_LIST_NTH_6(List) BOOST_PP_CAT(QI_LIST_NTH_6_, QI_LIST_EMPTY(List))(List)
317
# define QI_LIST_NTH_6_QI_TRUE(List)
318
# define QI_LIST_NTH_6_QI_FALSE(List) QI_LIST_NTH_5(QI_LIST_TAIL(List))
319
# define QI_LIST_NTH_7(List) BOOST_PP_CAT(QI_LIST_NTH_7_, QI_LIST_EMPTY(List))(List)
320
# define QI_LIST_NTH_7_QI_TRUE(List)
321
# define QI_LIST_NTH_7_QI_FALSE(List) QI_LIST_NTH_6(QI_LIST_TAIL(List))
322
# define QI_LIST_NTH_8(List) BOOST_PP_CAT(QI_LIST_NTH_8_, QI_LIST_EMPTY(List))(List)
323
# define QI_LIST_NTH_8_QI_TRUE(List)
324
# define QI_LIST_NTH_8_QI_FALSE(List) QI_LIST_NTH_7(QI_LIST_TAIL(List))
325
# define QI_LIST_NTH_9(List) BOOST_PP_CAT(QI_LIST_NTH_9_, QI_LIST_EMPTY(List))(List)
326
# define QI_LIST_NTH_9_QI_TRUE(List)
327
# define QI_LIST_NTH_9_QI_FALSE(List) QI_LIST_NTH_8(QI_LIST_TAIL(List))
328
# define QI_LIST_NTH_10(List) BOOST_PP_CAT(QI_LIST_NTH_10_, QI_LIST_EMPTY(List))(List)
329
# define QI_LIST_NTH_10_QI_TRUE(List)
330
# define QI_LIST_NTH_10_QI_FALSE(List) QI_LIST_NTH_9(QI_LIST_TAIL(List))
331
# define QI_LIST_NTH_11(List) BOOST_PP_CAT(QI_LIST_NTH_11_, QI_LIST_EMPTY(List))(List)
332
# define QI_LIST_NTH_11_QI_TRUE(List)
333
# define QI_LIST_NTH_11_QI_FALSE(List) QI_LIST_NTH_10(QI_LIST_TAIL(List))
334
# define QI_LIST_NTH_12(List) BOOST_PP_CAT(QI_LIST_NTH_12_, QI_LIST_EMPTY(List))(List)
335
# define QI_LIST_NTH_12_QI_TRUE(List)
336
# define QI_LIST_NTH_12_QI_FALSE(List) QI_LIST_NTH_11(QI_LIST_TAIL(List))
337
# define QI_LIST_NTH_13(List) BOOST_PP_CAT(QI_LIST_NTH_13_, QI_LIST_EMPTY(List))(List)
338
# define QI_LIST_NTH_13_QI_TRUE(List)
339
# define QI_LIST_NTH_13_QI_FALSE(List) QI_LIST_NTH_12(QI_LIST_TAIL(List))
340
# define QI_LIST_NTH_14(List) BOOST_PP_CAT(QI_LIST_NTH_14_, QI_LIST_EMPTY(List))(List)
341
# define QI_LIST_NTH_14_QI_TRUE(List)
342
# define QI_LIST_NTH_14_QI_FALSE(List) QI_LIST_NTH_13(QI_LIST_TAIL(List))
343
# define QI_LIST_NTH_15(List) BOOST_PP_CAT(QI_LIST_NTH_15_, QI_LIST_EMPTY(List))(List)
344
# define QI_LIST_NTH_15_QI_TRUE(List)
345
# define QI_LIST_NTH_15_QI_FALSE(List) QI_LIST_NTH_14(QI_LIST_TAIL(List))
346
# define QI_LIST_NTH_16(List) BOOST_PP_CAT(QI_LIST_NTH_16_, QI_LIST_EMPTY(List))(List)
347
# define QI_LIST_NTH_16_QI_TRUE(List)
348
# define QI_LIST_NTH_16_QI_FALSE(List) QI_LIST_NTH_15(QI_LIST_TAIL(List))
349
# define QI_LIST_NTH_17(List) BOOST_PP_CAT(QI_LIST_NTH_17_, QI_LIST_EMPTY(List))(List)
350
# define QI_LIST_NTH_17_QI_TRUE(List)
351
# define QI_LIST_NTH_17_QI_FALSE(List) QI_LIST_NTH_16(QI_LIST_TAIL(List))
352
# define QI_LIST_NTH_18(List) BOOST_PP_CAT(QI_LIST_NTH_18_, QI_LIST_EMPTY(List))(List)
353
# define QI_LIST_NTH_18_QI_TRUE(List)
354
# define QI_LIST_NTH_18_QI_FALSE(List) QI_LIST_NTH_17(QI_LIST_TAIL(List))
355
# define QI_LIST_NTH_19(List) BOOST_PP_CAT(QI_LIST_NTH_19_, QI_LIST_EMPTY(List))(List)
356
# define QI_LIST_NTH_19_QI_TRUE(List)
357
# define QI_LIST_NTH_19_QI_FALSE(List) QI_LIST_NTH_18(QI_LIST_TAIL(List))
358
# define QI_LIST_NTH_20(List) BOOST_PP_CAT(QI_LIST_NTH_20_, QI_LIST_EMPTY(List))(List)
359
# define QI_LIST_NTH_20_QI_TRUE(List)
360
# define QI_LIST_NTH_20_QI_FALSE(List) QI_LIST_NTH_19(QI_LIST_TAIL(List))
361
# define QI_LIST_NTH_21(List) BOOST_PP_CAT(QI_LIST_NTH_21_, QI_LIST_EMPTY(List))(List)
362
# define QI_LIST_NTH_21_QI_TRUE(List)
363
# define QI_LIST_NTH_21_QI_FALSE(List) QI_LIST_NTH_20(QI_LIST_TAIL(List))
364
# define QI_LIST_NTH_22(List) BOOST_PP_CAT(QI_LIST_NTH_22_, QI_LIST_EMPTY(List))(List)
365
# define QI_LIST_NTH_22_QI_TRUE(List)
366
# define QI_LIST_NTH_22_QI_FALSE(List) QI_LIST_NTH_21(QI_LIST_TAIL(List))
367
# define QI_LIST_NTH_23(List) BOOST_PP_CAT(QI_LIST_NTH_23_, QI_LIST_EMPTY(List))(List)
368
# define QI_LIST_NTH_23_QI_TRUE(List)
369
# define QI_LIST_NTH_23_QI_FALSE(List) QI_LIST_NTH_22(QI_LIST_TAIL(List))
370
# define QI_LIST_NTH_24(List) BOOST_PP_CAT(QI_LIST_NTH_24_, QI_LIST_EMPTY(List))(List)
371
# define QI_LIST_NTH_24_QI_TRUE(List)
372
# define QI_LIST_NTH_24_QI_FALSE(List) QI_LIST_NTH_23(QI_LIST_TAIL(List))
373
# define QI_LIST_NTH_25(List) BOOST_PP_CAT(QI_LIST_NTH_25_, QI_LIST_EMPTY(List))(List)
374
# define QI_LIST_NTH_25_QI_TRUE(List)
375
# define QI_LIST_NTH_25_QI_FALSE(List) QI_LIST_NTH_24(QI_LIST_TAIL(List))
376
# define QI_LIST_NTH_26(List) BOOST_PP_CAT(QI_LIST_NTH_26_, QI_LIST_EMPTY(List))(List)
377
# define QI_LIST_NTH_26_QI_TRUE(List)
378
# define QI_LIST_NTH_26_QI_FALSE(List) QI_LIST_NTH_25(QI_LIST_TAIL(List))
379
# define QI_LIST_NTH_27(List) BOOST_PP_CAT(QI_LIST_NTH_27_, QI_LIST_EMPTY(List))(List)
380
# define QI_LIST_NTH_27_QI_TRUE(List)
381
# define QI_LIST_NTH_27_QI_FALSE(List) QI_LIST_NTH_26(QI_LIST_TAIL(List))
382
# define QI_LIST_NTH_28(List) BOOST_PP_CAT(QI_LIST_NTH_28_, QI_LIST_EMPTY(List))(List)
383
# define QI_LIST_NTH_28_QI_TRUE(List)
384
# define QI_LIST_NTH_28_QI_FALSE(List) QI_LIST_NTH_27(QI_LIST_TAIL(List))
385
# define QI_LIST_NTH_29(List) BOOST_PP_CAT(QI_LIST_NTH_29_, QI_LIST_EMPTY(List))(List)
386
# define QI_LIST_NTH_29_QI_TRUE(List)
387
# define QI_LIST_NTH_29_QI_FALSE(List) QI_LIST_NTH_28(QI_LIST_TAIL(List))
388
# define QI_LIST_NTH_30(List) BOOST_PP_CAT(QI_LIST_NTH_30_, QI_LIST_EMPTY(List))(List)
389
# define QI_LIST_NTH_30_QI_TRUE(List)
390
# define QI_LIST_NTH_30_QI_FALSE(List) QI_LIST_NTH_29(QI_LIST_TAIL(List))
391
# define QI_LIST_NTH_31(List) BOOST_PP_CAT(QI_LIST_NTH_31_, QI_LIST_EMPTY(List))(List)
392
# define QI_LIST_NTH_31_QI_TRUE(List)
393
# define QI_LIST_NTH_31_QI_FALSE(List) QI_LIST_NTH_30(QI_LIST_TAIL(List))
394
395
# define QI_LIST_NTH_0_QI_FALSE(List) QI_LIST_HEAD(List)
396
# define QI_LIST_NTH(Nth, List) BOOST_PP_CAT(QI_LIST_NTH_, Nth)(List)
397
398
# define QI_LIST_FLATTEN(List) QI_LIST_SEP(List, )
399
400
# define QI_LIST_SEP_HELPER(Elt, Sep) \
401
QI_UNWRAP(Sep) Elt
402
# define QI_LIST_SEP_QI_FALSE(List, Sep) \
403
QI_LIST_HEAD(List) \
404
QI_LIST_APPLY_AUX(QI_LIST_SEP_HELPER, QI_LIST_TAIL(List), Sep)
405
# define QI_LIST_SEP_QI_TRUE(List, Sep)
406
# define QI_LIST_SEP(List, Sep) \
407
QI_CAT(QI_LIST_SEP_, \
408
QI_LIST_EMPTY(List))(List, QI_WRAP(Sep))
409
410
# define QI_LIST_ARG_HELPER(Macro, Args) \
411
Macro Args
412
# define QI_LIST_ARG(Macro, List) \
413
QI_LIST_ARG_HELPER(Macro, (QI_LIST_SEP(List, QI_COMMA)))
414
416
#define QI_VAARGS_APPLY(Macro, Arg, ...) \
417
BOOST_PP_SEQ_FOR_EACH(Macro, Arg, \
418
QI_LIST(__VA_ARGS__,))
419
420
#define _QI_OR_00 0
421
#define _QI_OR_01 1
422
#define _QI_OR_10 1
423
#define _QI_OR_11 1
424
#define _QI_OR_I1(a, b) BOOST_PP_CAT(BOOST_PP_CAT(_QI_OR_, a), b)
425
#define _QI_OR_I2(a, b) _QI_OR_I1(a, b)
426
#define _QI_OR_I3(a, b) _QI_OR_I2(a, b)
427
#define _QI_OR_I4(a, b) _QI_OR_I3(a, b)
428
#define QI_OR(a, b) _QI_OR_I4(a, b)
429
430
#define _QI_IS_EMPTY_HELPER__ a,b
431
#define _QI_IS_ONE_HELPER__1 a,b
432
433
// To suppress a VCXX warning, the two macro below must be called with CAT(_, arg)
434
// otherwise due to evaluation ordering, code ends up calling QI_IS_ONE() which
435
// triggers a warning
436
437
//@return 1 if a is defined to 1, 0 otherwise. Must be called with CAT(_, a)
438
#define _QI_IS_ONE(a) QI_LIST_VASIZE((BOOST_PP_CAT(_QI_IS_ONE_HELPER_, a)))
439
//@return 1 if a is defined to empty, 0 otherwise. Must be called with CAT(_, a)
440
#define _QI_IS_EMPTY(a) QI_LIST_VASIZE((BOOST_PP_CAT(_QI_IS_EMPTY_HELPER, BOOST_PP_CAT(_, a))))
441
442
443
//@return 1 if a is defined to empty or 1. Return 0 otherwise. Must be called with CAT(_, a)
444
#define _QI_IS_ONE_OR_EMPTY(a) \
445
QI_OR(_QI_IS_EMPTY(a), _QI_IS_ONE(a))
446
447
448
#define _QI_GEN_ARGTYPE(z,n,_) BOOST_PP_COMMA_IF(n) P ## n
449
#define _QI_GEN_ARGDECL(z,n,_) BOOST_PP_COMMA_IF(n) P ## n p##n
450
#define _QI_GEN_ARGDECLSAMETYPE(z,n,t) BOOST_PP_COMMA_IF(n) t p##n
451
#define _QI_GEN_ARGUSE(z,n,_) BOOST_PP_COMMA_IF(n) p##n
452
#define _QI_GEN_ARGTYPEDECL(z, n, _) BOOST_PP_COMMA_IF(n) typename P##n
453
454
#define _QI_GEN_PREPOST(z, n, prepost) BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(0, prepost), n) BOOST_PP_SEQ_ELEM(1, prepost)
455
#define _QI_GEN_PREPOST2(z, n, prepost) BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(0, prepost), n) BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(1, prepost), n) BOOST_PP_SEQ_ELEM(2, prepost)
456
457
// pre 0 post pre 1 post pre 2 post...
458
#define QI_GEN_PREPOST(n, pre, post) BOOST_PP_REPEAT(n, _QI_GEN_PREPOST, (pre)(post))
459
// pre 0 mid 0 post pre 1 mid 1 post ...
460
#define QI_GEN_PREPOST2(n, pre, mid, post) BOOST_PP_REPEAT(n, _QI_GEN_PREPOST2, (pre)(mid)(post))
461
// P0, P1, ...
462
#define QI_GEN_ARGSTYPE(n) BOOST_PP_REPEAT(n, _QI_GEN_ARGTYPE, _)
463
// P0 p0, P1 p1, ...
464
#define QI_GEN_ARGSDECL(n) BOOST_PP_REPEAT(n, _QI_GEN_ARGDECL, _)
465
// p0, p1, p2 ...
466
#define QI_GEN_ARGSUSE(n) BOOST_PP_REPEAT(n, _QI_GEN_ARGUSE, _)
467
// typename P0, typename P1...
468
#define QI_GEN_ARGSTYPEDECL(n) BOOST_PP_REPEAT(n, _QI_GEN_ARGTYPEDECL, _)
469
// t p0, t p1...
470
#define QI_GEN_ARGSDECLSAMETYPE(n, t) BOOST_PP_REPEAT(n, _QI_GEN_ARGDECLSAMETYPE, t)
471
472
473
#define _QI_GEN(z, n, f) f(n, QI_GEN_ARGSTYPEDECL(n), QI_GEN_ARGSTYPE(n), QI_GEN_ARGSDECL(n), QI_GEN_ARGSUSE(n), BOOST_PP_COMMA_IF(n))
474
475
// invoke f(n, argtypedecl, argstype, argsdecl, argsuses, comma_or_empty) for n in [0, 10]
476
#define QI_GEN(f) BOOST_PP_REPEAT(10, _QI_GEN, f)
477
#define QI_GEN_RANGE(f, max) BOOST_PP_REPEAT(max, _QI_GEN, f)
478
479
// Evaluate to empty or 'template<' depending on wheter args is empty or a comma.
480
#define QI_GEN_MAYBE_TEMPLATE_OPEN(...) \
481
QI_CAT(_QI_GEN_MAYBE_TEMPLATE_OPEN_, QI_LIST_VASIZE((__VA_ARGS__)))
482
#define QI_GEN_MAYBE_TEMPLATE_CLOSE(...) \
483
QI_CAT(_QI_GEN_MAYBE_TEMPLATE_CLOSE_, QI_LIST_VASIZE((__VA_ARGS__)))
484
#define QI_GEN_MAYBE_ANGLE_OPEN(...) \
485
QI_CAT(_QI_GEN_MAYBE_ANGLE_OPEN_, QI_LIST_VASIZE((__VA_ARGS__)))
486
#define QI_GEN_MAYBE_ANGLE_CLOSE(...) \
487
QI_GEN_MAYBE_TEMPLATE_CLOSE(__VA_ARGS__)
488
489
#define QI_PAIR_FIRST(x) QI_DELAY(_QI_PAIR_FIRST)x
490
#define QI_PAIR_SECOND(x) QI_DELAY(_QI_PAIR_SECOND)x
491
#define _QI_PAIR_FIRST(x, ...) x
492
#define _QI_PAIR_SECOND(x, y) y
493
#define _QI_GEN_MAYBE_TEMPLATE_OPEN_1 template<
494
#define _QI_GEN_MAYBE_TEMPLATE_OPEN_0
495
#define _QI_GEN_MAYBE_ANGLE_OPEN_1 <
496
#define _QI_GEN_MAYBE_ANGLE_OPEN_0
497
#define _QI_GEN_MAYBE_TEMPLATE_CLOSE_1 >
498
#define _QI_GEN_MAYBE_TEMPLATE_CLOSE_0
499
// Return i+1 as a symbol
500
#define QI_GEN_SYMINC(i) BOOST_PP_CAT(_QI_GEN_SYMINC_, i)
501
#define _QI_GEN_SYMINC_9 10
502
#define _QI_GEN_SYMINC_8 9
503
#define _QI_GEN_SYMINC_7 8
504
#define _QI_GEN_SYMINC_6 7
505
#define _QI_GEN_SYMINC_5 6
506
#define _QI_GEN_SYMINC_4 5
507
#define _QI_GEN_SYMINC_3 4
508
#define _QI_GEN_SYMINC_2 3
509
#define _QI_GEN_SYMINC_1 2
510
#define _QI_GEN_SYMINC_0 1
511
512
#define _QI_IF_QI_TRUE(a) a
513
#define _QI_IF_QI_FALSE(a)
514
#define _QI_NIF_QI_TRUE(a)
515
#define _QI_NIF_QI_FALSE(a) a
516
517
518
519
#define QI_01_TO_TRUEFALSE(v) BOOST_PP_CAT(_QI_01_TO_TRUEFALSE_,v)
520
#define _QI_01_TO_TRUEFALSE_0 QI_FALSE
521
#define _QI_01_TO_TRUEFALSE_1 QI_TRUE
522
523
# ifdef _MSC_VER
524
/* Sometimes when bouncing __VA_ARGS__ around you end up with all args in the same, so use a delay-trick
525
*/
526
#define __QI_VAARGS_MAP_0(Macro, Arg, elem, ...) Macro(0, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##1(Macro, Arg, __VA_ARGS__))
527
#define __QI_VAARGS_MAP_1(Macro, Arg, elem, ...) , Macro(1, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##2(Macro, Arg, __VA_ARGS__))
528
#define __QI_VAARGS_MAP_2(Macro, Arg, elem, ...) , Macro(2, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##3(Macro, Arg, __VA_ARGS__))
529
#define __QI_VAARGS_MAP_3(Macro, Arg, elem, ...) , Macro(3, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##4(Macro, Arg, __VA_ARGS__))
530
#define __QI_VAARGS_MAP_4(Macro, Arg, elem, ...) , Macro(4, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##5(Macro, Arg, __VA_ARGS__))
531
#define __QI_VAARGS_MAP_5(Macro, Arg, elem, ...) , Macro(5, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##6(Macro, Arg, __VA_ARGS__))
532
#define __QI_VAARGS_MAP_6(Macro, Arg, elem, ...) , Macro(6, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##7(Macro, Arg, __VA_ARGS__))
533
#define __QI_VAARGS_MAP_7(Macro, Arg, elem, ...) , Macro(7, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##8(Macro, Arg, __VA_ARGS__))
534
#define __QI_VAARGS_MAP_8(Macro, Arg, elem, ...) , Macro(8, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##9(Macro, Arg, __VA_ARGS__))
535
#define __QI_VAARGS_MAP_9(Macro, Arg, elem, ...) , Macro(9, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##10(Macro, Arg, __VA_ARGS__))
536
#define __QI_VAARGS_MAP_10(Macro, Arg, elem, ...) , Macro(10, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##11(Macro, Arg, __VA_ARGS__))
537
#define __QI_VAARGS_MAP_11(Macro, Arg, elem, ...) , Macro(11, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##12(Macro, Arg, __VA_ARGS__))
538
#define __QI_VAARGS_MAP_12(Macro, Arg, elem, ...) , Macro(12, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##13(Macro, Arg, __VA_ARGS__))
539
#define __QI_VAARGS_MAP_13(Macro, Arg, elem, ...) , Macro(13, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##14(Macro, Arg, __VA_ARGS__))
540
#define __QI_VAARGS_MAP_14(Macro, Arg, elem, ...) , Macro(14, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##15(Macro, Arg, __VA_ARGS__))
541
#define __QI_VAARGS_MAP_15(Macro, Arg, elem, ...) , Macro(15, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##16(Macro, Arg, __VA_ARGS__))
542
#define __QI_VAARGS_MAP_16(Macro, Arg, elem, ...) , Macro(16, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##17(Macro, Arg, __VA_ARGS__))
543
#define __QI_VAARGS_MAP_17(Macro, Arg, elem, ...) , Macro(17, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##18(Macro, Arg, __VA_ARGS__))
544
#define __QI_VAARGS_MAP_18(Macro, Arg, elem, ...) , Macro(18, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##19(Macro, Arg, __VA_ARGS__))
545
#define __QI_VAARGS_MAP_19(Macro, Arg, elem, ...) , Macro(19, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##20(Macro, Arg, __VA_ARGS__))
546
#define __QI_VAARGS_MAP_20(Macro, Arg, elem, ...) , Macro(20, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##21(Macro, Arg, __VA_ARGS__))
547
#define __QI_VAARGS_MAP_21(Macro, Arg, elem, ...) , Macro(21, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##22(Macro, Arg, __VA_ARGS__))
548
#define __QI_VAARGS_MAP_22(Macro, Arg, elem, ...) , Macro(22, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##23(Macro, Arg, __VA_ARGS__))
549
#define __QI_VAARGS_MAP_23(Macro, Arg, elem, ...) , Macro(23, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##24(Macro, Arg, __VA_ARGS__))
550
#define __QI_VAARGS_MAP_24(Macro, Arg, elem, ...) , Macro(24, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##25(Macro, Arg, __VA_ARGS__))
551
#define __QI_VAARGS_MAP_25(Macro, Arg, elem, ...) , Macro(25, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##26(Macro, Arg, __VA_ARGS__))
552
#define __QI_VAARGS_MAP_26(Macro, Arg, elem, ...) , Macro(26, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##27(Macro, Arg, __VA_ARGS__))
553
#define __QI_VAARGS_MAP_27(Macro, Arg, elem, ...) , Macro(27, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##28(Macro, Arg, __VA_ARGS__))
554
#define __QI_VAARGS_MAP_28(Macro, Arg, elem, ...) , Macro(28, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##29(Macro, Arg, __VA_ARGS__))
555
#define __QI_VAARGS_MAP_29(Macro, Arg, elem, ...) , Macro(29, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##30(Macro, Arg, __VA_ARGS__))
556
#define __QI_VAARGS_MAP_30(Macro, Arg, elem, ...) , Macro(30, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##31(Macro, Arg, __VA_ARGS__))
557
#define __QI_VAARGS_MAP_31(Macro, Arg, elem, ...) , Macro(31, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##32(Macro, Arg, __VA_ARGS__))
558
#define __QI_VAARGS_MAP_32(Macro, Arg, elem, ...) , Macro(32, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(QI_DELAY(__QI_VAARGS_MAP_)##33(Macro, Arg, __VA_ARGS__))
559
#define __QI_VAARGS_MAP_33(Macro, Arg, elem, ...) , Macro(33, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(TOO_MANY_ARGUMENTS)
560
561
#define __QI_VAARGS_EMPTY(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, ...) QI_01_TO_TRUEFALSE(p20)
562
563
// QI_TRUE if __VA_ARGS__ has *no comma*, QI_FALSE else
564
#define QI_VAARGS_EMPTY(...) QI_DELAY(__QI_VAARGS_)##EMPTY(__VA_ARGS__, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0,1,1)
565
// expand to Macro(0, Arg, p0), Macro(1, Arg, p1), ... , Macro(N, Arg, pN)
566
#define QI_VAARGS_MAP(Macro, Arg, ...) \
567
QI_DELAY(__QI_VAARGS_MAP_)##0(Macro, Arg, __VA_ARGS__,)
568
569
#else
570
571
#define __QI_VAARGS_MAP_0(Macro, Arg, elem, ...) Macro(0, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_1(Macro, Arg, __VA_ARGS__))
572
#define __QI_VAARGS_MAP_1(Macro, Arg, elem, ...) , Macro(1, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_2(Macro, Arg, __VA_ARGS__))
573
#define __QI_VAARGS_MAP_2(Macro, Arg, elem, ...) , Macro(2, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_3(Macro, Arg, __VA_ARGS__))
574
#define __QI_VAARGS_MAP_3(Macro, Arg, elem, ...) , Macro(3, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_4(Macro, Arg, __VA_ARGS__))
575
#define __QI_VAARGS_MAP_4(Macro, Arg, elem, ...) , Macro(4, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_5(Macro, Arg, __VA_ARGS__))
576
#define __QI_VAARGS_MAP_5(Macro, Arg, elem, ...) , Macro(5, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_6(Macro, Arg, __VA_ARGS__))
577
#define __QI_VAARGS_MAP_6(Macro, Arg, elem, ...) , Macro(6, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_7(Macro, Arg, __VA_ARGS__))
578
#define __QI_VAARGS_MAP_7(Macro, Arg, elem, ...) , Macro(7, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_8(Macro, Arg, __VA_ARGS__))
579
#define __QI_VAARGS_MAP_8(Macro, Arg, elem, ...) , Macro(8, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_9(Macro, Arg, __VA_ARGS__))
580
#define __QI_VAARGS_MAP_9(Macro, Arg, elem, ...) , Macro(9, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_10(Macro, Arg, __VA_ARGS__))
581
#define __QI_VAARGS_MAP_10(Macro, Arg, elem, ...) , Macro(10, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_11(Macro, Arg, __VA_ARGS__))
582
#define __QI_VAARGS_MAP_11(Macro, Arg, elem, ...) , Macro(11, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_12(Macro, Arg, __VA_ARGS__))
583
#define __QI_VAARGS_MAP_12(Macro, Arg, elem, ...) , Macro(12, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_13(Macro, Arg, __VA_ARGS__))
584
#define __QI_VAARGS_MAP_13(Macro, Arg, elem, ...) , Macro(13, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_14(Macro, Arg, __VA_ARGS__))
585
#define __QI_VAARGS_MAP_14(Macro, Arg, elem, ...) , Macro(14, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_15(Macro, Arg, __VA_ARGS__))
586
#define __QI_VAARGS_MAP_15(Macro, Arg, elem, ...) , Macro(15, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_16(Macro, Arg, __VA_ARGS__))
587
#define __QI_VAARGS_MAP_16(Macro, Arg, elem, ...) , Macro(16, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_17(Macro, Arg, __VA_ARGS__))
588
#define __QI_VAARGS_MAP_17(Macro, Arg, elem, ...) , Macro(17, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_18(Macro, Arg, __VA_ARGS__))
589
#define __QI_VAARGS_MAP_18(Macro, Arg, elem, ...) , Macro(18, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_19(Macro, Arg, __VA_ARGS__))
590
#define __QI_VAARGS_MAP_19(Macro, Arg, elem, ...) , Macro(19, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_20(Macro, Arg, __VA_ARGS__))
591
#define __QI_VAARGS_MAP_20(Macro, Arg, elem, ...) , Macro(20, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_21(Macro, Arg, __VA_ARGS__))
592
#define __QI_VAARGS_MAP_21(Macro, Arg, elem, ...) , Macro(21, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_22(Macro, Arg, __VA_ARGS__))
593
#define __QI_VAARGS_MAP_22(Macro, Arg, elem, ...) , Macro(22, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_23(Macro, Arg, __VA_ARGS__))
594
#define __QI_VAARGS_MAP_23(Macro, Arg, elem, ...) , Macro(23, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_24(Macro, Arg, __VA_ARGS__))
595
#define __QI_VAARGS_MAP_24(Macro, Arg, elem, ...) , Macro(24, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_25(Macro, Arg, __VA_ARGS__))
596
#define __QI_VAARGS_MAP_25(Macro, Arg, elem, ...) , Macro(25, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_26(Macro, Arg, __VA_ARGS__))
597
#define __QI_VAARGS_MAP_26(Macro, Arg, elem, ...) , Macro(26, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_27(Macro, Arg, __VA_ARGS__))
598
#define __QI_VAARGS_MAP_27(Macro, Arg, elem, ...) , Macro(27, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_28(Macro, Arg, __VA_ARGS__))
599
#define __QI_VAARGS_MAP_28(Macro, Arg, elem, ...) , Macro(28, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_29(Macro, Arg, __VA_ARGS__))
600
#define __QI_VAARGS_MAP_29(Macro, Arg, elem, ...) , Macro(29, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_30(Macro, Arg, __VA_ARGS__))
601
#define __QI_VAARGS_MAP_30(Macro, Arg, elem, ...) , Macro(30, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_31(Macro, Arg, __VA_ARGS__))
602
#define __QI_VAARGS_MAP_31(Macro, Arg, elem, ...) , Macro(31, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_32(Macro, Arg, __VA_ARGS__))
603
#define __QI_VAARGS_MAP_32(Macro, Arg, elem, ...) , Macro(32, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(__QI_VAARGS_MAP_33(Macro, Arg, __VA_ARGS__))
604
#define __QI_VAARGS_MAP_33(Macro, Arg, elem, ...) , Macro(33, Arg, elem) QI_CAT(_QI_NIF_,QI_VAARGS_EMPTY(__VA_ARGS__))(TOO_MANY_ARGUMENTS)
605
606
#define __QI_VAARGS_EMPTY(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, ...) QI_01_TO_TRUEFALSE(p20)
607
609
#define QI_VAARGS_EMPTY(...) __QI_VAARGS_EMPTY(__VA_ARGS__, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 0,1,1)
610
#define QI_VAARGS_MAP(Macro, Arg, ...) \
612
__QI_VAARGS_MAP_0(Macro, Arg, __VA_ARGS__,)
613
614
#endif
615
616
#define __QI_CONVERT_ENUM_ELEMENT_TOSTRING_CASE(type, data, element) \
617
case element: \
618
return BOOST_PP_STRINGIZE(element);
619
620
#define QI_CREATE_ENUM_WITH_STRING_CONVERSION(funcName, type, values) \
621
enum type \
622
{ \
623
BOOST_PP_SEQ_ENUM(values) \
624
}; \
625
inline const char* funcName(type val) \
626
{ \
627
switch (val) \
628
{ \
629
BOOST_PP_SEQ_FOR_EACH( \
630
__QI_CONVERT_ENUM_ELEMENT_TOSTRING_CASE, \
631
type, \
632
values \
633
) \
634
} \
635
throw std::invalid_argument( \
636
"Unknown enum: " BOOST_PP_STRINGIZE(type) \
637
" value: " BOOST_PP_STRINGIZE(val)); \
638
}
639
640
#endif // _QI_PREPROC_HPP_
Copyright Aldebaran Robotics