libqi-api  2.8.7.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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_