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 */
986