]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/vmd/detail/sequence_elem.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / vmd / detail / sequence_elem.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_SEQUENCE_ELEM_HPP)
8 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP
9
10 #include <boost/preprocessor/arithmetic/dec.hpp>
11 #include <boost/preprocessor/comparison/greater.hpp>
12 #include <boost/preprocessor/control/expr_if.hpp>
13 #include <boost/preprocessor/control/expr_iif.hpp>
14 #include <boost/preprocessor/control/if.hpp>
15 #include <boost/preprocessor/control/iif.hpp>
16 #include <boost/preprocessor/logical/bitand.hpp>
17 #include <boost/preprocessor/logical/bitor.hpp>
18 #include <boost/preprocessor/logical/compl.hpp>
19 #include <boost/preprocessor/seq/elem.hpp>
20 #include <boost/preprocessor/seq/size.hpp>
21 #include <boost/preprocessor/tuple/elem.hpp>
22 #include <boost/preprocessor/tuple/push_back.hpp>
23 #include <boost/preprocessor/tuple/replace.hpp>
24 #include <boost/preprocessor/variadic/elem.hpp>
25 #include <boost/vmd/empty.hpp>
26 #include <boost/vmd/identity.hpp>
27 #include <boost/vmd/is_empty.hpp>
28 #include <boost/vmd/is_identifier.hpp>
29 #include <boost/vmd/detail/empty_result.hpp>
30 #include <boost/vmd/detail/equal_type.hpp>
31 #include <boost/vmd/detail/match_identifier.hpp>
32 #include <boost/vmd/detail/mods.hpp>
33 #include <boost/vmd/detail/not_empty.hpp>
34 #include <boost/vmd/detail/only_after.hpp>
35 #include <boost/vmd/detail/sequence_common.hpp>
36
37 /*
38
39 Given modifications and the requested type,
40 determine whether or not we should be checking for specific identifiers
41
42 1 = check for specific identifiers
43 0 = do no check for specific identifiers
44
45 */
46
47 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS(nm,type) \
48 BOOST_PP_BITAND \
49 ( \
50 BOOST_VMD_DETAIL_EQUAL_TYPE \
51 ( \
52 type, \
53 BOOST_VMD_TYPE_IDENTIFIER \
54 ), \
55 BOOST_VMD_DETAIL_NOT_EMPTY \
56 ( \
57 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
58 ) \
59 ) \
60 /**/
61
62 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS_D(d,nm,type) \
63 BOOST_PP_BITAND \
64 ( \
65 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
66 ( \
67 d, \
68 type, \
69 BOOST_VMD_TYPE_IDENTIFIER \
70 ), \
71 BOOST_VMD_DETAIL_NOT_EMPTY \
72 ( \
73 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
74 ) \
75 ) \
76 /**/
77
78 /*
79
80 Given modifications, determine whether or not an index should be part of the result
81
82 1 = index should be part of the result
83 0 = index should not be part of the result
84
85 */
86
87 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT(nm) \
88 BOOST_PP_BITAND \
89 ( \
90 BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
91 BOOST_PP_BITAND \
92 ( \
93 BOOST_VMD_DETAIL_EQUAL_TYPE \
94 ( \
95 BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm), \
96 BOOST_VMD_TYPE_IDENTIFIER \
97 ), \
98 BOOST_VMD_DETAIL_NOT_EMPTY \
99 ( \
100 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
101 ) \
102 ) \
103 ) \
104 /**/
105
106 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT_D(d,nm) \
107 BOOST_PP_BITAND \
108 ( \
109 BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
110 BOOST_PP_BITAND \
111 ( \
112 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
113 ( \
114 d, \
115 BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm), \
116 BOOST_VMD_TYPE_IDENTIFIER \
117 ), \
118 BOOST_VMD_DETAIL_NOT_EMPTY \
119 ( \
120 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
121 ) \
122 ) \
123 ) \
124 /**/
125
126 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_INDEX(nm) \
127 BOOST_PP_IIF \
128 ( \
129 BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(nm), \
130 (,,), \
131 (,) \
132 ) \
133 /**/
134
135 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_NO_INDEX(nm) \
136 BOOST_PP_EXPR_IIF \
137 ( \
138 BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(nm), \
139 (,) \
140 ) \
141 /**/
142
143 /*
144
145 Returns a failure result given the modifications
146
147 */
148
149 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
150 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN \
151 ( \
152 BOOST_PP_IIF \
153 ( \
154 BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT(nm), \
155 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_INDEX, \
156 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_NO_INDEX \
157 ) \
158 (nm),nm, \
159 ) \
160 /**/
161
162 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
163 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN \
164 ( \
165 BOOST_PP_IIF \
166 ( \
167 BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT_D(d,nm), \
168 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_INDEX, \
169 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_NO_INDEX \
170 ) \
171 (nm),nm, \
172 ) \
173 /**/
174
175 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_TUPLE(res) \
176 BOOST_PP_TUPLE_ELEM \
177 ( \
178 0, \
179 BOOST_PP_TUPLE_ELEM(0,res) \
180 ) \
181 /**/
182
183 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_ONLY(res) \
184 BOOST_PP_TUPLE_ELEM(0,res) \
185 /**/
186
187 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_TUPLE(res) \
188 BOOST_PP_TUPLE_ELEM \
189 ( \
190 1, \
191 BOOST_PP_TUPLE_ELEM(0,res) \
192 ) \
193 /**/
194
195 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_ONLY(res) \
196 BOOST_PP_TUPLE_ELEM(1,res) \
197 /**/
198
199 /*
200
201 Gets the 'data' of the result given the result and modifications
202
203 */
204
205 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm) \
206 BOOST_PP_IIF \
207 ( \
208 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
209 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_TUPLE, \
210 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_ONLY \
211 ) \
212 (res) \
213 /**/
214
215 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm) \
216 BOOST_PP_IIF \
217 ( \
218 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
219 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_TUPLE, \
220 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_ONLY \
221 ) \
222 (res) \
223 /**/
224
225 /*
226
227 Gets the 'type' of the result given the result and modifications
228
229 */
230
231 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE(res,nm) \
232 BOOST_PP_IIF \
233 ( \
234 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
235 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_TUPLE, \
236 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_ONLY \
237 ) \
238 (res) \
239 /**/
240
241 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_D(d,res,nm) \
242 BOOST_PP_IIF \
243 ( \
244 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
245 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_TUPLE, \
246 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_ONLY \
247 ) \
248 (res) \
249 /**/
250
251 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE(res) \
252 BOOST_VMD_IS_EMPTY \
253 ( \
254 BOOST_PP_TUPLE_ELEM(0,res) \
255 ) \
256 /**/
257
258 /*
259
260 Determines whether the result from the element access has failed or not
261
262 returns 1 if it has failed, otherwise 0.
263
264 */
265
266 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED(res,nm) \
267 BOOST_PP_IIF \
268 ( \
269 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
270 BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE, \
271 BOOST_VMD_IS_EMPTY \
272 ) \
273 (res) \
274 /**/
275
276 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_D(d,res,nm) \
277 BOOST_PP_IIF \
278 ( \
279 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
280 BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE, \
281 BOOST_VMD_IS_EMPTY \
282 ) \
283 (res) \
284 /**/
285
286 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM(seq,elem) \
287 BOOST_PP_IIF \
288 ( \
289 BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE(seq),elem), \
290 BOOST_PP_SEQ_ELEM, \
291 BOOST_VMD_EMPTY \
292 ) \
293 (elem,seq) \
294 /**/
295
296 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM_D(d,seq,elem) \
297 BOOST_PP_IIF \
298 ( \
299 BOOST_PP_GREATER_D(d,BOOST_PP_SEQ_SIZE(seq),elem), \
300 BOOST_PP_SEQ_ELEM, \
301 BOOST_VMD_EMPTY \
302 ) \
303 (elem,seq) \
304 /**/
305
306 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_RES(data,elem) \
307 ( \
308 BOOST_PP_SEQ_ELEM(elem,BOOST_PP_TUPLE_ELEM(0,data)), \
309 BOOST_PP_TUPLE_ELEM(1,data) \
310 ) \
311 /**/
312
313 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM(data,elem) \
314 BOOST_PP_IIF \
315 ( \
316 BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(0,data)),elem), \
317 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_RES, \
318 BOOST_VMD_DETAIL_EMPTY_RESULT \
319 ) \
320 (data,elem) \
321 /**/
322
323 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_D(d,data,elem) \
324 BOOST_PP_IIF \
325 ( \
326 BOOST_PP_GREATER_D(d,BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(0,data)),elem), \
327 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_RES, \
328 BOOST_VMD_DETAIL_EMPTY_RESULT \
329 ) \
330 (data,elem) \
331 /**/
332
333 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY(seq,elem) \
334 BOOST_PP_IIF \
335 ( \
336 BOOST_VMD_IS_EMPTY(seq), \
337 BOOST_VMD_EMPTY, \
338 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM \
339 ) \
340 (seq,elem) \
341 /**/
342
343 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_D(d,seq,elem) \
344 BOOST_PP_IIF \
345 ( \
346 BOOST_VMD_IS_EMPTY(seq), \
347 BOOST_VMD_EMPTY, \
348 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM_D \
349 ) \
350 (d,seq,elem) \
351 /**/
352
353 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER(data,elem) \
354 BOOST_PP_IIF \
355 ( \
356 BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,data)), \
357 BOOST_VMD_DETAIL_EMPTY_RESULT, \
358 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM \
359 ) \
360 (data,elem) \
361 /**/
362
363 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_D(d,data,elem) \
364 BOOST_PP_IIF \
365 ( \
366 BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,data)), \
367 BOOST_VMD_DETAIL_EMPTY_RESULT, \
368 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_D \
369 ) \
370 (d,data,elem) \
371 /**/
372
373 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ(seq,elem,nm) \
374 BOOST_PP_IIF \
375 ( \
376 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
377 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER, \
378 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY \
379 ) \
380 (seq,elem) \
381 /**/
382
383 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_D(d,seq,elem,nm) \
384 BOOST_PP_IIF \
385 ( \
386 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
387 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_D, \
388 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_D \
389 ) \
390 (d,seq,elem) \
391 /**/
392
393 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(...) \
394 BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__) \
395 /**/
396
397 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS(elem,vseq,nm) \
398 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ \
399 ( \
400 BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
401 ( \
402 vseq, \
403 elem, \
404 BOOST_VMD_TYPE_SEQ, \
405 nm \
406 ), \
407 elem, \
408 nm \
409 ) \
410 /**/
411
412 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS_D(d,elem,vseq,nm) \
413 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_D \
414 ( \
415 d, \
416 BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
417 ( \
418 d, \
419 vseq, \
420 elem, \
421 BOOST_VMD_TYPE_SEQ, \
422 nm \
423 ), \
424 elem, \
425 nm \
426 ) \
427 /**/
428
429 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY(elem,vseq,nm) \
430 BOOST_PP_EXPR_IIF \
431 ( \
432 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
433 (,) \
434 ) \
435 /**/
436
437 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY_D(d,elem,vseq,nm) \
438 BOOST_PP_EXPR_IIF \
439 ( \
440 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
441 (,) \
442 ) \
443 /**/
444
445 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE(elem,vseq,nm) \
446 BOOST_PP_IIF \
447 ( \
448 BOOST_VMD_DETAIL_NOT_EMPTY(vseq), \
449 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS, \
450 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY \
451 ) \
452 (elem,vseq,nm) \
453 /**/
454
455 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE_D(d,elem,vseq,nm) \
456 BOOST_PP_IIF \
457 ( \
458 BOOST_VMD_DETAIL_NOT_EMPTY(vseq), \
459 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS_D, \
460 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY_D \
461 ) \
462 (d,elem,vseq,nm) \
463 /**/
464
465 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN_D(d,res,nm,type) \
466 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN(res,nm,type) \
467 /**/
468
469 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN(res,nm,type) \
470 BOOST_VMD_IDENTITY_RESULT \
471 ( \
472 BOOST_PP_IIF \
473 ( \
474 BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(nm), \
475 BOOST_PP_TUPLE_ELEM, \
476 BOOST_VMD_IDENTITY(res) \
477 ) \
478 (1,res) \
479 ) \
480 /**/
481
482 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_INDEX_JRES(data,index) \
483 BOOST_PP_IF \
484 ( \
485 index, \
486 (data,BOOST_PP_DEC(index)), \
487 (,) \
488 ) \
489 /**/
490
491 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_JRES(data,index) \
492 BOOST_PP_EXPR_IF \
493 ( \
494 index, \
495 data \
496 ) \
497 /**/
498
499 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH(data,nm,index) \
500 BOOST_PP_IIF \
501 ( \
502 BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
503 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_INDEX_JRES, \
504 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_JRES \
505 ) \
506 (data,index) \
507 /**/
508
509 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP(data,nm) \
510 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH \
511 ( \
512 data, \
513 nm, \
514 BOOST_VMD_DETAIL_MATCH_IDENTIFIER \
515 ( \
516 data, \
517 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
518 ) \
519 ) \
520 /**/
521
522 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP_D(d,data,nm) \
523 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH \
524 ( \
525 data, \
526 nm, \
527 BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D \
528 ( \
529 d, \
530 data, \
531 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
532 ) \
533 ) \
534 /**/
535
536 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID(data,nm,type) \
537 BOOST_VMD_IDENTITY_RESULT \
538 ( \
539 BOOST_PP_IIF \
540 ( \
541 BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS(nm,type), \
542 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP, \
543 BOOST_VMD_IDENTITY(data) \
544 ) \
545 (data,nm) \
546 ) \
547 /**/
548
549 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_D(d,data,nm,type) \
550 BOOST_VMD_IDENTITY_RESULT \
551 ( \
552 BOOST_PP_IIF \
553 ( \
554 BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS_D(d,nm,type), \
555 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP_D, \
556 BOOST_VMD_IDENTITY(data) \
557 ) \
558 (d,data,nm) \
559 ) \
560 /**/
561
562 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY(res,nm,type) \
563 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID \
564 ( \
565 BOOST_PP_TUPLE_ELEM(1,res), \
566 nm, \
567 type \
568 ) \
569 /**/
570
571 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_D(d,res,nm,type) \
572 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_D \
573 ( \
574 d, \
575 BOOST_PP_TUPLE_ELEM(1,res), \
576 nm, \
577 type \
578 ) \
579 /**/
580
581 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE(res,nm,type) \
582 BOOST_PP_TUPLE_REPLACE \
583 ( \
584 res, \
585 0, \
586 BOOST_PP_TUPLE_ELEM \
587 ( \
588 1, \
589 BOOST_PP_TUPLE_ELEM(0,res) \
590 ) \
591 ) \
592 /**/
593
594 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE_D(d,res,nm,type) \
595 BOOST_PP_TUPLE_REPLACE_D \
596 ( \
597 d, \
598 res, \
599 0, \
600 BOOST_PP_TUPLE_ELEM \
601 ( \
602 1, \
603 BOOST_PP_TUPLE_ELEM(0,res) \
604 ) \
605 ) \
606 /**/
607
608 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER(res,nm,type) \
609 BOOST_PP_IIF \
610 ( \
611 BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(nm), \
612 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN, \
613 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE \
614 ) \
615 (res,nm,type) \
616 /**/
617
618 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D(d,res,nm,type) \
619 BOOST_PP_IIF \
620 ( \
621 BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(nm), \
622 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN_D, \
623 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE_D \
624 ) \
625 (d,res,nm,type) \
626 /**/
627
628 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS(res,nm,type,index) \
629 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER \
630 ( \
631 BOOST_PP_TUPLE_PUSH_BACK(res,BOOST_PP_DEC(index)), \
632 nm, \
633 type \
634 ) \
635 /**/
636
637 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS_D(d,res,nm,type,index) \
638 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D \
639 ( \
640 d, \
641 BOOST_PP_TUPLE_PUSH_BACK(res,BOOST_PP_DEC(index)), \
642 nm, \
643 type \
644 ) \
645 /**/
646
647 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE(res,nm,type,index) \
648 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
649 /**/
650
651 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE_D(d,res,nm,type,index) \
652 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
653 /**/
654
655 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES(res,nm,type,index) \
656 BOOST_PP_IF \
657 ( \
658 index, \
659 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS, \
660 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE \
661 ) \
662 (res,nm,type,index) \
663 /**/
664
665 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES_D(d,res,nm,type,index) \
666 BOOST_PP_IF \
667 ( \
668 index, \
669 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS_D, \
670 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE_D \
671 ) \
672 (d,res,nm,type,index) \
673 /**/
674
675 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE(res,nm,type) \
676 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
677 /**/
678
679 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE_D(d,res,nm,type) \
680 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
681 /**/
682
683 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES(res,nm,type,index) \
684 BOOST_PP_IF \
685 ( \
686 index, \
687 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER, \
688 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE \
689 ) \
690 (res,nm,type) \
691 /**/
692
693 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_D(d,res,nm,type,index) \
694 BOOST_PP_IF \
695 ( \
696 index, \
697 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D, \
698 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE_D \
699 ) \
700 (d,res,nm,type) \
701 /**/
702
703 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES(res,nm,type,index) \
704 BOOST_PP_IIF \
705 ( \
706 BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
707 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES, \
708 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES \
709 ) \
710 (res,nm,type,index) \
711 /**/
712
713 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES_D(d,res,nm,type,index) \
714 BOOST_PP_IIF \
715 ( \
716 BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
717 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES_D, \
718 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_D \
719 ) \
720 (d,res,nm,type,index) \
721 /**/
722
723 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID(res,nm,type) \
724 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES \
725 ( \
726 res, \
727 nm, \
728 type, \
729 BOOST_VMD_DETAIL_MATCH_IDENTIFIER \
730 ( \
731 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm), \
732 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
733 ) \
734 ) \
735 /**/
736
737 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_D(d,res,nm,type) \
738 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES_D \
739 ( \
740 d, \
741 res, \
742 nm, \
743 type, \
744 BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D \
745 ( \
746 d, \
747 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm), \
748 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
749 ) \
750 ) \
751 /**/
752
753 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT(res,nm,type) \
754 BOOST_PP_IIF \
755 ( \
756 BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS(nm,type), \
757 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID, \
758 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER \
759 ) \
760 (res,nm,type) \
761 /**/
762
763 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_D(d,res,nm,type) \
764 BOOST_PP_IIF \
765 ( \
766 BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS_D(d,nm,type), \
767 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_D, \
768 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D \
769 ) \
770 (d,res,nm,type) \
771 /**/
772
773 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK(res,nm,type) \
774 BOOST_PP_IIF \
775 ( \
776 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
777 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT, \
778 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY \
779 ) \
780 (res,nm,type) \
781 /**/
782
783 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_D(d,res,nm,type) \
784 BOOST_PP_IIF \
785 ( \
786 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
787 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_D, \
788 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_D \
789 ) \
790 (d,res,nm,type) \
791 /**/
792
793 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED(res,nm,type) \
794 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
795 /**/
796
797 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED_D(d,res,nm,type) \
798 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
799 /**/
800
801 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID(res,nm,type) \
802 BOOST_VMD_IS_IDENTIFIER \
803 ( \
804 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm) \
805 ) \
806 /**/
807
808 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID_D(d,res,nm,type) \
809 BOOST_VMD_IS_IDENTIFIER_D \
810 ( \
811 d, \
812 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm) \
813 ) \
814 /**/
815
816 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER(res,nm,type) \
817 BOOST_VMD_DETAIL_EQUAL_TYPE \
818 ( \
819 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE(res,nm), \
820 type \
821 ) \
822 /**/
823
824 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER_D(d,res,nm,type) \
825 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
826 ( \
827 d, \
828 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_D(d,res,nm), \
829 type \
830 ) \
831 /**/
832
833 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE(res,nm,type) \
834 BOOST_PP_IIF \
835 ( \
836 BOOST_VMD_DETAIL_EQUAL_TYPE \
837 ( \
838 BOOST_VMD_TYPE_IDENTIFIER, \
839 type \
840 ), \
841 BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID, \
842 BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER \
843 ) \
844 (res,nm,type) \
845 /**/
846
847 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_D(d,res,nm,type) \
848 BOOST_PP_IIF \
849 ( \
850 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
851 ( \
852 d, \
853 BOOST_VMD_TYPE_IDENTIFIER, \
854 type \
855 ), \
856 BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID_D, \
857 BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER_D \
858 ) \
859 (d,res,nm,type) \
860 /**/
861
862 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT(res,nm,type) \
863 BOOST_PP_IIF \
864 ( \
865 BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE(res,nm,type), \
866 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK, \
867 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED \
868 ) \
869 (res,nm,type) \
870 /**/
871
872 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_D(d,res,nm,type) \
873 BOOST_PP_IIF \
874 ( \
875 BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_D(d,res,nm,type), \
876 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_D, \
877 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED_D \
878 ) \
879 (d,res,nm,type) \
880 /**/
881
882 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF(res,nm,type) \
883 BOOST_PP_IIF \
884 ( \
885 BOOST_VMD_IS_EMPTY(type), \
886 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN, \
887 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT \
888 ) \
889 (res,nm,type) \
890 /**/
891
892 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF_D(d,res,nm,type) \
893 BOOST_PP_IIF \
894 ( \
895 BOOST_VMD_IS_EMPTY(type), \
896 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN_D, \
897 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_D \
898 ) \
899 (d,res,nm,type) \
900 /**/
901
902 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED(res,nm,type) \
903 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
904 /**/
905
906 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED_D(d,res,nm,type) \
907 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
908 /**/
909
910 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE(res,nm,type) \
911 BOOST_PP_IIF \
912 ( \
913 BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED(res,nm), \
914 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED, \
915 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF \
916 ) \
917 (res,nm,type) \
918 /**/
919
920 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_D(d,res,nm,type) \
921 BOOST_PP_IIF \
922 ( \
923 BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_D(d,res,nm), \
924 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED_D, \
925 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF_D \
926 ) \
927 (d,res,nm,type) \
928 /**/
929
930 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA(res,nm) \
931 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE \
932 ( \
933 res, \
934 nm, \
935 BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm) \
936 ) \
937 /**/
938
939 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA_D(d,res,nm) \
940 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_D \
941 ( \
942 d, \
943 res, \
944 nm, \
945 BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm) \
946 ) \
947 /**/
948
949 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM(elem,vseq,nm) \
950 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA \
951 ( \
952 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE(elem,vseq,nm), \
953 nm \
954 ) \
955 /**/
956
957 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_D(d,elem,vseq,nm) \
958 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA_D \
959 ( \
960 d, \
961 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE_D(d,elem,vseq,nm), \
962 nm \
963 ) \
964 /**/
965
966 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM(allow,elem,...) \
967 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM \
968 ( \
969 elem, \
970 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
971 BOOST_VMD_DETAIL_NEW_MODS(allow,__VA_ARGS__) \
972 ) \
973 /**/
974
975 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_D(d,allow,elem,...) \
976 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_D \
977 ( \
978 d, \
979 elem, \
980 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
981 BOOST_VMD_DETAIL_NEW_MODS_D(d,allow,__VA_ARGS__) \
982 ) \
983 /**/
984
985 #endif /* BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP */