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).
7 #if !defined(BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP)
8 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP
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>
39 Given modifications and the requested type,
40 determine whether or not we should be checking for specific identifiers
42 1 = check for specific identifiers
43 0 = do no check for specific identifiers
47 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS(nm,type) \
50 BOOST_VMD_DETAIL_EQUAL_TYPE \
53 BOOST_VMD_TYPE_IDENTIFIER \
55 BOOST_VMD_DETAIL_NOT_EMPTY \
57 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
62 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS_D(d,nm,type) \
65 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
69 BOOST_VMD_TYPE_IDENTIFIER \
71 BOOST_VMD_DETAIL_NOT_EMPTY \
73 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
80 Given modifications, determine whether or not an index should be part of the result
82 1 = index should be part of the result
83 0 = index should not be part of the result
87 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT(nm) \
90 BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
93 BOOST_VMD_DETAIL_EQUAL_TYPE \
95 BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm), \
96 BOOST_VMD_TYPE_IDENTIFIER \
98 BOOST_VMD_DETAIL_NOT_EMPTY \
100 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
106 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT_D(d,nm) \
109 BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
112 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
115 BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm), \
116 BOOST_VMD_TYPE_IDENTIFIER \
118 BOOST_VMD_DETAIL_NOT_EMPTY \
120 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
126 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_INDEX(nm) \
129 BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(nm), \
135 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_NO_INDEX(nm) \
138 BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(nm), \
145 Returns a failure result given the modifications
149 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
150 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN \
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 \
162 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
163 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN \
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 \
175 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_TUPLE(res) \
176 BOOST_PP_TUPLE_ELEM \
179 BOOST_PP_TUPLE_ELEM(0,res) \
183 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_ONLY(res) \
184 BOOST_PP_TUPLE_ELEM(0,res) \
187 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_TUPLE(res) \
188 BOOST_PP_TUPLE_ELEM \
191 BOOST_PP_TUPLE_ELEM(0,res) \
195 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_ONLY(res) \
196 BOOST_PP_TUPLE_ELEM(1,res) \
201 Gets the 'data' of the result given the result and modifications
205 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm) \
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 \
215 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm) \
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 \
227 Gets the 'type' of the result given the result and modifications
231 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE(res,nm) \
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 \
241 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_D(d,res,nm) \
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 \
251 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE(res) \
254 BOOST_PP_TUPLE_ELEM(0,res) \
260 Determines whether the result from the element access has failed or not
262 returns 1 if it has failed, otherwise 0.
266 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED(res,nm) \
269 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
270 BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE, \
276 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_D(d,res,nm) \
279 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
280 BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE, \
286 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM(seq,elem) \
289 BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE(seq),elem), \
296 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM_D(d,seq,elem) \
299 BOOST_PP_GREATER_D(d,BOOST_PP_SEQ_SIZE(seq),elem), \
306 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_RES(data,elem) \
308 BOOST_PP_SEQ_ELEM(elem,BOOST_PP_TUPLE_ELEM(0,data)), \
309 BOOST_PP_TUPLE_ELEM(1,data) \
313 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM(data,elem) \
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 \
323 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_D(d,data,elem) \
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 \
333 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY(seq,elem) \
336 BOOST_VMD_IS_EMPTY(seq), \
338 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM \
343 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_D(d,seq,elem) \
346 BOOST_VMD_IS_EMPTY(seq), \
348 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM_D \
353 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER(data,elem) \
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 \
363 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_D(d,data,elem) \
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 \
373 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ(seq,elem,nm) \
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 \
383 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_D(d,seq,elem,nm) \
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 \
393 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(...) \
394 BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__) \
397 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS(elem,vseq,nm) \
398 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ \
400 BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
404 BOOST_VMD_TYPE_SEQ, \
412 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS_D(d,elem,vseq,nm) \
413 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_D \
416 BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
421 BOOST_VMD_TYPE_SEQ, \
429 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY(elem,vseq,nm) \
432 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
437 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY_D(d,elem,vseq,nm) \
440 BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
445 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE(elem,vseq,nm) \
448 BOOST_VMD_DETAIL_NOT_EMPTY(vseq), \
449 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS, \
450 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY \
455 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE_D(d,elem,vseq,nm) \
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 \
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) \
469 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN(res,nm,type) \
470 BOOST_VMD_IDENTITY_RESULT \
474 BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(nm), \
475 BOOST_PP_TUPLE_ELEM, \
476 BOOST_VMD_IDENTITY(res) \
482 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_INDEX_JRES(data,index) \
486 (data,BOOST_PP_DEC(index)), \
491 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_JRES(data,index) \
499 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH(data,nm,index) \
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 \
509 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP(data,nm) \
510 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH \
514 BOOST_VMD_DETAIL_MATCH_IDENTIFIER \
517 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
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 \
527 BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D \
531 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
536 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID(data,nm,type) \
537 BOOST_VMD_IDENTITY_RESULT \
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) \
549 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_D(d,data,nm,type) \
550 BOOST_VMD_IDENTITY_RESULT \
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) \
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 \
565 BOOST_PP_TUPLE_ELEM(1,res), \
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 \
575 BOOST_PP_TUPLE_ELEM(1,res), \
581 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE(res,nm,type) \
582 BOOST_PP_TUPLE_REPLACE \
586 BOOST_PP_TUPLE_ELEM \
589 BOOST_PP_TUPLE_ELEM(0,res) \
594 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE_D(d,res,nm,type) \
595 BOOST_PP_TUPLE_REPLACE_D \
600 BOOST_PP_TUPLE_ELEM \
603 BOOST_PP_TUPLE_ELEM(0,res) \
608 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER(res,nm,type) \
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 \
618 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D(d,res,nm,type) \
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 \
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 \
631 BOOST_PP_TUPLE_PUSH_BACK(res,BOOST_PP_DEC(index)), \
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 \
641 BOOST_PP_TUPLE_PUSH_BACK(res,BOOST_PP_DEC(index)), \
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) \
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) \
655 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES(res,nm,type,index) \
659 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS, \
660 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE \
662 (res,nm,type,index) \
665 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES_D(d,res,nm,type,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 \
672 (d,res,nm,type,index) \
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) \
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) \
683 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES(res,nm,type,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 \
693 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_D(d,res,nm,type,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 \
703 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES(res,nm,type,index) \
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 \
710 (res,nm,type,index) \
713 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES_D(d,res,nm,type,index) \
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 \
720 (d,res,nm,type,index) \
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 \
729 BOOST_VMD_DETAIL_MATCH_IDENTIFIER \
731 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm), \
732 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
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 \
744 BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D \
747 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm), \
748 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
753 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT(res,nm,type) \
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 \
763 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_D(d,res,nm,type) \
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 \
773 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK(res,nm,type) \
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 \
783 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_D(d,res,nm,type) \
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 \
793 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED(res,nm,type) \
794 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
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) \
801 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID(res,nm,type) \
802 BOOST_VMD_IS_IDENTIFIER \
804 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm) \
808 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID_D(d,res,nm,type) \
809 BOOST_VMD_IS_IDENTIFIER_D \
812 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm) \
816 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER(res,nm,type) \
817 BOOST_VMD_DETAIL_EQUAL_TYPE \
819 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE(res,nm), \
824 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER_D(d,res,nm,type) \
825 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
828 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_D(d,res,nm), \
833 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE(res,nm,type) \
836 BOOST_VMD_DETAIL_EQUAL_TYPE \
838 BOOST_VMD_TYPE_IDENTIFIER, \
841 BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID, \
842 BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER \
847 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_D(d,res,nm,type) \
850 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
853 BOOST_VMD_TYPE_IDENTIFIER, \
856 BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID_D, \
857 BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER_D \
862 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT(res,nm,type) \
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 \
872 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_D(d,res,nm,type) \
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 \
882 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF(res,nm,type) \
885 BOOST_VMD_IS_EMPTY(type), \
886 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN, \
887 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT \
892 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF_D(d,res,nm,type) \
895 BOOST_VMD_IS_EMPTY(type), \
896 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN_D, \
897 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_D \
902 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED(res,nm,type) \
903 BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
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) \
910 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE(res,nm,type) \
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 \
920 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_D(d,res,nm,type) \
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 \
930 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA(res,nm) \
931 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE \
935 BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm) \
939 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA_D(d,res,nm) \
940 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_D \
945 BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm) \
949 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM(elem,vseq,nm) \
950 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA \
952 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE(elem,vseq,nm), \
957 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_D(d,elem,vseq,nm) \
958 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA_D \
961 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE_D(d,elem,vseq,nm), \
966 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM(allow,elem,...) \
967 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM \
970 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
971 BOOST_VMD_DETAIL_NEW_MODS(allow,__VA_ARGS__) \
975 #define BOOST_VMD_DETAIL_SEQUENCE_ELEM_D(d,allow,elem,...) \
976 BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_D \
980 BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
981 BOOST_VMD_DETAIL_NEW_MODS_D(d,allow,__VA_ARGS__) \
985 #endif /* BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP */