]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/vmd/include/boost/vmd/detail/mods.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / vmd / include / boost / vmd / detail / mods.hpp
CommitLineData
7c673cae
FG
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 */