]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/vmd/detail/mods.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / vmd / detail / mods.hpp
1
2 // (C) Copyright Edward Diener 2011-2015
3 // Use, modification and distribution are subject to the Boost Software License,
4 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt).
6
7 #if !defined(BOOST_VMD_DETAIL_MODS_HPP)
8 #define BOOST_VMD_DETAIL_MODS_HPP
9
10 #include <boost/preprocessor/arithmetic/inc.hpp>
11 #include <boost/preprocessor/comparison/equal.hpp>
12 #include <boost/preprocessor/comparison/greater.hpp>
13 #include <boost/preprocessor/control/iif.hpp>
14 #include <boost/preprocessor/control/while.hpp>
15 #include <boost/preprocessor/punctuation/is_begin_parens.hpp>
16 #include <boost/preprocessor/tuple/elem.hpp>
17 #include <boost/preprocessor/tuple/pop_front.hpp>
18 #include <boost/preprocessor/tuple/push_back.hpp>
19 #include <boost/preprocessor/tuple/replace.hpp>
20 #include <boost/preprocessor/tuple/size.hpp>
21 #include <boost/preprocessor/variadic/to_tuple.hpp>
22 #include <boost/vmd/identity.hpp>
23 #include <boost/vmd/is_empty.hpp>
24 #include <boost/vmd/is_type.hpp>
25 #include <boost/vmd/detail/modifiers.hpp>
26
27 #define BOOST_VMD_DETAIL_MODS_NO_RETURN 0
28 #define BOOST_VMD_DETAIL_MODS_RETURN 1
29 #define BOOST_VMD_DETAIL_MODS_RETURN_TUPLE 2
30 #define BOOST_VMD_DETAIL_MODS_RETURN_ARRAY 3
31 #define BOOST_VMD_DETAIL_MODS_RETURN_LIST 4
32 #define BOOST_VMD_DETAIL_MODS_NO_AFTER 0
33 #define BOOST_VMD_DETAIL_MODS_RETURN_AFTER 1
34 #define BOOST_VMD_DETAIL_MODS_NO_INDEX 0
35 #define BOOST_VMD_DETAIL_MODS_RETURN_INDEX 1
36 #define BOOST_VMD_DETAIL_MODS_NO_ONLY_AFTER 0
37 #define BOOST_VMD_DETAIL_MODS_RETURN_ONLY_AFTER 1
38
39 #define BOOST_VMD_DETAIL_MODS_TUPLE_RETURN 0
40 #define BOOST_VMD_DETAIL_MODS_TUPLE_AFTER 1
41 #define BOOST_VMD_DETAIL_MODS_TUPLE_INDEX 2
42 #define BOOST_VMD_DETAIL_MODS_TUPLE_OTHER 3
43 #define BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER 4
44 #define BOOST_VMD_DETAIL_MODS_TUPLE_TYPE 5
45
46 #define BOOST_VMD_DETAIL_MODS_DATA_INPUT 0
47 #define BOOST_VMD_DETAIL_MODS_DATA_INDEX 1
48 #define BOOST_VMD_DETAIL_MODS_DATA_SIZE 2
49 #define BOOST_VMD_DETAIL_MODS_DATA_RESULT 3
50 #define BOOST_VMD_DETAIL_MODS_DATA_ALLOW 4
51
52 #define BOOST_VMD_DETAIL_MODS_STATE_INPUT(state) \
53 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_INPUT,state) \
54 /**/
55
56 #define BOOST_VMD_DETAIL_MODS_STATE_INDEX(state) \
57 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_INDEX,state) \
58 /**/
59
60 #define BOOST_VMD_DETAIL_MODS_STATE_SIZE(state) \
61 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_SIZE,state) \
62 /**/
63
64 #define BOOST_VMD_DETAIL_MODS_STATE_RESULT(state) \
65 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_RESULT,state) \
66 /**/
67
68 #define BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state) \
69 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_ALLOW,state) \
70 /**/
71
72 #define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state) \
73 BOOST_VMD_DETAIL_IS_ALLOW_ALL(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
74 /**/
75
76 #define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_RETURN(state) \
77 BOOST_VMD_DETAIL_IS_ALLOW_RETURN(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
78 /**/
79
80 #define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_AFTER(state) \
81 BOOST_VMD_DETAIL_IS_ALLOW_AFTER(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
82 /**/
83
84 #define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_INDEX(state) \
85 BOOST_VMD_DETAIL_IS_ALLOW_INDEX(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
86 /**/
87
88 #define BOOST_VMD_DETAIL_MODS_STATE_CURRENT(state) \
89 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_STATE_INDEX(state),BOOST_VMD_DETAIL_MODS_STATE_INPUT(state)) \
90 /**/
91
92 #define BOOST_VMD_DETAIL_MODS_STATE_TYPE(state) \
93 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_RETURN,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
94 /**/
95
96 #define BOOST_VMD_DETAIL_MODS_STATE_AFTER(state) \
97 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_AFTER,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
98 /**/
99
100 #define BOOST_VMD_DETAIL_MODS_STATE_ONLY_AFTER(state) \
101 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
102 /**/
103
104 #define BOOST_VMD_DETAIL_MODS_STATE_TINDEX(state) \
105 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_INDEX,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
106 /**/
107
108 #define BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE(result) \
109 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_RETURN,result) \
110 /**/
111
112 #define BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(result) \
113 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_AFTER,result) \
114 /**/
115
116 #define BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(result) \
117 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER,result) \
118 /**/
119
120 #define BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(result) \
121 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_INDEX,result) \
122 /**/
123
124 #define BOOST_VMD_DETAIL_MODS_RESULT_OTHER(result) \
125 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_OTHER,result) \
126 /**/
127
128 #define BOOST_VMD_DETAIL_MODS_RESULT_TYPE(result) \
129 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_TYPE,result) \
130 /**/
131
132 #define BOOST_VMD_DETAIL_MODS_PRED(d,state) \
133 BOOST_PP_GREATER_D(d,BOOST_VMD_DETAIL_MODS_STATE_SIZE(state),BOOST_VMD_DETAIL_MODS_STATE_INDEX(state))
134 /**/
135
136 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,number) \
137 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
138 ( \
139 d, \
140 BOOST_PP_TUPLE_REPLACE_D \
141 ( \
142 d, \
143 state, \
144 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
145 BOOST_PP_TUPLE_REPLACE_D \
146 ( \
147 d, \
148 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
149 BOOST_VMD_DETAIL_MODS_TUPLE_RETURN, \
150 number \
151 ) \
152 ) \
153 ) \
154 /**/
155
156 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER(d,state,id) \
157 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
158 ( \
159 d, \
160 BOOST_PP_TUPLE_REPLACE_D \
161 ( \
162 d, \
163 state, \
164 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
165 BOOST_PP_TUPLE_REPLACE_D \
166 ( \
167 d, \
168 BOOST_PP_TUPLE_REPLACE_D \
169 ( \
170 d, \
171 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
172 BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER, \
173 1 \
174 ), \
175 BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
176 1 \
177 ) \
178 ) \
179 ) \
180 /**/
181
182 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,number) \
183 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
184 ( \
185 d, \
186 BOOST_PP_TUPLE_REPLACE_D \
187 ( \
188 d, \
189 state, \
190 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
191 BOOST_PP_TUPLE_REPLACE_D \
192 ( \
193 d, \
194 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
195 BOOST_VMD_DETAIL_MODS_TUPLE_INDEX, \
196 number \
197 ) \
198 ) \
199 ) \
200 /**/
201
202 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT(d,state,id) \
203 BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE) \
204 /**/
205
206 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET(d,state,id) \
207 BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN) \
208 /**/
209
210 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA(d,state,id) \
211 BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY) \
212 /**/
213
214 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL(d,state,id) \
215 BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_LIST) \
216 /**/
217
218 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT(d,state,id) \
219 BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_NO_RETURN) \
220 /**/
221
222 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT(d,state,id) \
223 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
224 ( \
225 d, \
226 BOOST_PP_TUPLE_REPLACE_D \
227 ( \
228 d, \
229 state, \
230 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
231 BOOST_PP_TUPLE_REPLACE_D \
232 ( \
233 d, \
234 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
235 BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
236 BOOST_VMD_DETAIL_MODS_RETURN_AFTER \
237 ) \
238 ) \
239 ) \
240 /**/
241
242 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT(d,state,id) \
243 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
244 ( \
245 d, \
246 BOOST_PP_TUPLE_REPLACE_D \
247 ( \
248 d, \
249 state, \
250 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
251 BOOST_PP_TUPLE_REPLACE_D \
252 ( \
253 d, \
254 BOOST_PP_TUPLE_REPLACE_D \
255 ( \
256 d, \
257 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
258 BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER, \
259 0 \
260 ), \
261 BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
262 BOOST_VMD_DETAIL_MODS_NO_AFTER \
263 ) \
264 ) \
265 ) \
266 /**/
267
268 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND(d,state,id) \
269 BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,BOOST_VMD_DETAIL_MODS_RETURN_INDEX) \
270 /**/
271
272 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND(d,state,id) \
273 BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,BOOST_VMD_DETAIL_MODS_NO_INDEX) \
274 /**/
275
276 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_REPLACE(d,state,id) \
277 BOOST_PP_TUPLE_REPLACE_D \
278 ( \
279 d, \
280 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
281 BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
282 BOOST_PP_VARIADIC_TO_TUPLE(id) \
283 ) \
284 /**/
285
286 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_ADD(d,state,id) \
287 BOOST_PP_TUPLE_REPLACE_D \
288 ( \
289 d, \
290 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
291 BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
292 BOOST_PP_TUPLE_PUSH_BACK \
293 ( \
294 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)), \
295 id \
296 ) \
297 ) \
298 /**/
299
300 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE(d,state,id) \
301 BOOST_PP_IIF \
302 ( \
303 BOOST_VMD_IS_EMPTY \
304 ( \
305 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
306 ), \
307 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_REPLACE, \
308 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_ADD \
309 ) \
310 (d,state,id) \
311 /**/
312
313 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE_RETURN(d,state,id) \
314 BOOST_PP_TUPLE_REPLACE_D \
315 ( \
316 d, \
317 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
318 BOOST_VMD_DETAIL_MODS_TUPLE_RETURN, \
319 BOOST_PP_IIF \
320 ( \
321 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,id,BOOST_VMD_TYPE_ARRAY), \
322 BOOST_VMD_DETAIL_MODS_RETURN_ARRAY, \
323 BOOST_PP_IIF \
324 ( \
325 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,id,BOOST_VMD_TYPE_LIST), \
326 BOOST_VMD_DETAIL_MODS_RETURN_LIST, \
327 BOOST_VMD_DETAIL_MODS_RETURN_TUPLE \
328 ) \
329 ) \
330 ) \
331 /**/
332
333 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE(d,state,id) \
334 BOOST_PP_TUPLE_REPLACE_D \
335 ( \
336 d, \
337 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE_RETURN(d,state,id), \
338 BOOST_VMD_DETAIL_MODS_TUPLE_TYPE, \
339 id \
340 ) \
341 /**/
342
343 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN(d,state,id) \
344 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
345 ( \
346 d, \
347 BOOST_PP_TUPLE_REPLACE_D \
348 ( \
349 d, \
350 state, \
351 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
352 BOOST_PP_IIF \
353 ( \
354 BOOST_PP_BITAND \
355 ( \
356 BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state), \
357 BOOST_VMD_IS_TYPE_D(d,id) \
358 ), \
359 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE, \
360 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE \
361 ) \
362 (d,state,id) \
363 ) \
364 ) \
365 /**/
366
367 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE(d,state) \
368 BOOST_PP_TUPLE_REPLACE_D \
369 ( \
370 d, \
371 state, \
372 BOOST_VMD_DETAIL_MODS_DATA_INDEX, \
373 BOOST_PP_INC(BOOST_VMD_DETAIL_MODS_STATE_INDEX(state)) \
374 ) \
375 /**/
376
377 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_ALL(d,state,id) \
378 BOOST_PP_IIF \
379 ( \
380 BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id), \
381 BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT, \
382 BOOST_PP_IIF \
383 ( \
384 BOOST_VMD_DETAIL_IS_RETURN_TYPE(id), \
385 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET, \
386 BOOST_PP_IIF \
387 ( \
388 BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id), \
389 BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA, \
390 BOOST_PP_IIF \
391 ( \
392 BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id), \
393 BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL, \
394 BOOST_PP_IIF \
395 ( \
396 BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id), \
397 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT, \
398 BOOST_PP_IIF \
399 ( \
400 BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
401 BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
402 BOOST_PP_IIF \
403 ( \
404 BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
405 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
406 BOOST_PP_IIF \
407 ( \
408 BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
409 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
410 BOOST_PP_IIF \
411 ( \
412 BOOST_VMD_DETAIL_IS_RETURN_INDEX(id), \
413 BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND, \
414 BOOST_PP_IIF \
415 ( \
416 BOOST_VMD_DETAIL_IS_RETURN_NO_INDEX(id), \
417 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND, \
418 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
419 ) \
420 ) \
421 ) \
422 ) \
423 ) \
424 ) \
425 ) \
426 ) \
427 ) \
428 ) \
429 (d,state,id) \
430 /**/
431
432 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_RETURN(d,state,id) \
433 BOOST_PP_IIF \
434 ( \
435 BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id), \
436 BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT, \
437 BOOST_PP_IIF \
438 ( \
439 BOOST_VMD_DETAIL_IS_RETURN_TYPE(id), \
440 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET, \
441 BOOST_PP_IIF \
442 ( \
443 BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id), \
444 BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA, \
445 BOOST_PP_IIF \
446 ( \
447 BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id), \
448 BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL, \
449 BOOST_PP_IIF \
450 ( \
451 BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id), \
452 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT, \
453 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
454 ) \
455 ) \
456 ) \
457 ) \
458 ) \
459 (d,state,id) \
460 /**/
461
462 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_AFTER(d,state,id) \
463 BOOST_PP_IIF \
464 ( \
465 BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
466 BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
467 BOOST_PP_IIF \
468 ( \
469 BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
470 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
471 BOOST_PP_IIF \
472 ( \
473 BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
474 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
475 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
476 ) \
477 ) \
478 ) \
479 (d,state,id) \
480 /**/
481
482 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_INDEX(d,state,id) \
483 BOOST_PP_IIF \
484 ( \
485 BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
486 BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
487 BOOST_PP_IIF \
488 ( \
489 BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
490 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
491 BOOST_PP_IIF \
492 ( \
493 BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
494 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
495 BOOST_PP_IIF \
496 ( \
497 BOOST_VMD_DETAIL_IS_RETURN_INDEX(id), \
498 BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND, \
499 BOOST_PP_IIF \
500 ( \
501 BOOST_VMD_DETAIL_IS_RETURN_NO_INDEX(id), \
502 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND, \
503 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
504 ) \
505 ) \
506 ) \
507 ) \
508 ) \
509 (d,state,id) \
510 /**/
511
512 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_UPDATE(d,state,id) \
513 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE(d,state) \
514 /**/
515
516 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ID(d,state,id) \
517 BOOST_PP_IIF \
518 ( \
519 BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state), \
520 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_ALL, \
521 BOOST_PP_IIF \
522 ( \
523 BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_RETURN(state), \
524 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_RETURN, \
525 BOOST_PP_IIF \
526 ( \
527 BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_AFTER(state), \
528 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_AFTER, \
529 BOOST_PP_IIF \
530 ( \
531 BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_INDEX(state), \
532 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_INDEX, \
533 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_UPDATE \
534 ) \
535 ) \
536 ) \
537 ) \
538 (d,state,id) \
539 /**/
540
541 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_TUPLE(d,state,id) \
542 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
543 ( \
544 d, \
545 BOOST_PP_TUPLE_REPLACE_D \
546 ( \
547 d, \
548 state, \
549 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
550 BOOST_PP_TUPLE_REPLACE_D \
551 ( \
552 d, \
553 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
554 BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
555 id \
556 ) \
557 ) \
558 ) \
559 /**/
560
561 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT(d,state,id) \
562 BOOST_PP_IIF \
563 ( \
564 BOOST_PP_IS_BEGIN_PARENS(id), \
565 BOOST_VMD_DETAIL_MODS_OP_CURRENT_TUPLE, \
566 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ID \
567 ) \
568 (d,state,id) \
569 /**/
570
571 #define BOOST_VMD_DETAIL_MODS_OP(d,state) \
572 BOOST_VMD_DETAIL_MODS_OP_CURRENT(d,state,BOOST_VMD_DETAIL_MODS_STATE_CURRENT(state)) \
573 /**/
574
575 #define BOOST_VMD_DETAIL_MODS_LOOP(allow,tuple) \
576 BOOST_PP_TUPLE_ELEM \
577 ( \
578 3, \
579 BOOST_PP_WHILE \
580 ( \
581 BOOST_VMD_DETAIL_MODS_PRED, \
582 BOOST_VMD_DETAIL_MODS_OP, \
583 ( \
584 tuple, \
585 0, \
586 BOOST_PP_TUPLE_SIZE(tuple), \
587 (0,0,0,,0,), \
588 allow \
589 ) \
590 ) \
591 ) \
592 /**/
593
594 #define BOOST_VMD_DETAIL_MODS_LOOP_D(d,allow,tuple) \
595 BOOST_PP_TUPLE_ELEM \
596 ( \
597 3, \
598 BOOST_PP_WHILE_ ## d \
599 ( \
600 BOOST_VMD_DETAIL_MODS_PRED, \
601 BOOST_VMD_DETAIL_MODS_OP, \
602 ( \
603 tuple, \
604 0, \
605 BOOST_PP_TUPLE_SIZE(tuple), \
606 (0,0,0,,0,), \
607 allow \
608 ) \
609 ) \
610 ) \
611 /**/
612
613 #define BOOST_VMD_DETAIL_NEW_MODS_VAR(allow,tuple) \
614 BOOST_VMD_DETAIL_MODS_LOOP \
615 ( \
616 allow, \
617 BOOST_PP_TUPLE_POP_FRONT(tuple) \
618 ) \
619 /**/
620
621 #define BOOST_VMD_DETAIL_NEW_MODS_VAR_D(d,allow,tuple) \
622 BOOST_VMD_DETAIL_MODS_LOOP_D \
623 ( \
624 d, \
625 allow, \
626 BOOST_PP_TUPLE_POP_FRONT(tuple) \
627 ) \
628 /**/
629
630 #define BOOST_VMD_DETAIL_NEW_MODS_IR(allow,tuple) \
631 BOOST_VMD_IDENTITY_RESULT \
632 ( \
633 BOOST_PP_IIF \
634 ( \
635 BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1), \
636 BOOST_VMD_IDENTITY((0,0,0,,0,)), \
637 BOOST_VMD_DETAIL_NEW_MODS_VAR \
638 ) \
639 (allow,tuple) \
640 ) \
641 /**/
642
643 #define BOOST_VMD_DETAIL_NEW_MODS_IR_D(d,allow,tuple) \
644 BOOST_VMD_IDENTITY_RESULT \
645 ( \
646 BOOST_PP_IIF \
647 ( \
648 BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(tuple),1), \
649 BOOST_VMD_IDENTITY((0,0,0,,0,)), \
650 BOOST_VMD_DETAIL_NEW_MODS_VAR_D \
651 ) \
652 (d,allow,tuple) \
653 ) \
654 /**/
655
656 /*
657
658 Returns a six-element tuple:
659
660 First tuple element = 0 No type return
661 1 Exact type return
662 2 General tuple type return
663 3 Array return
664 4 List return
665
666 Second tuple element = 0 No after return
667 1 After return
668
669 Third tuple element = 0 No identifier index
670 1 Identifier Index
671
672 Fourth tuple element = Tuple of other identifiers
673
674 Fifth tuple element = 0 No after only return
675 1 After only return
676
677 Sixth tuple element = Type identifier
678
679 Input = allow, either
680 BOOST_VMD_ALLOW_ALL
681 BOOST_VMD_ALLOW_RETURN
682 BOOST_VMD_ALLOW_AFTER
683 BOOST_VMD_ALLOW_INDEX
684
685 ..., modifiers, first variadic is discarded
686 Possible modifiers are:
687
688 BOOST_VMD_RETURN_NO_TYPE = (0,0)
689 BOOST_VMD_RETURN_TYPE = (1,0)
690 BOOST_VMD_RETURN_TYPE_TUPLE = (2,0)
691 BOOST_VMD_RETURN_TYPE_ARRAY = (3,0)
692 BOOST_VMD_RETURN_TYPE_LIST = (4,0)
693
694 BOOST_VMD_RETURN_NO_AFTER = (0,0)
695 BOOST_VMD_RETURN_AFTER = (0,1)
696
697 */
698
699 #define BOOST_VMD_DETAIL_NEW_MODS(allow,...) \
700 BOOST_VMD_DETAIL_NEW_MODS_IR(allow,BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) \
701 /**/
702
703 #define BOOST_VMD_DETAIL_NEW_MODS_D(d,allow,...) \
704 BOOST_VMD_DETAIL_NEW_MODS_IR_D(d,allow,BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) \
705 /**/
706
707 #endif /* BOOST_VMD_DETAIL_MODS_HPP */